Backend: 401 documented on all mutating settings/resolution routes; resolution delete distinguishes 404 (unknown) from 422 (not custom); XMLTV enum bridging via exhaustive switch instead of int casts; field-level Arg.Is assertions incl. non-null watermark/filler flow. Frontend: resolution add/delete failures surfaced inline (were silent); partial saves merge succeeded groups via allSettled; empty numeric fields invalid + tunerCount min 1; HLS Direct select shows out-of-list wire values; media-source rows show derived last-scan. ErsatzTV.Tests 495; web suite 145. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.8 KiB
C#
47 lines
1.8 KiB
C#
using Dapper;
|
|
using ErsatzTV.Core;
|
|
using ErsatzTV.Core.Domain;
|
|
using ErsatzTV.Core.Errors;
|
|
using ErsatzTV.Infrastructure.Data;
|
|
using ErsatzTV.Infrastructure.Extensions;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace ErsatzTV.Application.Resolutions;
|
|
|
|
public class DeleteCustomResolutionHandler : IRequestHandler<DeleteCustomResolution, Option<BaseError>>
|
|
{
|
|
private readonly IDbContextFactory<TvContext> _dbContextFactory;
|
|
|
|
public DeleteCustomResolutionHandler(IDbContextFactory<TvContext> dbContextFactory) =>
|
|
_dbContextFactory = dbContextFactory;
|
|
|
|
public async Task<Option<BaseError>> Handle(DeleteCustomResolution request, CancellationToken cancellationToken)
|
|
{
|
|
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
|
|
|
|
Option<Resolution> maybeAnyResolution = await dbContext.Resolutions
|
|
.AsNoTracking()
|
|
.SelectOneAsync(p => p.Id, p => p.Id == request.ResolutionId, cancellationToken);
|
|
|
|
foreach (Resolution existingResolution in maybeAnyResolution)
|
|
{
|
|
if (!existingResolution.IsCustom)
|
|
{
|
|
return BaseError.New($"Resolution {request.ResolutionId} is not a custom resolution.");
|
|
}
|
|
|
|
// reset any ffmpeg profiles using this resolution to 1920x1080
|
|
await dbContext.Connection.ExecuteAsync(
|
|
@"UPDATE FFmpegProfile SET ResolutionId = 3 WHERE ResolutionId = @ResolutionId",
|
|
new { request.ResolutionId });
|
|
|
|
dbContext.Resolutions.Remove(existingResolution);
|
|
await dbContext.SaveChangesAsync(cancellationToken);
|
|
}
|
|
|
|
return maybeAnyResolution.IsNone
|
|
? new NotFoundError($"Resolution {request.ResolutionId} does not exist.")
|
|
: Option<BaseError>.None;
|
|
}
|
|
}
|