feat(backend): delete flag endpoint

This commit is contained in:
sam 2024-09-26 23:03:50 +02:00
parent e20a7d3465
commit 758ab9ec5b
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
3 changed files with 43 additions and 3 deletions

View file

@ -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);