Unify API route parameters, return IResult everywhere, merge picture upload DTOs and centralize validation limits

Guid and long route constraints, id/trackId parameter names, Update*Request without the New prefix,
sentence-case operation summaries, shared security scheme id and a single Limits class.
This commit is contained in:
2026-09-24 12:36:48 +02:00
parent 405df082cc
commit fcf3093ad8
38 changed files with 740 additions and 829 deletions
@@ -1,8 +0,0 @@
namespace Musify.Api.Validators.Albums;
public static class AlbumReleaseYear
{
public const int Earliest = 1877;
public static int Latest => DateTime.UtcNow.Year + 1;
}
@@ -9,13 +9,13 @@ public sealed class CreateAlbumRequestValidator : AbstractValidator<CreateAlbumR
{
RuleFor(x => x.Title)
.NotEmpty()
.MaximumLength(200);
.MaximumLength(Limits.AlbumTitle);
RuleFor(x => x.Description)
.MaximumLength(256);
.MaximumLength(Limits.Description);
RuleFor(x => x.ReleaseYear)
.InclusiveBetween(AlbumReleaseYear.Earliest, AlbumReleaseYear.Latest)
.InclusiveBetween(Limits.EarliestReleaseYear, Limits.LatestReleaseYear)
.When(x => x.ReleaseYear.HasValue);
RuleFor(x => x.PictureIntentId)
@@ -1,20 +0,0 @@
using FluentValidation;
using Musify.Api.DataTransferObjects.Albums;
using Musify.Application.Configuration;
namespace Musify.Api.Validators.Albums;
public sealed class RequestAlbumPictureUploadRequestValidator : AbstractValidator<RequestAlbumPictureUploadRequest>
{
public RequestAlbumPictureUploadRequestValidator(UploadIntentConfiguration uploadConfiguration)
{
RuleFor(x => x.FileType)
.MustBeFileType(Uploads.PictureFileTypes);
RuleFor(x => x.ContentType)
.MustBeContentType(Uploads.PictureContentTypes);
RuleFor(x => x.ExpectedSizeBytes)
.MustBeValidUploadSize(uploadConfiguration.MaxUploadBytes);
}
}
@@ -7,15 +7,15 @@ public sealed class UpdateAlbumRequestValidator : AbstractValidator<UpdateAlbumR
{
public UpdateAlbumRequestValidator()
{
RuleFor(x => x.NewTitle)
RuleFor(x => x.Title)
.NotEmpty()
.MaximumLength(200);
.MaximumLength(Limits.AlbumTitle);
RuleFor(x => x.NewDescription)
.MaximumLength(256);
RuleFor(x => x.Description)
.MaximumLength(Limits.Description);
RuleFor(x => x.NewReleaseYear)
.InclusiveBetween(AlbumReleaseYear.Earliest, AlbumReleaseYear.Latest)
.When(x => x.NewReleaseYear.HasValue);
RuleFor(x => x.ReleaseYear)
.InclusiveBetween(Limits.EarliestReleaseYear, Limits.LatestReleaseYear)
.When(x => x.ReleaseYear.HasValue);
}
}