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…
	
	Add table
		Add a link
		
	
		Reference in a new issue