feat(api): REST endpoints for templates, template groups, items + block copy

Adds TemplateController mirroring BlockController: groups CRUD, template
CRUD, item replace (PUT full-replace via ReplaceTemplateItems), and a
copy endpoint. Also wires the missing POST /api/blocks/{id}/copy since
CopyBlock's CQRS shape is directly analogous to CopyTemplate.

Fixes CreateTemplateHandler to validate the target template group exists
before insert (previously an unhandled FK violation -> 500), matching the
CreateBlockHandler fix (1e34e00e) for the same class of bug.

New DTOs in ErsatzTV.Core/Api/Scheduling; TimeSpan start times serialize
the same way as PlayoutResponseModel.DailyRebuildTime.

#144 S2 (#162)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 18:31:17 +02:00
co-authored by Claude Fable 5
parent e3f2cd631a
commit ae10eba4d7
17 changed files with 799 additions and 2 deletions
@@ -0,0 +1,4 @@
#nullable enable
namespace ErsatzTV.Core.Api.Scheduling;
public record TemplateGroupResponseModel(int Id, string Name, int TemplateCount);
@@ -0,0 +1,4 @@
#nullable enable
namespace ErsatzTV.Core.Api.Scheduling;
public record TemplateItemResponseModel(int BlockId, string BlockName, int BlockMinutes, TimeSpan StartTime);
@@ -0,0 +1,4 @@
#nullable enable
namespace ErsatzTV.Core.Api.Scheduling;
public record TemplateResponseModel(int Id, int TemplateGroupId, string GroupName, string Name);
@@ -0,0 +1,9 @@
#nullable enable
namespace ErsatzTV.Core.Api.Scheduling;
public record TemplateWithItemsResponseModel(
int Id,
int TemplateGroupId,
string GroupName,
string Name,
List<TemplateItemResponseModel> Items);