🐛 Trying to fix stickers

This commit is contained in:
LittleSheep 2025-06-04 01:48:26 +08:00
parent 1f01a4088c
commit eacb7c8f2f
2 changed files with 13 additions and 11 deletions

View File

@ -187,15 +187,15 @@ public class StickerController(AppDatabase db, StickerService st) : ControllerBa
{ {
var sticker = await st.LookupStickerByIdentifierAsync(identifier); var sticker = await st.LookupStickerByIdentifierAsync(identifier);
if (sticker is null) return NotFound(); if (sticker?.Image is null) return NotFound();
return Redirect($"/files/{sticker.ImageId}"); return Redirect($"/files/{sticker.Image.Id}");
} }
[HttpGet("{packId:guid}/content/{id:guid}")] [HttpGet("{packId:guid}/content/{id:guid}")]
public async Task<ActionResult<Sticker>> GetSticker(Guid packId, Guid id) public async Task<ActionResult<Sticker>> GetSticker(Guid packId, Guid id)
{ {
var sticker = await db.Stickers var sticker = await db.Stickers
.Where(s => s.Pack.Id == packId && s.Id == id) .Where(s => s.PackId == packId && s.Id == id)
.Include(e => e.Pack) .Include(e => e.Pack)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (sticker is null) return NotFound(); if (sticker is null) return NotFound();

View File

@ -6,11 +6,13 @@ namespace DysonNetwork.Sphere.Sticker;
public class StickerService(AppDatabase db, FileService fs, FileReferenceService fileRefService, ICacheService cache) public class StickerService(AppDatabase db, FileService fs, FileReferenceService fileRefService, ICacheService cache)
{ {
public const string StickerFileUsageIdentifier = "sticker"; public const string StickerFileUsageIdentifier = "sticker";
private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(15); private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(15);
public async Task<Sticker> CreateStickerAsync(Sticker sticker) public async Task<Sticker> CreateStickerAsync(Sticker sticker)
{ {
if (sticker.Image is null) throw new ArgumentNullException(nameof(sticker.Image));
db.Stickers.Add(sticker); db.Stickers.Add(sticker);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
@ -31,7 +33,8 @@ public class StickerService(AppDatabase db, FileService fs, FileReferenceService
var stickerResourceId = $"sticker:{sticker.Id}"; var stickerResourceId = $"sticker:{sticker.Id}";
// Delete old references // Delete old references
var oldRefs = await fileRefService.GetResourceReferencesAsync(stickerResourceId, StickerFileUsageIdentifier); var oldRefs =
await fileRefService.GetResourceReferencesAsync(stickerResourceId, StickerFileUsageIdentifier);
foreach (var oldRef in oldRefs) foreach (var oldRef in oldRefs)
{ {
await fileRefService.DeleteReferenceAsync(oldRef.Id); await fileRefService.DeleteReferenceAsync(oldRef.Id);
@ -79,9 +82,8 @@ public class StickerService(AppDatabase db, FileService fs, FileReferenceService
var images = stickers.Select(s => s.Image).ToList(); var images = stickers.Select(s => s.Image).ToList();
// Delete all file references for each sticker in the pack // Delete all file references for each sticker in the pack
foreach (var sticker in stickers) foreach (var stickerResourceId in stickers.Select(sticker => $"sticker:{sticker.Id}"))
{ {
var stickerResourceId = $"sticker:{sticker.Id}";
await fileRefService.DeleteResourceReferencesAsync(stickerResourceId); await fileRefService.DeleteResourceReferencesAsync(stickerResourceId);
} }
@ -102,7 +104,7 @@ public class StickerService(AppDatabase db, FileService fs, FileReferenceService
{ {
identifier = identifier.ToLower(); identifier = identifier.ToLower();
// Try to get from the cache first // Try to get from the cache first
var cacheKey = $"StickerLookup_{identifier}"; var cacheKey = $"stickerlookup:{identifier}";
var cachedSticker = await cache.GetAsync<Sticker>(cacheKey); var cachedSticker = await cache.GetAsync<Sticker>(cacheKey);
if (cachedSticker is not null) if (cachedSticker is not null)
return cachedSticker; return cachedSticker;
@ -112,7 +114,7 @@ public class StickerService(AppDatabase db, FileService fs, FileReferenceService
.Include(e => e.Pack); .Include(e => e.Pack);
query = Guid.TryParse(identifier, out var guid) query = Guid.TryParse(identifier, out var guid)
? query.Where(e => e.Id == guid) ? query.Where(e => e.Id == guid)
: query.Where(e => (e.Pack.Prefix + e.Slug).ToLower() == identifier); : query.Where(e => EF.Functions.ILike(e.Pack.Prefix + e.Slug, identifier));
var sticker = await query.FirstOrDefaultAsync(); var sticker = await query.FirstOrDefaultAsync();
@ -126,7 +128,7 @@ public class StickerService(AppDatabase db, FileService fs, FileReferenceService
private async Task PurgeStickerCache(Sticker sticker) private async Task PurgeStickerCache(Sticker sticker)
{ {
// Remove both possible cache entries // Remove both possible cache entries
await cache.RemoveAsync($"StickerLookup_{sticker.Id}"); await cache.RemoveAsync($"stickerlookup:{sticker.Id}");
await cache.RemoveAsync($"StickerLookup_{sticker.Pack.Prefix}{sticker.Slug}"); await cache.RemoveAsync($"stickerlookup:{sticker.Pack.Prefix}{sticker.Slug}");
} }
} }