Adds DecoController (groups + decos CRUD + full-state PUT), playlist and
artist/multi-collection search picker wrappers, a PlaylistController for the
break-content playlist cascade, and PUT /api/playouts/{id}/deco. Fixes the
CreateDecoHandler missing deco-group existence check (FK 500 -> 422), matching
the CreateBlock/CreateTemplate precedent. ReplaceDecoRequest.ToCommand rejects
Merge on the non-mergeable sections (422).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
92 lines
3.1 KiB
C#
92 lines
3.1 KiB
C#
using ErsatzTV.Application.Scheduling;
|
|
using ErsatzTV.Core;
|
|
using ErsatzTV.Core.Domain;
|
|
using ErsatzTV.Core.Domain.Scheduling;
|
|
|
|
namespace ErsatzTV.Controllers.Api.Requests;
|
|
|
|
public record DecoBreakContentRequest(
|
|
int Id,
|
|
CollectionType CollectionType,
|
|
int? CollectionId,
|
|
int? MediaItemId,
|
|
int? MultiCollectionId,
|
|
int? SmartCollectionId,
|
|
int? PlaylistId,
|
|
DecoBreakPlacement Placement)
|
|
{
|
|
public UpdateDecoBreakContent ToUpdateItem() =>
|
|
new(Id, CollectionType, CollectionId, MediaItemId, MultiCollectionId, SmartCollectionId, PlaylistId, Placement);
|
|
}
|
|
|
|
public record ReplaceDecoRequest(
|
|
string Name,
|
|
DecoMode WatermarkMode,
|
|
List<int> WatermarkIds,
|
|
bool UseWatermarkDuringFiller,
|
|
DecoMode GraphicsElementsMode,
|
|
List<int> GraphicsElementIds,
|
|
bool UseGraphicsElementsDuringFiller,
|
|
DecoMode BreakContentMode,
|
|
List<DecoBreakContentRequest> BreakContent,
|
|
DecoMode DefaultFillerMode,
|
|
CollectionType DefaultFillerCollectionType,
|
|
int? DefaultFillerCollectionId,
|
|
int? DefaultFillerMediaItemId,
|
|
int? DefaultFillerMultiCollectionId,
|
|
int? DefaultFillerSmartCollectionId,
|
|
bool DefaultFillerTrimToFit,
|
|
DecoMode DeadAirFallbackMode,
|
|
CollectionType DeadAirFallbackCollectionType,
|
|
int? DeadAirFallbackCollectionId,
|
|
int? DeadAirFallbackMediaItemId,
|
|
int? DeadAirFallbackMultiCollectionId,
|
|
int? DeadAirFallbackSmartCollectionId)
|
|
{
|
|
public Either<BaseError, UpdateDeco> ToCommand(int decoGroupId, int decoId)
|
|
{
|
|
// Merge is only valid for the watermark and graphics-element sections; the handler treats
|
|
// Merge on the other sections as "not overridden" (silently ignored), so reject it here.
|
|
if (BreakContentMode is DecoMode.Merge)
|
|
{
|
|
return BaseError.New("[BreakContentMode] does not support Merge; use Inherit, Disable, or Override");
|
|
}
|
|
|
|
if (DefaultFillerMode is DecoMode.Merge)
|
|
{
|
|
return BaseError.New("[DefaultFillerMode] does not support Merge; use Inherit, Disable, or Override");
|
|
}
|
|
|
|
if (DeadAirFallbackMode is DecoMode.Merge)
|
|
{
|
|
return BaseError.New("[DeadAirFallbackMode] does not support Merge; use Inherit, Disable, or Override");
|
|
}
|
|
|
|
return new UpdateDeco(
|
|
decoId,
|
|
decoGroupId,
|
|
Name,
|
|
WatermarkMode,
|
|
WatermarkIds ?? [],
|
|
UseWatermarkDuringFiller,
|
|
GraphicsElementsMode,
|
|
GraphicsElementIds ?? [],
|
|
UseGraphicsElementsDuringFiller,
|
|
BreakContentMode,
|
|
(BreakContent ?? []).Select(bc => bc.ToUpdateItem()).ToList(),
|
|
DefaultFillerMode,
|
|
DefaultFillerCollectionType,
|
|
DefaultFillerCollectionId,
|
|
DefaultFillerMediaItemId,
|
|
DefaultFillerMultiCollectionId,
|
|
DefaultFillerSmartCollectionId,
|
|
DefaultFillerTrimToFit,
|
|
DeadAirFallbackMode,
|
|
DeadAirFallbackCollectionType,
|
|
DeadAirFallbackCollectionId,
|
|
DeadAirFallbackMediaItemId,
|
|
DeadAirFallbackMultiCollectionId,
|
|
DeadAirFallbackSmartCollectionId);
|
|
}
|
|
}
|