Files
ersatztv/ErsatzTV/Controllers/Api/Requests/ReplaceDecoRequest.cs
T
timothyandClaude Fable 5 57bb320af8 feat(api): REST endpoints for decos, deco groups, playout default deco (#144 S3 (#162))
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>
2026-07-07 19:22:39 +02:00

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);
}
}