mirror of https://github.com/ErsatzTV/ErsatzTV.git
7 changed files with 119 additions and 0 deletions
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.Maintenance.Commands |
||||
{ |
||||
public record DeleteOrphanedArtwork : MediatR.IRequest<Either<BaseError, Unit>>, IBackgroundServiceRequest; |
||||
} |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
using static LanguageExt.Prelude; |
||||
|
||||
namespace ErsatzTV.Application.Maintenance.Commands |
||||
{ |
||||
public class DeleteOrphanedArtworkHandler : MediatR.IRequestHandler<DeleteOrphanedArtwork, Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IArtworkRepository _artworkRepository; |
||||
|
||||
public DeleteOrphanedArtworkHandler(IArtworkRepository artworkRepository) => |
||||
_artworkRepository = artworkRepository; |
||||
|
||||
public Task<Either<BaseError, Unit>> |
||||
Handle(DeleteOrphanedArtwork request, CancellationToken cancellationToken) => |
||||
_artworkRepository.GetOrphanedArtwork() |
||||
.Bind(_artworkRepository.Delete) |
||||
.Map(_ => Right<BaseError, Unit>(Unit.Default)); |
||||
} |
||||
} |
||||
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core.Domain; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Core.Interfaces.Repositories |
||||
{ |
||||
public interface IArtworkRepository |
||||
{ |
||||
Task<List<Artwork>> GetOrphanedArtwork(); |
||||
Task<Unit> Delete(List<Artwork> artwork); |
||||
} |
||||
} |
||||
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
using System.Collections.Generic; |
||||
using System.Data; |
||||
using System.Linq; |
||||
using System.Threading.Tasks; |
||||
using Dapper; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Repositories |
||||
{ |
||||
public class ArtworkRepository : IArtworkRepository |
||||
{ |
||||
private readonly IDbConnection _dbConnection; |
||||
|
||||
public ArtworkRepository(IDbConnection dbConnection) => _dbConnection = dbConnection; |
||||
|
||||
public Task<List<Artwork>> GetOrphanedArtwork() => |
||||
_dbConnection.QueryAsync<Artwork>( |
||||
@"SELECT Artwork.Id, Artwork.Path FROM Artwork
|
||||
LEFT OUTER JOIN Actor A on Artwork.Id = A.ArtworkId |
||||
LEFT OUTER JOIN ArtistMetadata AM on A.ArtistMetadataId = AM.Id |
||||
LEFT OUTER JOIN EpisodeMetadata EM on A.EpisodeMetadataId = EM.Id |
||||
LEFT OUTER JOIN SeasonMetadata SM on A.SeasonMetadataId = SM.Id |
||||
LEFT OUTER JOIN ShowMetadata S on A.ShowMetadataId = S.Id |
||||
LEFT OUTER JOIN MovieMetadata MM on A.MovieMetadataId = MM.Id |
||||
LEFT OUTER JOIN MusicVideoMetadata MVM on A.MusicVideoMetadataId = MVM.Id |
||||
WHERE A.Id IS NULL AND AM.Id IS NULL AND EM.Id IS NULL AND SM.Id IS NULL |
||||
AND S.Id IS NULL AND MM.Id IS NULL AND MVM.Id IS NULL")
|
||||
.Map(result => result.ToList()); |
||||
|
||||
public async Task<Unit> Delete(List<Artwork> artwork) |
||||
{ |
||||
IEnumerable<List<int>> chunks = Chunk(artwork.Map(a => a.Id), 100); |
||||
foreach (List<int> chunk in chunks) |
||||
{ |
||||
await _dbConnection.ExecuteAsync( |
||||
"DELETE FROM Artwork WHERE Id IN @Ids", |
||||
new { Ids = chunk }); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private static IEnumerable<List<T>> Chunk<T>(IEnumerable<T> collection, int size) |
||||
{ |
||||
var count = 0; |
||||
var chunk = new List<T>(size); |
||||
|
||||
foreach (T element in collection) |
||||
{ |
||||
if (count++ == size) |
||||
{ |
||||
yield return chunk; |
||||
chunk = new List<T>(size); |
||||
count = 1; |
||||
} |
||||
|
||||
chunk.Add(element); |
||||
} |
||||
|
||||
yield return chunk; |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue