mirror of https://github.com/ErsatzTV/ErsatzTV.git
117 changed files with 1223 additions and 1644 deletions
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCards.Queries |
||||
{ |
||||
public record GetCollectionCards |
||||
(int Id) : IRequest<Either<BaseError, CollectionCardResultsViewModel>>; |
||||
} |
||||
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
using static ErsatzTV.Application.MediaCards.Mapper; |
||||
|
||||
namespace ErsatzTV.Application.MediaCards.Queries |
||||
{ |
||||
public class GetCollectionCardsHandler : IRequestHandler<GetCollectionCards, |
||||
Either<BaseError, CollectionCardResultsViewModel>> |
||||
{ |
||||
private readonly ICollectionRepository _collectionRepository; |
||||
|
||||
public GetCollectionCardsHandler(ICollectionRepository collectionRepository) => |
||||
_collectionRepository = collectionRepository; |
||||
|
||||
public async Task<Either<BaseError, CollectionCardResultsViewModel>> Handle( |
||||
GetCollectionCards request, |
||||
CancellationToken cancellationToken) => |
||||
(await _collectionRepository.GetWithItemsUntracked(request.Id)) |
||||
.ToEither(BaseError.New("Unable to load collection")) |
||||
.Map(ProjectToViewModel); |
||||
} |
||||
} |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCards.Queries |
||||
{ |
||||
public record GetSimpleMediaCollectionCards |
||||
(int Id) : IRequest<Either<BaseError, SimpleMediaCollectionCardResultsViewModel>>; |
||||
} |
||||
@ -1,26 +0,0 @@
@@ -1,26 +0,0 @@
|
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
using static ErsatzTV.Application.MediaCards.Mapper; |
||||
|
||||
namespace ErsatzTV.Application.MediaCards.Queries |
||||
{ |
||||
public class GetSimpleMediaCollectionCardsHandler : IRequestHandler<GetSimpleMediaCollectionCards, |
||||
Either<BaseError, SimpleMediaCollectionCardResultsViewModel>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public GetSimpleMediaCollectionCardsHandler(IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public async Task<Either<BaseError, SimpleMediaCollectionCardResultsViewModel>> Handle( |
||||
GetSimpleMediaCollectionCards request, |
||||
CancellationToken cancellationToken) => |
||||
(await _mediaCollectionRepository.GetSimpleMediaCollectionWithItemsUntracked(request.Id)) |
||||
.ToEither(BaseError.New("Unable to load collection")) |
||||
.Map(ProjectToViewModel); |
||||
} |
||||
} |
||||
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddEpisodeToCollection(int CollectionId, int EpisodeId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
AddEpisodeToCollectionHandler : MediatR.IRequestHandler<AddEpisodeToCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddEpisodeToCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddEpisodeToCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionEpisodeRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionEpisodeRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.MediaItems.All(s => s.Id != parameters.EpisodeToAdd.Id)) |
||||
{ |
||||
parameters.Collection.MediaItems.Add(parameters.EpisodeToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddEpisodeToCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateEpisode(request)) |
||||
.Apply( |
||||
(collectionToUpdate, episode) => |
||||
new RequestParameters(collectionToUpdate, episode)); |
||||
|
||||
private Task<Validation<BaseError, Collection>> SimpleMediaCollectionMustExist( |
||||
AddEpisodeToCollection updateCollection) => |
||||
_mediaCollectionRepository.GetCollectionWithItems(updateCollection.CollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("Collection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, Episode>> ValidateEpisode( |
||||
AddEpisodeToCollection request) => |
||||
LoadTelevisionEpisode(request) |
||||
.Map(v => v.ToValidation<BaseError>("Episode does not exist")); |
||||
|
||||
private Task<Option<Episode>> LoadTelevisionEpisode( |
||||
AddEpisodeToCollection request) => |
||||
_televisionRepository.GetEpisode(request.EpisodeId); |
||||
|
||||
private record RequestParameters(Collection Collection, Episode EpisodeToAdd); |
||||
} |
||||
} |
||||
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddMovieToCollection(int CollectionId, int MovieId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddMovieToSimpleMediaCollection |
||||
(int MediaCollectionId, int MovieId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddSeasonToCollection(int CollectionId, int SeasonId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
AddSeasonToCollectionHandler : MediatR.IRequestHandler<AddSeasonToCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddSeasonToCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddSeasonToCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionSeasonRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionSeasonRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.MediaItems.All(s => s.Id != parameters.SeasonToAdd.Id)) |
||||
{ |
||||
parameters.Collection.MediaItems.Add(parameters.SeasonToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddSeasonToCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateSeason(request)) |
||||
.Apply( |
||||
(collectionToUpdate, season) => |
||||
new RequestParameters(collectionToUpdate, season)); |
||||
|
||||
private Task<Validation<BaseError, Collection>> SimpleMediaCollectionMustExist( |
||||
AddSeasonToCollection updateCollection) => |
||||
_mediaCollectionRepository.GetCollectionWithItems(updateCollection.CollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("Collection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, Season>> ValidateSeason( |
||||
AddSeasonToCollection request) => |
||||
LoadTelevisionSeason(request) |
||||
.Map(v => v.ToValidation<BaseError>("Season does not exist")); |
||||
|
||||
private Task<Option<Season>> LoadTelevisionSeason( |
||||
AddSeasonToCollection request) => |
||||
_televisionRepository.GetSeason(request.SeasonId); |
||||
|
||||
private record RequestParameters(Collection Collection, Season SeasonToAdd); |
||||
} |
||||
} |
||||
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddShowToCollection(int CollectionId, int ShowId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class AddShowToCollectionHandler : MediatR.IRequestHandler<AddShowToCollection, Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddShowToCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddShowToCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionShowRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionShowRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.MediaItems.All(s => s.Id != parameters.ShowToAdd.Id)) |
||||
{ |
||||
parameters.Collection.MediaItems.Add(parameters.ShowToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddShowToCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateShow(request)) |
||||
.Apply( |
||||
(collectionToUpdate, show) => |
||||
new RequestParameters(collectionToUpdate, show)); |
||||
|
||||
private Task<Validation<BaseError, Collection>> SimpleMediaCollectionMustExist( |
||||
AddShowToCollection updateCollection) => |
||||
_mediaCollectionRepository.GetCollectionWithItems(updateCollection.CollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("Collection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, Show>> ValidateShow( |
||||
AddShowToCollection request) => |
||||
LoadTelevisionShow(request) |
||||
.Map(v => v.ToValidation<BaseError>("Show does not exist")); |
||||
|
||||
private Task<Option<Show>> LoadTelevisionShow(AddShowToCollection request) => |
||||
_televisionRepository.GetShow(request.ShowId); |
||||
|
||||
private record RequestParameters(Collection Collection, Show ShowToAdd); |
||||
} |
||||
} |
||||
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddTelevisionEpisodeToSimpleMediaCollection |
||||
(int MediaCollectionId, int TelevisionEpisodeId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -1,68 +0,0 @@
@@ -1,68 +0,0 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
AddTelevisionEpisodeToSimpleMediaCollectionHandler : MediatR.IRequestHandler< |
||||
AddTelevisionEpisodeToSimpleMediaCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddTelevisionEpisodeToSimpleMediaCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddTelevisionEpisodeToSimpleMediaCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionEpisodeRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionEpisodeRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.TelevisionEpisodes.All(s => s.Id != parameters.EpisodeToAdd.Id)) |
||||
{ |
||||
parameters.Collection.TelevisionEpisodes.Add(parameters.EpisodeToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddTelevisionEpisodeToSimpleMediaCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateEpisode(request)) |
||||
.Apply( |
||||
(simpleMediaCollectionToUpdate, episode) => |
||||
new RequestParameters(simpleMediaCollectionToUpdate, episode)); |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> SimpleMediaCollectionMustExist( |
||||
AddTelevisionEpisodeToSimpleMediaCollection updateSimpleMediaCollection) => |
||||
_mediaCollectionRepository.GetSimpleMediaCollectionWithItems(updateSimpleMediaCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("SimpleMediaCollection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, TelevisionEpisodeMediaItem>> ValidateEpisode( |
||||
AddTelevisionEpisodeToSimpleMediaCollection request) => |
||||
LoadTelevisionEpisode(request) |
||||
.Map(v => v.ToValidation<BaseError>("TelevisionEpisode does not exist")); |
||||
|
||||
private Task<Option<TelevisionEpisodeMediaItem>> LoadTelevisionEpisode( |
||||
AddTelevisionEpisodeToSimpleMediaCollection request) => |
||||
_televisionRepository.GetEpisode(request.TelevisionEpisodeId); |
||||
|
||||
private record RequestParameters(SimpleMediaCollection Collection, TelevisionEpisodeMediaItem EpisodeToAdd); |
||||
} |
||||
} |
||||
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddTelevisionSeasonToSimpleMediaCollection |
||||
(int MediaCollectionId, int TelevisionSeasonId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -1,68 +0,0 @@
@@ -1,68 +0,0 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
AddTelevisionSeasonToSimpleMediaCollectionHandler : MediatR.IRequestHandler< |
||||
AddTelevisionSeasonToSimpleMediaCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddTelevisionSeasonToSimpleMediaCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddTelevisionSeasonToSimpleMediaCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionSeasonRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionSeasonRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.TelevisionSeasons.All(s => s.Id != parameters.SeasonToAdd.Id)) |
||||
{ |
||||
parameters.Collection.TelevisionSeasons.Add(parameters.SeasonToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddTelevisionSeasonToSimpleMediaCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateSeason(request)) |
||||
.Apply( |
||||
(simpleMediaCollectionToUpdate, season) => |
||||
new RequestParameters(simpleMediaCollectionToUpdate, season)); |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> SimpleMediaCollectionMustExist( |
||||
AddTelevisionSeasonToSimpleMediaCollection updateSimpleMediaCollection) => |
||||
_mediaCollectionRepository.GetSimpleMediaCollectionWithItems(updateSimpleMediaCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("SimpleMediaCollection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, TelevisionSeason>> ValidateSeason( |
||||
AddTelevisionSeasonToSimpleMediaCollection request) => |
||||
LoadTelevisionSeason(request) |
||||
.Map(v => v.ToValidation<BaseError>("TelevisionSeason does not exist")); |
||||
|
||||
private Task<Option<TelevisionSeason>> LoadTelevisionSeason( |
||||
AddTelevisionSeasonToSimpleMediaCollection request) => |
||||
_televisionRepository.GetSeason(request.TelevisionSeasonId); |
||||
|
||||
private record RequestParameters(SimpleMediaCollection Collection, TelevisionSeason SeasonToAdd); |
||||
} |
||||
} |
||||
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record AddTelevisionShowToSimpleMediaCollection |
||||
(int MediaCollectionId, int TelevisionShowId) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -1,67 +0,0 @@
@@ -1,67 +0,0 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
AddTelevisionShowToSimpleMediaCollectionHandler : MediatR.IRequestHandler< |
||||
AddTelevisionShowToSimpleMediaCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
private readonly ITelevisionRepository _televisionRepository; |
||||
|
||||
public AddTelevisionShowToSimpleMediaCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository, |
||||
ITelevisionRepository televisionRepository) |
||||
{ |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
_televisionRepository = televisionRepository; |
||||
} |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
AddTelevisionShowToSimpleMediaCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(ApplyAddTelevisionShowRequest) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyAddTelevisionShowRequest(RequestParameters parameters) |
||||
{ |
||||
if (parameters.Collection.TelevisionShows.All(s => s.Id != parameters.ShowToAdd.Id)) |
||||
{ |
||||
parameters.Collection.TelevisionShows.Add(parameters.ShowToAdd); |
||||
await _mediaCollectionRepository.Update(parameters.Collection); |
||||
} |
||||
|
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, RequestParameters>> |
||||
Validate(AddTelevisionShowToSimpleMediaCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), await ValidateShow(request)) |
||||
.Apply( |
||||
(simpleMediaCollectionToUpdate, show) => |
||||
new RequestParameters(simpleMediaCollectionToUpdate, show)); |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> SimpleMediaCollectionMustExist( |
||||
AddTelevisionShowToSimpleMediaCollection updateSimpleMediaCollection) => |
||||
_mediaCollectionRepository.GetSimpleMediaCollectionWithItems(updateSimpleMediaCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("SimpleMediaCollection does not exist.")); |
||||
|
||||
private Task<Validation<BaseError, TelevisionShow>> ValidateShow( |
||||
AddTelevisionShowToSimpleMediaCollection request) => |
||||
LoadTelevisionShow(request) |
||||
.Map(v => v.ToValidation<BaseError>("TelevisionShow does not exist")); |
||||
|
||||
private Task<Option<TelevisionShow>> LoadTelevisionShow(AddTelevisionShowToSimpleMediaCollection request) => |
||||
_televisionRepository.GetShow(request.TelevisionShowId); |
||||
|
||||
private record RequestParameters(SimpleMediaCollection Collection, TelevisionShow ShowToAdd); |
||||
} |
||||
} |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record CreateCollection(string Name) : IRequest<Either<BaseError, MediaCollectionViewModel>>; |
||||
} |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record CreateSimpleMediaCollection |
||||
(string Name) : IRequest<Either<BaseError, MediaCollectionViewModel>>; |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
using System.Collections.Generic; |
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record RemoveItemsFromCollection(int MediaCollectionId) : MediatR.IRequest<Either<BaseError, Unit>> |
||||
{ |
||||
public List<int> MediaItemIds { get; set; } = new(); |
||||
} |
||||
} |
||||
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
RemoveItemsFromCollectionHandler : MediatR.IRequestHandler<RemoveItemsFromCollection, Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public RemoveItemsFromCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
RemoveItemsFromCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(collection => ApplyAddTelevisionEpisodeRequest(request, collection)) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private Task<Unit> ApplyAddTelevisionEpisodeRequest( |
||||
RemoveItemsFromCollection request, |
||||
Collection collection) |
||||
{ |
||||
var itemsToRemove = collection.MediaItems |
||||
.Filter(m => request.MediaItemIds.Contains(m.Id)) |
||||
.ToList(); |
||||
|
||||
itemsToRemove.ForEach(m => collection.MediaItems.Remove(m)); |
||||
|
||||
return itemsToRemove.Any() |
||||
? _mediaCollectionRepository.Update(collection).ToUnit() |
||||
: Task.FromResult(Unit.Default); |
||||
} |
||||
|
||||
private Task<Validation<BaseError, Collection>> Validate( |
||||
RemoveItemsFromCollection request) => |
||||
CollectionMustExist(request); |
||||
|
||||
private Task<Validation<BaseError, Collection>> CollectionMustExist( |
||||
RemoveItemsFromCollection updateCollection) => |
||||
_mediaCollectionRepository.GetCollectionWithItems(updateCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("Collection does not exist.")); |
||||
} |
||||
} |
||||
@ -1,15 +0,0 @@
@@ -1,15 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record RemoveItemsFromSimpleMediaCollection |
||||
(int MediaCollectionId) : MediatR.IRequest<Either<BaseError, Unit>> |
||||
{ |
||||
public List<int> MovieIds { get; set; } = new(); |
||||
public List<int> TelevisionShowIds { get; set; } = new(); |
||||
public List<int> TelevisionSeasonIds { get; set; } = new(); |
||||
public List<int> TelevisionEpisodeIds { get; set; } = new(); |
||||
} |
||||
} |
||||
@ -1,74 +0,0 @@
@@ -1,74 +0,0 @@
|
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
RemoveItemsFromSimpleMediaCollectionHandler : MediatR.IRequestHandler< |
||||
RemoveItemsFromSimpleMediaCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public RemoveItemsFromSimpleMediaCollectionHandler( |
||||
IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
RemoveItemsFromSimpleMediaCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(collection => ApplyAddTelevisionEpisodeRequest(request, collection)) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private Task<Unit> ApplyAddTelevisionEpisodeRequest( |
||||
RemoveItemsFromSimpleMediaCollection request, |
||||
SimpleMediaCollection collection) |
||||
{ |
||||
var moviesToRemove = collection.Movies |
||||
.Filter(m => request.MovieIds.Contains(m.Id)) |
||||
.ToList(); |
||||
|
||||
moviesToRemove.ForEach(m => collection.Movies.Remove(m)); |
||||
|
||||
var showsToRemove = collection.TelevisionShows |
||||
.Filter(s => request.TelevisionShowIds.Contains(s.Id)) |
||||
.ToList(); |
||||
|
||||
showsToRemove.ForEach(s => collection.TelevisionShows.Remove(s)); |
||||
|
||||
var seasonsToRemove = collection.TelevisionSeasons |
||||
.Filter(s => request.TelevisionSeasonIds.Contains(s.Id)) |
||||
.ToList(); |
||||
|
||||
seasonsToRemove.ForEach(s => collection.TelevisionSeasons.Remove(s)); |
||||
|
||||
var episodesToRemove = collection.TelevisionEpisodes |
||||
.Filter(e => request.TelevisionEpisodeIds.Contains(e.Id)) |
||||
.ToList(); |
||||
|
||||
episodesToRemove.ForEach(e => collection.TelevisionEpisodes.Remove(e)); |
||||
|
||||
if (moviesToRemove.Any() || showsToRemove.Any() || seasonsToRemove.Any() || episodesToRemove.Any()) |
||||
{ |
||||
return _mediaCollectionRepository.Update(collection).ToUnit(); |
||||
} |
||||
|
||||
return Task.FromResult(Unit.Default); |
||||
} |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> Validate( |
||||
RemoveItemsFromSimpleMediaCollection request) => |
||||
SimpleMediaCollectionMustExist(request); |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> SimpleMediaCollectionMustExist( |
||||
RemoveItemsFromSimpleMediaCollection updateSimpleMediaCollection) => |
||||
_mediaCollectionRepository.GetSimpleMediaCollectionWithItems(updateSimpleMediaCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("SimpleMediaCollection does not exist.")); |
||||
} |
||||
} |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record UpdateCollection |
||||
(int CollectionId, string Name) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class UpdateCollectionHandler : MediatR.IRequestHandler<UpdateCollection, Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public UpdateCollectionHandler(IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
UpdateCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(c => ApplyUpdateRequest(c, request)) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyUpdateRequest(Collection c, UpdateCollection update) |
||||
{ |
||||
c.Name = update.Name; |
||||
await _mediaCollectionRepository.Update(c); |
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, Collection>> |
||||
Validate(UpdateCollection request) => |
||||
(await CollectionMustExist(request), ValidateName(request)) |
||||
.Apply((collectionToUpdate, _) => collectionToUpdate); |
||||
|
||||
private Task<Validation<BaseError, Collection>> CollectionMustExist( |
||||
UpdateCollection updateCollection) => |
||||
_mediaCollectionRepository.Get(updateCollection.CollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("Collection does not exist.")); |
||||
|
||||
private Validation<BaseError, string> ValidateName(UpdateCollection updateSimpleMediaCollection) => |
||||
updateSimpleMediaCollection.NotEmpty(c => c.Name) |
||||
.Bind(_ => updateSimpleMediaCollection.NotLongerThan(50)(c => c.Name)); |
||||
} |
||||
} |
||||
@ -1,8 +0,0 @@
@@ -1,8 +0,0 @@
|
||||
using ErsatzTV.Core; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public record UpdateSimpleMediaCollection |
||||
(int MediaCollectionId, string Name) : MediatR.IRequest<Either<BaseError, Unit>>; |
||||
} |
||||
@ -1,47 +0,0 @@
@@ -1,47 +0,0 @@
|
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Commands |
||||
{ |
||||
public class |
||||
UpdateSimpleMediaCollectionHandler : MediatR.IRequestHandler<UpdateSimpleMediaCollection, |
||||
Either<BaseError, Unit>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public UpdateSimpleMediaCollectionHandler(IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public Task<Either<BaseError, Unit>> Handle( |
||||
UpdateSimpleMediaCollection request, |
||||
CancellationToken cancellationToken) => |
||||
Validate(request) |
||||
.MapT(c => ApplyUpdateRequest(c, request)) |
||||
.Bind(v => v.ToEitherAsync()); |
||||
|
||||
private async Task<Unit> ApplyUpdateRequest(SimpleMediaCollection c, UpdateSimpleMediaCollection update) |
||||
{ |
||||
c.Name = update.Name; |
||||
await _mediaCollectionRepository.Update(c); |
||||
return Unit.Default; |
||||
} |
||||
|
||||
private async Task<Validation<BaseError, SimpleMediaCollection>> |
||||
Validate(UpdateSimpleMediaCollection request) => |
||||
(await SimpleMediaCollectionMustExist(request), ValidateName(request)) |
||||
.Apply((simpleMediaCollectionToUpdate, _) => simpleMediaCollectionToUpdate); |
||||
|
||||
private Task<Validation<BaseError, SimpleMediaCollection>> SimpleMediaCollectionMustExist( |
||||
UpdateSimpleMediaCollection updateSimpleMediaCollection) => |
||||
_mediaCollectionRepository.GetSimpleMediaCollection(updateSimpleMediaCollection.MediaCollectionId) |
||||
.Map(v => v.ToValidation<BaseError>("SimpleMediaCollection does not exist.")); |
||||
|
||||
private Validation<BaseError, string> ValidateName(UpdateSimpleMediaCollection updateSimpleMediaCollection) => |
||||
updateSimpleMediaCollection.NotEmpty(c => c.Name) |
||||
.Bind(_ => updateSimpleMediaCollection.NotLongerThan(50)(c => c.Name)); |
||||
} |
||||
} |
||||
@ -1,7 +0,0 @@
@@ -1,7 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Queries |
||||
{ |
||||
public record GetAllSimpleMediaCollections : IRequest<List<MediaCollectionViewModel>>; |
||||
} |
||||
@ -1,25 +0,0 @@
@@ -1,25 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using MediatR; |
||||
using static ErsatzTV.Application.MediaCollections.Mapper; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Queries |
||||
{ |
||||
public class |
||||
GetAllSimpleMediaCollectionsHandler : IRequestHandler<GetAllSimpleMediaCollections, |
||||
List<MediaCollectionViewModel>> |
||||
{ |
||||
private readonly IMediaCollectionRepository _mediaCollectionRepository; |
||||
|
||||
public GetAllSimpleMediaCollectionsHandler(IMediaCollectionRepository mediaCollectionRepository) => |
||||
_mediaCollectionRepository = mediaCollectionRepository; |
||||
|
||||
public async Task<List<MediaCollectionViewModel>> Handle( |
||||
GetAllSimpleMediaCollections request, |
||||
CancellationToken cancellationToken) => |
||||
(await _mediaCollectionRepository.GetSimpleMediaCollections()).Map(ProjectToViewModel).ToList(); |
||||
} |
||||
} |
||||
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Queries |
||||
{ |
||||
public record GetCollectionById(int Id) : IRequest<Option<MediaCollectionViewModel>>; |
||||
} |
||||
@ -1,7 +0,0 @@
@@ -1,7 +0,0 @@
|
||||
using LanguageExt; |
||||
using MediatR; |
||||
|
||||
namespace ErsatzTV.Application.MediaCollections.Queries |
||||
{ |
||||
public record GetSimpleMediaCollectionById(int Id) : IRequest<Option<MediaCollectionViewModel>>; |
||||
} |
||||
@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class MediaCollectionEnumeratorState |
||||
public class CollectionEnumeratorState |
||||
{ |
||||
public int Seed { get; set; } |
||||
public int Index { get; set; } |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class LocalTelevisionShowSource : TelevisionShowSource |
||||
{ |
||||
public int MediaSourceId { get; set; } |
||||
public LocalMediaSource MediaSource { get; set; } |
||||
public string Path { get; set; } |
||||
} |
||||
} |
||||
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public abstract class MediaCollection : Record<MediaCollection> |
||||
{ |
||||
public int Id { get; set; } |
||||
public string Name { get; set; } |
||||
} |
||||
} |
||||
@ -1,12 +0,0 @@
@@ -1,12 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class SimpleMediaCollection : MediaCollection |
||||
{ |
||||
public List<Movie> Movies { get; set; } |
||||
public List<TelevisionShow> TelevisionShows { get; set; } |
||||
public List<TelevisionSeason> TelevisionSeasons { get; set; } |
||||
public List<TelevisionEpisodeMediaItem> TelevisionEpisodes { get; set; } |
||||
} |
||||
} |
||||
@ -1,12 +0,0 @@
@@ -1,12 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class TelevisionEpisodeMediaItem : MediaItem |
||||
{ |
||||
public int SeasonId { get; set; } |
||||
public TelevisionSeason Season { get; set; } |
||||
public TelevisionEpisodeMetadata Metadata { get; set; } |
||||
public List<SimpleMediaCollection> SimpleMediaCollections { get; set; } |
||||
} |
||||
} |
||||
@ -1,15 +0,0 @@
@@ -1,15 +0,0 @@
|
||||
using System; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class TelevisionEpisodeMetadata : MediaItemMetadata |
||||
{ |
||||
public int Id { get; set; } |
||||
public int TelevisionEpisodeId { get; set; } |
||||
public TelevisionEpisodeMediaItem TelevisionEpisode { get; set; } |
||||
public int Season { get; set; } |
||||
public int Episode { get; set; } |
||||
public string Plot { get; set; } |
||||
public DateTime? Aired { get; set; } |
||||
} |
||||
} |
||||
@ -1,19 +0,0 @@
@@ -1,19 +0,0 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using ErsatzTV.Core.Interfaces.Domain; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class TelevisionSeason : IHasAPoster |
||||
{ |
||||
public int Id { get; set; } |
||||
public int TelevisionShowId { get; set; } |
||||
public TelevisionShow TelevisionShow { get; set; } |
||||
public int Number { get; set; } |
||||
public List<TelevisionEpisodeMediaItem> Episodes { get; set; } |
||||
public List<SimpleMediaCollection> SimpleMediaCollections { get; set; } |
||||
public string Path { get; set; } |
||||
public string Poster { get; set; } |
||||
public DateTime? PosterLastWriteTime { get; set; } |
||||
} |
||||
} |
||||
@ -1,16 +0,0 @@
@@ -1,16 +0,0 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class TelevisionShow |
||||
{ |
||||
public int Id { get; set; } |
||||
public List<TelevisionShowSource> Sources { get; set; } |
||||
public TelevisionShowMetadata Metadata { get; set; } |
||||
public List<TelevisionSeason> Seasons { get; set; } |
||||
public string Poster { get; set; } |
||||
public DateTime? PosterLastWriteTime { get; set; } |
||||
public List<SimpleMediaCollection> SimpleMediaCollections { get; set; } |
||||
} |
||||
} |
||||
@ -1,21 +0,0 @@
@@ -1,21 +0,0 @@
|
||||
using System; |
||||
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
public class TelevisionShowMetadata |
||||
{ |
||||
public int Id { get; set; } |
||||
public int TelevisionShowId { get; set; } |
||||
|
||||
public TelevisionShow TelevisionShow { get; set; } |
||||
|
||||
// public int ShowId { get; set; }
|
||||
// public Show Show { get; set; }
|
||||
public MetadataSource Source { get; set; } |
||||
public DateTime? LastWriteTime { get; set; } |
||||
public string Title { get; set; } |
||||
public string SortTitle { get; set; } |
||||
public int? Year { get; set; } |
||||
public string Plot { get; set; } |
||||
} |
||||
} |
||||
@ -1,11 +0,0 @@
@@ -1,11 +0,0 @@
|
||||
namespace ErsatzTV.Core.Domain |
||||
{ |
||||
// used for shows split across sources (folders)
|
||||
// won't need to convert, since shows will be linked via metadata
|
||||
public class TelevisionShowSource |
||||
{ |
||||
public int Id { get; set; } |
||||
public int TelevisionShowId { get; set; } |
||||
public TelevisionShow TelevisionShow { get; set; } |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
using System.Threading.Tasks; |
||||
using ErsatzTV.Core.Domain; |
||||
using LanguageExt; |
||||
|
||||
namespace ErsatzTV.Core.Interfaces.Repositories |
||||
{ |
||||
public interface ICollectionRepository |
||||
{ |
||||
public Task<Option<Collection>> GetWithItemsUntracked(int collectionId); |
||||
} |
||||
} |
||||
@ -1,16 +0,0 @@
@@ -1,16 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class MediaCollectionConfiguration : IEntityTypeConfiguration<MediaCollection> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<MediaCollection> builder) |
||||
{ |
||||
builder.ToTable("MediaCollection"); |
||||
|
||||
builder.HasIndex(c => c.Name).IsUnique(); |
||||
} |
||||
} |
||||
} |
||||
@ -1,30 +0,0 @@
@@ -1,30 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class SimpleMediaCollectionConfiguration : IEntityTypeConfiguration<SimpleMediaCollection> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<SimpleMediaCollection> builder) |
||||
{ |
||||
builder.ToTable("SimpleMediaCollection"); |
||||
|
||||
builder.HasMany(c => c.Movies) |
||||
.WithMany(m => m.SimpleMediaCollections) |
||||
.UsingEntity(join => join.ToTable("SimpleMediaCollectionMovie")); |
||||
|
||||
builder.HasMany(c => c.TelevisionShows) |
||||
.WithMany(s => s.SimpleMediaCollections) |
||||
.UsingEntity(join => join.ToTable("SimpleMediaCollectionShow")); |
||||
|
||||
builder.HasMany(c => c.TelevisionSeasons) |
||||
.WithMany(s => s.SimpleMediaCollections) |
||||
.UsingEntity(join => join.ToTable("SimpleMediaCollectionSeason")); |
||||
|
||||
builder.HasMany(c => c.TelevisionEpisodes) |
||||
.WithMany(e => e.SimpleMediaCollections) |
||||
.UsingEntity(join => join.ToTable("SimpleMediaCollectionEpisode")); |
||||
} |
||||
} |
||||
} |
||||
@ -1,19 +0,0 @@
@@ -1,19 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class TelevisionEpisodeMediaItemConfiguration : IEntityTypeConfiguration<TelevisionEpisodeMediaItem> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<TelevisionEpisodeMediaItem> builder) |
||||
{ |
||||
builder.ToTable("TelevisionEpisode"); |
||||
|
||||
builder.HasOne(i => i.Metadata) |
||||
.WithOne(m => m.TelevisionEpisode) |
||||
.HasForeignKey<TelevisionEpisodeMetadata>(m => m.TelevisionEpisodeId) |
||||
.OnDelete(DeleteBehavior.Cascade); |
||||
} |
||||
} |
||||
} |
||||
@ -1,12 +0,0 @@
@@ -1,12 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class TelevisionEpisodeMetadataConfiguration : IEntityTypeConfiguration<TelevisionEpisodeMetadata> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<TelevisionEpisodeMetadata> builder) => |
||||
builder.ToTable("TelevisionEpisodeMetadata"); |
||||
} |
||||
} |
||||
@ -1,19 +0,0 @@
@@ -1,19 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class TelevisionSeasonConfiguration : IEntityTypeConfiguration<TelevisionSeason> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<TelevisionSeason> builder) |
||||
{ |
||||
builder.ToTable("TelevisionSeason"); |
||||
|
||||
builder.HasMany(season => season.Episodes) |
||||
.WithOne(episode => episode.Season) |
||||
.HasForeignKey(episode => episode.SeasonId) |
||||
.OnDelete(DeleteBehavior.Cascade); |
||||
} |
||||
} |
||||
} |
||||
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class TelevisionShowConfiguration : IEntityTypeConfiguration<TelevisionShow> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<TelevisionShow> builder) |
||||
{ |
||||
builder.ToTable("TelevisionShow"); |
||||
|
||||
builder.HasOne(show => show.Metadata) |
||||
.WithOne(metadata => metadata.TelevisionShow) |
||||
.HasForeignKey<TelevisionShowMetadata>(metadata => metadata.TelevisionShowId) |
||||
.OnDelete(DeleteBehavior.Cascade); |
||||
|
||||
builder.HasMany(show => show.Seasons) |
||||
.WithOne(season => season.TelevisionShow); |
||||
|
||||
builder.HasMany(show => show.Sources) |
||||
.WithOne(source => source.TelevisionShow) |
||||
.HasForeignKey(source => source.TelevisionShowId) |
||||
.OnDelete(DeleteBehavior.Cascade); |
||||
} |
||||
} |
||||
} |
||||
@ -1,12 +0,0 @@
@@ -1,12 +0,0 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Configurations |
||||
{ |
||||
public class TelevisionShowMetadataConfiguration : IEntityTypeConfiguration<TelevisionShowMetadata> |
||||
{ |
||||
public void Configure(EntityTypeBuilder<TelevisionShowMetadata> builder) => |
||||
builder.ToTable("TelevisionShowMetadata"); |
||||
} |
||||
} |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue