From c4f6798fd0ac0ff938d4734d99878b355ed0667c Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 3 Jun 2025 23:33:06 +0800 Subject: [PATCH] :sparkles: Able to list sticker packs with pubName --- .../Sticker/StickerController.cs | 83 +++++++++++-------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/DysonNetwork.Sphere/Sticker/StickerController.cs b/DysonNetwork.Sphere/Sticker/StickerController.cs index 5085d3a..c598889 100644 --- a/DysonNetwork.Sphere/Sticker/StickerController.cs +++ b/DysonNetwork.Sphere/Sticker/StickerController.cs @@ -12,18 +12,19 @@ namespace DysonNetwork.Sphere.Sticker; [Route("/stickers")] public class StickerController(AppDatabase db, StickerService st) : ControllerBase { - private async Task _CheckStickerPackPermissions(Guid packId, Account.Account currentUser, PublisherMemberRole requiredRole) + private async Task _CheckStickerPackPermissions(Guid packId, Account.Account currentUser, + PublisherMemberRole requiredRole) { var pack = await db.StickerPacks .Include(p => p.Publisher) .FirstOrDefaultAsync(p => p.Id == packId); - - if (pack is null) + + if (pack is null) return NotFound("Sticker pack not found"); var member = await db.PublisherMembers .FirstOrDefaultAsync(m => m.AccountId == currentUser.Id && m.PublisherId == pack.PublisherId); - if (member is null) + if (member is null) return StatusCode(403, "You are not a member of this publisher"); if (member.Role < requiredRole) return StatusCode(403, $"You need to be at least a {requiredRole} to perform this action"); @@ -32,11 +33,21 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa } [HttpGet] - public async Task>> ListStickerPacks([FromQuery] int offset = 0, - [FromQuery] int take = 20) + public async Task>> ListStickerPacks( + [FromQuery] int offset = 0, + [FromQuery] int take = 20, + [FromQuery] string? pubName = null + ) { - var totalCount = await db.StickerPacks.CountAsync(); + Publisher.Publisher? publisher = null; + if (pubName is not null) + publisher = await db.Publishers.FirstOrDefaultAsync(p => p.Name == pubName); + + var totalCount = await db.StickerPacks + .If(publisher is not null, q => q.Where(f => f.PublisherId == publisher!.Id)) + .CountAsync(); var packs = await db.StickerPacks + .If(publisher is not null, q => q.Where(f => f.PublisherId == publisher!.Id)) .OrderByDescending(e => e.CreatedAt) .Skip(offset) .Take(take) @@ -95,22 +106,22 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa await db.SaveChangesAsync(); return Ok(pack); } - + [HttpPatch("{id:guid}")] public async Task> UpdateStickerPack(Guid id, [FromBody] StickerPackRequest request) { - if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) + if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); var pack = await db.StickerPacks .Include(p => p.Publisher) .FirstOrDefaultAsync(p => p.Id == id); - if (pack is null) + if (pack is null) return NotFound(); var member = await db.PublisherMembers .FirstOrDefaultAsync(m => m.AccountId == currentUser.Id && m.PublisherId == pack.PublisherId); - if (member is null) + if (member is null) return StatusCode(403, "You are not a member of this publisher"); if (member.Role < PublisherMemberRole.Editor) return StatusCode(403, "You need to be at least an editor to update sticker packs"); @@ -126,22 +137,22 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa await db.SaveChangesAsync(); return Ok(pack); } - + [HttpDelete("{id:guid}")] public async Task DeleteStickerPack(Guid id) { - if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) + if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); var pack = await db.StickerPacks .Include(p => p.Publisher) .FirstOrDefaultAsync(p => p.Id == id); - if (pack is null) + if (pack is null) return NotFound(); var member = await db.PublisherMembers .FirstOrDefaultAsync(m => m.AccountId == currentUser.Id && m.PublisherId == pack.PublisherId); - if (member is null) + if (member is null) return StatusCode(403, "You are not a member of this publisher"); if (member.Role < PublisherMemberRole.Editor) return StatusCode(403, "You need to be an editor to delete sticker packs"); @@ -162,21 +173,21 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa return Ok(stickers); } - + [HttpGet("lookup/{identifier}")] public async Task> GetStickerByIdentifier(string identifier) { var sticker = await st.LookupStickerByIdentifierAsync(identifier); - + if (sticker is null) return NotFound(); return Ok(sticker); } - + [HttpGet("lookup/{identifier}/open")] public async Task> OpenStickerByIdentifier(string identifier) { var sticker = await st.LookupStickerByIdentifierAsync(identifier); - + if (sticker is null) return NotFound(); return Redirect($"/files/{sticker.ImageId}"); } @@ -203,11 +214,11 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa [HttpPatch("{packId:guid}/content/{id:guid}")] public async Task UpdateSticker(Guid packId, Guid id, [FromBody] StickerRequest request) { - if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) + if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); var permissionCheck = await _CheckStickerPackPermissions(packId, currentUser, PublisherMemberRole.Editor); - if (permissionCheck is not OkResult) + if (permissionCheck is not OkResult) return permissionCheck; var sticker = await db.Stickers @@ -215,13 +226,13 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa .Include(s => s.Pack) .ThenInclude(p => p.Publisher) .FirstOrDefaultAsync(e => e.Id == id && e.Pack.Id == packId); - - if (sticker is null) + + if (sticker is null) return NotFound(); if (request.Slug is not null) sticker.Slug = request.Slug; - + CloudFile? image = null; if (request.ImageId is not null) { @@ -238,11 +249,11 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa [HttpDelete("{packId:guid}/content/{id:guid}")] public async Task DeleteSticker(Guid packId, Guid id) { - if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) + if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); var permissionCheck = await _CheckStickerPackPermissions(packId, currentUser, PublisherMemberRole.Editor); - if (permissionCheck is not OkResult) + if (permissionCheck is not OkResult) return permissionCheck; var sticker = await db.Stickers @@ -250,8 +261,8 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa .Include(s => s.Pack) .ThenInclude(p => p.Publisher) .FirstOrDefaultAsync(e => e.Id == id && e.Pack.Id == packId); - - if (sticker is null) + + if (sticker is null) return NotFound(); await st.DeleteStickerAsync(sticker); @@ -264,30 +275,30 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa [RequiredPermission("global", "stickers.create")] public async Task CreateSticker(Guid packId, [FromBody] StickerRequest request) { - if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) + if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized(); - - if (string.IsNullOrWhiteSpace(request.Slug)) + + if (string.IsNullOrWhiteSpace(request.Slug)) return BadRequest("Slug is required."); - if (request.ImageId is null) + if (request.ImageId is null) return BadRequest("Image is required."); var permissionCheck = await _CheckStickerPackPermissions(packId, currentUser, PublisherMemberRole.Editor); - if (permissionCheck is not OkResult) + if (permissionCheck is not OkResult) return permissionCheck; var pack = await db.StickerPacks .Include(p => p.Publisher) .FirstOrDefaultAsync(e => e.Id == packId); - if (pack is null) + if (pack is null) return BadRequest("Sticker pack was not found."); - + var stickersCount = await db.Stickers.CountAsync(s => s.PackId == packId); if (stickersCount >= MaxStickersPerPack) return BadRequest($"Sticker pack has reached maximum capacity of {MaxStickersPerPack} stickers."); var image = await db.Files.FirstOrDefaultAsync(e => e.Id == request.ImageId); - if (image is null) + if (image is null) return BadRequest("Image was not found."); var sticker = new Sticker