Browse Source

persist changes to db

add-deco-break-content
Jason Dove 1 year ago
parent
commit
99a681fcb2
No known key found for this signature in database
  1. 12
      ErsatzTV.Application/Scheduling/Commands/UpdateDeco.cs
  2. 38
      ErsatzTV.Application/Scheduling/Commands/UpdateDecoHandler.cs
  3. 15
      ErsatzTV.Application/Scheduling/DecoBreakContentViewModel.cs
  4. 3
      ErsatzTV.Application/Scheduling/DecoViewModel.cs
  5. 13
      ErsatzTV.Application/Scheduling/Mapper.cs
  6. 8
      ErsatzTV.Application/Scheduling/Queries/GetDecoByIdHandler.cs
  7. 1
      ErsatzTV.Application/Scheduling/Queries/GetDecosByDecoGroupIdHandler.cs
  8. 24
      ErsatzTV/Pages/DecoEditor.razor
  9. 1
      ErsatzTV/ViewModels/DecoBreakContentEditViewModel.cs

12
ErsatzTV.Application/Scheduling/Commands/UpdateDeco.cs

@ -4,6 +4,15 @@ using ErsatzTV.Core.Domain.Scheduling; @@ -4,6 +4,15 @@ using ErsatzTV.Core.Domain.Scheduling;
namespace ErsatzTV.Application.Scheduling;
public record UpdateDecoBreakContent(
int Id,
ProgramScheduleItemCollectionType CollectionType,
int? CollectionId,
int? MediaItemId,
int? MultiCollectionId,
int? SmartCollectionId,
DecoBreakPlacement Placement);
public record UpdateDeco(
int DecoId,
int DecoGroupId,
@ -23,5 +32,6 @@ public record UpdateDeco( @@ -23,5 +32,6 @@ public record UpdateDeco(
int? DeadAirFallbackMediaItemId,
int? DeadAirFallbackMultiCollectionId,
int? DeadAirFallbackSmartCollectionId,
DecoMode BreakContentMode)
DecoMode BreakContentMode,
List<UpdateDecoBreakContent> BreakContent)
: IRequest<Either<BaseError, DecoViewModel>>;

38
ErsatzTV.Application/Scheduling/Commands/UpdateDecoHandler.cs

@ -63,6 +63,43 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory) @@ -63,6 +63,43 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
// break content
existing.BreakContentMode = request.BreakContentMode;
var toAdd = request.BreakContent.Filter(bc => bc.Id < 1).ToList();
var toRemove = existing.BreakContent.Filter(bc => request.BreakContent.All(bc2 => bc2.Id != bc.Id)).ToList();
var toUpdate = request.BreakContent.Except(toAdd).ToList();
foreach (DecoBreakContent remove in toRemove)
{
existing.BreakContent.Remove(remove);
}
foreach (UpdateDecoBreakContent add in toAdd)
{
existing.BreakContent.Add(
new DecoBreakContent
{
CollectionType = add.CollectionType,
CollectionId = add.CollectionId,
MediaItemId = add.MediaItemId,
MultiCollectionId = add.MultiCollectionId,
SmartCollectionId = add.SmartCollectionId,
Placement = add.Placement
});
}
foreach (UpdateDecoBreakContent update in toUpdate)
{
Option<DecoBreakContent> maybeExisting = existing.BreakContent.Find(bc => bc.Id == update.Id);
foreach (DecoBreakContent bc in maybeExisting)
{
bc.CollectionType = update.CollectionType;
bc.CollectionId = update.CollectionId;
bc.MediaItemId = update.MediaItemId;
bc.MultiCollectionId = update.MultiCollectionId;
bc.SmartCollectionId = update.SmartCollectionId;
bc.Placement = update.Placement;
}
}
await dbContext.SaveChangesAsync();
return Mapper.ProjectToViewModel(existing);
@ -76,6 +113,7 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory) @@ -76,6 +113,7 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
TvContext dbContext,
UpdateDeco request) =>
dbContext.Decos
.Include(d => d.BreakContent)
.SelectOneAsync(d => d.Id, d => d.Id == request.DecoId)
.Map(o => o.ToValidation<BaseError>("Deco does not exist"));

15
ErsatzTV.Application/Scheduling/DecoBreakContentViewModel.cs

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
using ErsatzTV.Application.MediaCollections;
using ErsatzTV.Application.MediaItems;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Domain.Scheduling;
namespace ErsatzTV.Application.Scheduling;
public record DecoBreakContentViewModel(
int Id,
ProgramScheduleItemCollectionType CollectionType,
MediaCollectionViewModel Collection,
NamedMediaItemViewModel MediaItem,
MultiCollectionViewModel MultiCollection,
SmartCollectionViewModel SmartCollection,
DecoBreakPlacement Placement);

3
ErsatzTV.Application/Scheduling/DecoViewModel.cs

@ -22,4 +22,5 @@ public record DecoViewModel( @@ -22,4 +22,5 @@ public record DecoViewModel(
int? DeadAirFallbackMediaItemId,
int? DeadAirFallbackMultiCollectionId,
int? DeadAirFallbackSmartCollectionId,
DecoMode BreakContentMode);
DecoMode BreakContentMode,
List<DecoBreakContentViewModel> BreakContent);

13
ErsatzTV.Application/Scheduling/Mapper.cs

@ -69,7 +69,18 @@ internal static class Mapper @@ -69,7 +69,18 @@ internal static class Mapper
deco.DeadAirFallbackMediaItemId,
deco.DeadAirFallbackMultiCollectionId,
deco.DeadAirFallbackSmartCollectionId,
deco.BreakContentMode);
deco.BreakContentMode,
deco.BreakContent.Map(ProjectToViewModel).ToList());
internal static DecoBreakContentViewModel ProjectToViewModel(DecoBreakContent decoBreakContent) =>
new(
decoBreakContent.Id,
decoBreakContent.CollectionType,
decoBreakContent.Collection is not null ? MediaCollections.Mapper.ProjectToViewModel(decoBreakContent.Collection) : null,
null, // not supporting show, season, artist, etc. yet
decoBreakContent.MultiCollection is not null ? MediaCollections.Mapper.ProjectToViewModel(decoBreakContent.MultiCollection) : null,
decoBreakContent.SmartCollection is not null ? MediaCollections.Mapper.ProjectToViewModel(decoBreakContent.SmartCollection) : null,
decoBreakContent.Placement);
internal static DecoTemplateGroupViewModel ProjectToViewModel(DecoTemplateGroup decoTemplateGroup) =>
new(decoTemplateGroup.Id, decoTemplateGroup.Name, decoTemplateGroup.DecoTemplates.Count);

8
ErsatzTV.Application/Scheduling/Queries/GetDecoByIdHandler.cs

@ -11,6 +11,14 @@ public class GetDecoByIdHandler(IDbContextFactory<TvContext> dbContextFactory) @@ -11,6 +11,14 @@ public class GetDecoByIdHandler(IDbContextFactory<TvContext> dbContextFactory)
{
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken);
return await dbContext.Decos
.Include(d => d.BreakContent)
.ThenInclude(bc => bc.Collection)
.Include(d => d.BreakContent)
.ThenInclude(bc => bc.MediaItem)
.Include(d => d.BreakContent)
.ThenInclude(bc => bc.MultiCollection)
.Include(d => d.BreakContent)
.ThenInclude(bc => bc.SmartCollection)
.SelectOneAsync(b => b.Id, b => b.Id == request.DecoId)
.MapT(Mapper.ProjectToViewModel);
}

1
ErsatzTV.Application/Scheduling/Queries/GetDecosByDecoGroupIdHandler.cs

@ -12,6 +12,7 @@ public class GetDecosByDecoGroupIdHandler(IDbContextFactory<TvContext> dbContext @@ -12,6 +12,7 @@ public class GetDecosByDecoGroupIdHandler(IDbContextFactory<TvContext> dbContext
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken);
List<Deco> decos = await dbContext.Decos
.Include(d => d.BreakContent)
.Filter(b => b.DecoGroupId == request.DecoGroupId)
.AsNoTracking()
.ToListAsync(cancellationToken);

24
ErsatzTV/Pages/DecoEditor.razor

@ -308,7 +308,7 @@ @@ -308,7 +308,7 @@
<MudCard class="mb-6" Style="width: 700px">
<MudTable T="DecoBreakContentEditViewModel"
Class="mt-4" Dense="true" Hover="true"
Items="_deco.BreakContent.OrderBy(i => i.Index)"
Items="_deco.BreakContent"
ReadOnly="@(_deco.BreakContentMode != DecoMode.Override)"
IsEditRowSwitchingBlocked="true">
<ToolBarContent>
@ -487,16 +487,27 @@ @@ -487,16 +487,27 @@
: null,
BreakContentMode = deco.BreakContentMode,
BreakContent = []
BreakContent = deco.BreakContent.Map(ProjectToEditViewModel).ToList()
};
}
}
private static DecoBreakContentEditViewModel ProjectToEditViewModel(DecoBreakContentViewModel vm) =>
new()
{
Id = vm.Id,
CollectionType = vm.CollectionType,
Collection = vm.Collection,
MediaItem = vm.MediaItem,
MultiCollection = vm.MultiCollection,
SmartCollection = vm.SmartCollection,
Placement = vm.Placement
};
private void AddBreakContent()
{
var item = new DecoBreakContentEditViewModel
{
Index = _deco.BreakContent.Map(i => i.Index).DefaultIfEmpty().Max() + 1,
CollectionType = ProgramScheduleItemCollectionType.Collection,
Collection = null,
Placement = DecoBreakPlacement.BlockStart
@ -512,6 +523,10 @@ @@ -512,6 +523,10 @@
private async Task SaveChanges()
{
var breakContent = _deco.BreakContent
.Map(vm => new UpdateDecoBreakContent(vm.Id, vm.CollectionType, vm.Collection?.Id, vm.MediaItem?.MediaItemId, vm.MultiCollection?.Id, vm.SmartCollection?.Id, vm.Placement))
.ToList();
var request = new UpdateDeco(
Id,
_deco.DecoGroupId,
@ -531,7 +546,8 @@ @@ -531,7 +546,8 @@
_deco.DeadAirFallbackMediaItem?.MediaItemId,
_deco.DeadAirFallbackMultiCollection?.Id,
_deco.DeadAirFallbackSmartCollection?.Id,
_deco.BreakContentMode);
_deco.BreakContentMode,
breakContent);
Seq<BaseError> errorMessages = await Mediator
.Send(request, _cts.Token)

1
ErsatzTV/ViewModels/DecoBreakContentEditViewModel.cs

@ -13,7 +13,6 @@ public class DecoBreakContentEditViewModel : INotifyPropertyChanged @@ -13,7 +13,6 @@ public class DecoBreakContentEditViewModel : INotifyPropertyChanged
private ProgramScheduleItemCollectionType _collectionType;
public int Id { get; set; }
public int Index { get; set; }
public ProgramScheduleItemCollectionType CollectionType
{

Loading…
Cancel
Save