💥 ♻️ Refactor cloud files' references, and loading system

This commit is contained in:
2025-06-01 19:18:23 +08:00
parent 02ae634690
commit 00229fd406
32 changed files with 5204 additions and 582 deletions

View File

@ -3,8 +3,10 @@ using Microsoft.EntityFrameworkCore;
namespace DysonNetwork.Sphere.Sticker;
public class StickerService(AppDatabase db, FileService fs, ICacheService cache)
public class StickerService(AppDatabase db, FileService fs, FileReferenceService fileRefService, ICacheService cache)
{
public const string StickerFileUsageIdentifier = "sticker";
private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(15);
public async Task<Sticker> CreateStickerAsync(Sticker sticker)
@ -12,18 +14,37 @@ public class StickerService(AppDatabase db, FileService fs, ICacheService cache)
db.Stickers.Add(sticker);
await db.SaveChangesAsync();
await fs.MarkUsageAsync(sticker.Image, 1);
var stickerResourceId = $"sticker:{sticker.Id}";
await fileRefService.CreateReferenceAsync(
sticker.Image.Id,
StickerFileUsageIdentifier,
stickerResourceId
);
return sticker;
}
public async Task<Sticker> UpdateStickerAsync(Sticker sticker, CloudFile? newImage)
{
if (newImage != null)
if (newImage is not null)
{
await fs.MarkUsageAsync(sticker.Image, -1);
sticker.Image = newImage;
await fs.MarkUsageAsync(sticker.Image, 1);
var stickerResourceId = $"sticker:{sticker.Id}";
// Delete old references
var oldRefs = await fileRefService.GetResourceReferencesAsync(stickerResourceId, StickerFileUsageIdentifier);
foreach (var oldRef in oldRefs)
{
await fileRefService.DeleteReferenceAsync(oldRef.Id);
}
sticker.Image = newImage.ToReferenceObject();
// Create new reference
await fileRefService.CreateReferenceAsync(
newImage.Id,
StickerFileUsageIdentifier,
stickerResourceId
);
}
db.Stickers.Update(sticker);
@ -37,9 +58,13 @@ public class StickerService(AppDatabase db, FileService fs, ICacheService cache)
public async Task DeleteStickerAsync(Sticker sticker)
{
var stickerResourceId = $"sticker:{sticker.Id}";
// Delete all file references for this sticker
await fileRefService.DeleteResourceReferencesAsync(stickerResourceId);
db.Stickers.Remove(sticker);
await db.SaveChangesAsync();
await fs.MarkUsageAsync(sticker.Image, -1);
// Invalidate cache for this sticker
await PurgeStickerCache(sticker);
@ -54,12 +79,21 @@ public class StickerService(AppDatabase db, FileService fs, ICacheService cache)
var images = stickers.Select(s => s.Image).ToList();
// Delete all file references for each sticker in the pack
foreach (var sticker in stickers)
{
var stickerResourceId = $"sticker:{sticker.Id}";
await fileRefService.DeleteResourceReferencesAsync(stickerResourceId);
}
// Delete any references for the pack itself
var packResourceId = $"stickerpack:{pack.Id}";
await fileRefService.DeleteResourceReferencesAsync(packResourceId);
db.Stickers.RemoveRange(stickers);
db.StickerPacks.Remove(pack);
await db.SaveChangesAsync();
await fs.MarkUsageRangeAsync(images, -1);
// Invalidate cache for all stickers in this pack
foreach (var sticker in stickers)
await PurgeStickerCache(sticker);