Harden request validation and admin UX cues
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 58s
CI - Build & Verify / Deploy to award.noveria.net (push) Successful in 1m24s

This commit is contained in:
AzuTear
2026-06-30 08:45:28 +02:00
parent 1191abc914
commit 33ba00a682
11 changed files with 248 additions and 70 deletions
@@ -1,4 +1,5 @@
using Backend.Common;
using Backend.Contracts;
using Backend.Domain;
using Backend.Services;
using Microsoft.AspNetCore.Http.Extensions;
@@ -205,4 +206,74 @@ public static partial class PublicEndpoints
"show" => "show",
_ => "current",
};
private static IResult? ValidateCreateNominationRequest(CreateNominationRequest? request)
{
if (request is null)
{
return Results.BadRequest(new { message = "A nomination request body is required." });
}
if (request.Year <= 0)
{
return Results.BadRequest(new { message = "A valid season year is required." });
}
if ((request.Nominations?.Length ?? 0) == 0 && (request.Nominees?.Length ?? 0) == 0)
{
return Results.BadRequest(new { message = "A nomination request must include at least one stream link." });
}
return null;
}
private static IResult? ValidateCreateVoteRequest(CreateVoteRequest? request)
{
if (request is null)
{
return Results.BadRequest(new { message = "A vote request body is required." });
}
if (request.SeasonId <= 0)
{
return Results.BadRequest(new { message = "A valid season id is required." });
}
if (request.Entries is null || request.Entries.Length == 0)
{
return Results.BadRequest(new { message = "At least one vote entry is required." });
}
if (request.Entries.Any(item => item.CategoryId <= 0 || item.CandidateId <= 0))
{
return Results.BadRequest(new { message = "Each vote entry requires a valid category and candidate." });
}
return null;
}
private static IResult? ValidateCreateClipRequest(CreateClipRequest? request)
{
if (request is null)
{
return Results.BadRequest(new { message = "A clip request body is required." });
}
if (request.Year <= 0)
{
return Results.BadRequest(new { message = "A valid season year is required." });
}
if (request.CategoryId is <= 0 || request.CandidateId is <= 0)
{
return Results.BadRequest(new { message = "Category and candidate ids must be positive when provided." });
}
if (string.IsNullOrWhiteSpace(request.ClipUrl))
{
return Results.BadRequest(new { message = "A valid http(s) clip link is required." });
}
return null;
}
}