feat(backend): ability to set profile flags, return profile flags in get user endpoint
This commit is contained in:
parent
6a4aa8064a
commit
a3cbdc1a08
4 changed files with 62 additions and 15 deletions
36
Foxnouns.Backend/Database/FlagQueryExtensions.cs
Normal file
36
Foxnouns.Backend/Database/FlagQueryExtensions.cs
Normal file
|
@ -0,0 +1,36 @@
|
|||
using Foxnouns.Backend.Database.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Foxnouns.Backend.Database;
|
||||
|
||||
public static class FlagQueryExtensions
|
||||
{
|
||||
private static async Task<List<PrideFlag>> GetFlagsAsync(this DatabaseContext db, Snowflake userId) =>
|
||||
await db.PrideFlags.Where(f => f.UserId == userId).OrderBy(f => f.Id).ToListAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Sets the user's profile flags to the given IDs. Returns a validation error if any of the flag IDs are unknown
|
||||
/// or if too many IDs are given. Duplicates are allowed.
|
||||
/// </summary>
|
||||
public static async Task<ValidationError?> SetUserFlagsAsync(this DatabaseContext db, Snowflake userId,
|
||||
Snowflake[] flagIds)
|
||||
{
|
||||
var currentFlags = await db.UserFlags.Where(f => f.UserId == userId).ToListAsync();
|
||||
foreach (var flag in currentFlags)
|
||||
db.UserFlags.Remove(flag);
|
||||
|
||||
// If there's no new flags to set, we're done
|
||||
if (flagIds.Length == 0) return null;
|
||||
if (flagIds.Length > 100) return ValidationError.LengthError("Too many profile flags", 0, 100, flagIds.Length);
|
||||
|
||||
var flags = await db.GetFlagsAsync(userId);
|
||||
var unknownFlagIds = flagIds.Where(id => flags.All(f => f.Id != id)).ToArray();
|
||||
if (unknownFlagIds.Length != 0)
|
||||
return ValidationError.GenericValidationError("Unknown flag IDs", unknownFlagIds);
|
||||
|
||||
var userFlags = flagIds.Select(id => new UserFlag { PrideFlagId = id, UserId = userId });
|
||||
db.UserFlags.AddRange(userFlags);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue