Slice C of the async-op contract normalization:
- channel reset (POST /api/channels/{channelNumber}/playout/reset) now
returns 202 Accepted (was 200 Ok) — it only queues a background rebuild
- reset-all (POST /api/playouts/reset-all) still 202 but now returns a
ResetAllPlayoutsResponseModel body reporting QueuedPlayoutIds /
SkippedLocked / SkippedUnsupported instead of silently swallowing skips;
handler returns a new ResetAllPlayoutsResult record
- single-playout GET (GET /api/playouts/{id}) now exposes IsLocked on
PlayoutResponseModel, set from IEntityLocker.IsPlayoutLocked mirroring
the list projection — gives a polling client the lock flag
Tests: channel reset asserts 202; reset-all asserts 202 + skipped-body
shape; single GET asserts IsLocked; new ResetAllPlayoutsHandlerTests
(in-memory SQLite) asserts locked/ExternalJson/None land in skipped lists
and eligible playouts in queued. docs/api-conventions.md §3a updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
47 lines
1.2 KiB
C#
47 lines
1.2 KiB
C#
#nullable enable
|
|
using ErsatzTV.Core.Domain;
|
|
|
|
namespace ErsatzTV.Core.Api.Playouts;
|
|
|
|
public record PlayoutResponseModel(
|
|
int Id,
|
|
PlayoutScheduleKind ScheduleKind,
|
|
string ChannelName,
|
|
string ChannelNumber,
|
|
ChannelPlayoutMode PlayoutMode,
|
|
string ScheduleName,
|
|
string? ScheduleFile,
|
|
TimeSpan? DailyRebuildTime,
|
|
PlayoutBuildStatusResponseModel? BuildStatus,
|
|
int? DecoId,
|
|
string? DecoName,
|
|
bool IsLocked)
|
|
{
|
|
public static PlayoutResponseModel From(
|
|
int id,
|
|
PlayoutScheduleKind scheduleKind,
|
|
string channelName,
|
|
string channelNumber,
|
|
ChannelPlayoutMode playoutMode,
|
|
string scheduleName,
|
|
string? scheduleFile,
|
|
TimeSpan? dailyRebuildTime,
|
|
PlayoutBuildStatusResponseModel? buildStatus,
|
|
int? decoId,
|
|
string? decoName,
|
|
bool isLocked) =>
|
|
new(
|
|
id,
|
|
scheduleKind,
|
|
channelName,
|
|
channelNumber,
|
|
playoutMode,
|
|
scheduleName,
|
|
scheduleFile,
|
|
dailyRebuildTime,
|
|
buildStatus,
|
|
decoId,
|
|
decoName,
|
|
isLocked);
|
|
}
|