feat(backend): validate custom preferences on save

This commit is contained in:
sam 2024-11-28 17:28:52 +01:00
parent 71b59dbb00
commit 8b1d5b2c1b
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
6 changed files with 560 additions and 477 deletions

View file

@ -27,7 +27,7 @@ public class MetaController : ApiControllerBase
new Limits(
MemberCount: MembersController.MaxMemberCount,
BioLength: ValidationUtils.MaxBioLength,
CustomPreferences: UsersController.MaxCustomPreferences
CustomPreferences: ValidationUtils.MaxCustomPreferences
)
)
);

View file

@ -197,11 +197,11 @@ public class UsersController(
[Authorize("user.update")]
[ProducesResponseType<Dictionary<Snowflake, User.CustomPreference>>(StatusCodes.Status200OK)]
public async Task<IActionResult> UpdateCustomPreferencesAsync(
[FromBody] List<CustomPreferencesUpdateRequest> req,
[FromBody] List<CustomPreferenceUpdate> req,
CancellationToken ct = default
)
{
ValidationUtils.Validate(ValidateCustomPreferences(req));
ValidationUtils.Validate(ValidationUtils.ValidateCustomPreferences(req));
var user = await db.ResolveUserAsync(CurrentUser!.Id, ct);
var preferences = user
@ -241,7 +241,7 @@ public class UsersController(
}
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
public class CustomPreferencesUpdateRequest
public class CustomPreferenceUpdate
{
public Snowflake? Id { get; init; }
public required string Icon { get; set; }
@ -251,34 +251,6 @@ public class UsersController(
public bool Favourite { get; set; }
}
public const int MaxCustomPreferences = 25;
private static List<(string, ValidationError?)> ValidateCustomPreferences(
List<CustomPreferencesUpdateRequest> preferences
)
{
var errors = new List<(string, ValidationError?)>();
if (preferences.Count > MaxCustomPreferences)
errors.Add(
(
"custom_preferences",
ValidationError.LengthError(
"Too many custom preferences",
0,
MaxCustomPreferences,
preferences.Count
)
)
);
if (preferences.Count > 50)
return errors;
// TODO: validate individual preferences
return errors;
}
public class UpdateUserRequest : PatchRequest
{
public string? Username { get; init; }