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 Coravel.Queuing.Interfaces; | ||||||
| using Foxnouns.Backend.Database; | using Foxnouns.Backend.Database; | ||||||
| using Foxnouns.Backend.Database.Models; | using Foxnouns.Backend.Database.Models; | ||||||
|  | using Foxnouns.Backend.Extensions; | ||||||
| using Foxnouns.Backend.Jobs; | using Foxnouns.Backend.Jobs; | ||||||
| using Foxnouns.Backend.Middleware; | using Foxnouns.Backend.Middleware; | ||||||
| using Foxnouns.Backend.Services; | using Foxnouns.Backend.Services; | ||||||
|  | @ -11,11 +12,15 @@ namespace Foxnouns.Backend.Controllers; | ||||||
| 
 | 
 | ||||||
| [Route("/api/v2/users/@me/flags")] | [Route("/api/v2/users/@me/flags")] | ||||||
| public class FlagsController( | public class FlagsController( | ||||||
|  |     ILogger logger, | ||||||
|     DatabaseContext db, |     DatabaseContext db, | ||||||
|     UserRendererService userRenderer, |     UserRendererService userRenderer, | ||||||
|  |     ObjectStorageService objectStorageService, | ||||||
|     ISnowflakeGenerator snowflakeGenerator, |     ISnowflakeGenerator snowflakeGenerator, | ||||||
|     IQueue queue) : ApiControllerBase |     IQueue queue) : ApiControllerBase | ||||||
| { | { | ||||||
|  |     private readonly ILogger _logger = logger.ForContext<FlagsController>(); | ||||||
|  |      | ||||||
|     [HttpGet] |     [HttpGet] | ||||||
|     [Authorize("identify")] |     [Authorize("identify")] | ||||||
|     [ProducesResponseType<IEnumerable<PrideFlagResponse>>(statusCode: StatusCodes.Status200OK)] |     [ProducesResponseType<IEnumerable<PrideFlagResponse>>(statusCode: StatusCodes.Status200OK)] | ||||||
|  | @ -40,8 +45,40 @@ public class FlagsController( | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public record CreateFlagRequest(string Name, string Image, string? Description); |     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) => |     private PrideFlagResponse ToResponse(PrideFlag flag) => | ||||||
|         new(flag.Id, userRenderer.ImageUrlFor(flag), flag.Name, flag.Description); |         new(flag.Id, userRenderer.ImageUrlFor(flag), flag.Name, flag.Description); | ||||||
|  |  | ||||||
|  | @ -24,6 +24,10 @@ public static class AvatarObjectExtensions | ||||||
|             CancellationToken ct = default) => |             CancellationToken ct = default) => | ||||||
|         await objectStorageService.RemoveObjectAsync(UserAvatarUpdateInvocable.Path(id, hash), ct); |         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) |     public static async Task<(string Hash, Stream Image)> ConvertBase64UriToImage(this string uri, int size, bool crop) | ||||||
|     { |     { | ||||||
|         if (!uri.StartsWith("data:image/")) |         if (!uri.StartsWith("data:image/")) | ||||||
|  |  | ||||||
|  | @ -1,4 +1,3 @@ | ||||||
| using System.Security.Cryptography; |  | ||||||
| using Coravel.Invocable; | using Coravel.Invocable; | ||||||
| using Foxnouns.Backend.Database; | using Foxnouns.Backend.Database; | ||||||
| using Foxnouns.Backend.Database.Models; | using Foxnouns.Backend.Database.Models; | ||||||
|  | @ -45,5 +44,5 @@ public class CreateFlagInvocable(DatabaseContext db, ObjectStorageService object | ||||||
|         throw new NotImplementedException(); |         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