feat(backend): delete flag endpoint
This commit is contained in:
parent
e20a7d3465
commit
758ab9ec5b
3 changed files with 43 additions and 3 deletions
|
@ -1,6 +1,7 @@
|
|||
using Coravel.Queuing.Interfaces;
|
||||
using Foxnouns.Backend.Database;
|
||||
using Foxnouns.Backend.Database.Models;
|
||||
using Foxnouns.Backend.Extensions;
|
||||
using Foxnouns.Backend.Jobs;
|
||||
using Foxnouns.Backend.Middleware;
|
||||
using Foxnouns.Backend.Services;
|
||||
|
@ -11,11 +12,15 @@ namespace Foxnouns.Backend.Controllers;
|
|||
|
||||
[Route("/api/v2/users/@me/flags")]
|
||||
public class FlagsController(
|
||||
ILogger logger,
|
||||
DatabaseContext db,
|
||||
UserRendererService userRenderer,
|
||||
ObjectStorageService objectStorageService,
|
||||
ISnowflakeGenerator snowflakeGenerator,
|
||||
IQueue queue) : ApiControllerBase
|
||||
{
|
||||
private readonly ILogger _logger = logger.ForContext<FlagsController>();
|
||||
|
||||
[HttpGet]
|
||||
[Authorize("identify")]
|
||||
[ProducesResponseType<IEnumerable<PrideFlagResponse>>(statusCode: StatusCodes.Status200OK)]
|
||||
|
@ -40,8 +45,40 @@ public class FlagsController(
|
|||
}
|
||||
|
||||
public record CreateFlagRequest(string Name, string Image, string? Description);
|
||||
private record CreateFlagResponse(Snowflake Id, string Name, string? Description);
|
||||
|
||||
public record CreateFlagResponse(Snowflake Id, string Name, string? Description);
|
||||
[HttpDelete("{id}")]
|
||||
[Authorize("user.update")]
|
||||
public async Task<IActionResult> DeleteFlagAsync(Snowflake id)
|
||||
{
|
||||
await using var tx = await db.Database.BeginTransactionAsync();
|
||||
|
||||
var flag = await db.PrideFlags.FirstOrDefaultAsync(f => f.Id == id && f.UserId == CurrentUser!.Id);
|
||||
if (flag == null) throw new ApiError.NotFound("Unknown flag ID, or it's not your flag.");
|
||||
|
||||
var hash = flag.Hash;
|
||||
|
||||
db.PrideFlags.Remove(flag);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
var flagCount = await db.PrideFlags.CountAsync(f => f.Hash == flag.Hash);
|
||||
if (flagCount == 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Information("Deleting flag file {Hash} as it is no longer used by any flags", hash);
|
||||
await objectStorageService.DeleteFlagAsync(hash);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Error(e, "Error deleting flag file {Hash}", hash);
|
||||
}
|
||||
} else _logger.Debug("Flag file {Hash} is used by other flags, not deleting", hash);
|
||||
|
||||
await tx.CommitAsync();
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
private PrideFlagResponse ToResponse(PrideFlag flag) =>
|
||||
new(flag.Id, userRenderer.ImageUrlFor(flag), flag.Name, flag.Description);
|
||||
|
|
|
@ -24,6 +24,10 @@ public static class AvatarObjectExtensions
|
|||
CancellationToken ct = default) =>
|
||||
await objectStorageService.RemoveObjectAsync(UserAvatarUpdateInvocable.Path(id, hash), ct);
|
||||
|
||||
public static async Task DeleteFlagAsync(this ObjectStorageService objectStorageService, string hash,
|
||||
CancellationToken ct = default) =>
|
||||
await objectStorageService.RemoveObjectAsync(CreateFlagInvocable.Path(hash), ct);
|
||||
|
||||
public static async Task<(string Hash, Stream Image)> ConvertBase64UriToImage(this string uri, int size, bool crop)
|
||||
{
|
||||
if (!uri.StartsWith("data:image/"))
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
using System.Security.Cryptography;
|
||||
using Coravel.Invocable;
|
||||
using Foxnouns.Backend.Database;
|
||||
using Foxnouns.Backend.Database.Models;
|
||||
|
@ -45,5 +44,5 @@ public class CreateFlagInvocable(DatabaseContext db, ObjectStorageService object
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private static string Path(string hash) => $"flags/{hash}.webp";
|
||||
public static string Path(string hash) => $"flags/{hash}.webp";
|
||||
}
|
Loading…
Reference in a new issue