summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-02-28 19:49:44 +0100
committerRory& <root@rory.gay>2026-02-28 19:49:44 +0100
commit829ada260753e0e45e0ac1db20c8f19afd2420cf (patch)
treebe4a34e9c0c45f9c65f93021427bf4c54f896b53 /extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
parentonVoiceStateUpdate: change to VoiceState.merge() for copying properties (diff)
downloadserver-ts-829ada260753e0e45e0ac1db20c8f19afd2420cf.tar.xz
nix/cdn work
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs77
1 files changed, 77 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
new file mode 100644

index 00000000..97626609 --- /dev/null +++ b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
@@ -0,0 +1,77 @@ +using ArcaneLibs.Extensions.Streams; +using Microsoft.AspNetCore.Mvc; +using Spacebar.AdminApi.TestClient.Services.Services; +using Spacebar.Cdn.Extensions; +using Spacebar.Interop.Cdn.Abstractions; + +namespace Spacebar.Cdn.Controllers; + +[ApiController] +public class UserController(LruFileCache lfc, IFileSource fs, DiscordImageResizeService dirs) : ImageController { + [HttpGet("/avatars/{userId}/{hash}.{ext}")] + public async Task<IActionResult> GetUserAvatar(string userId, string hash, string ext) { + var originalKey = fs.BaseUrl + Request.Path; + var cacheKey = Request.Path + Request.QueryString; + + DiscordImageResizeParams resizeParams = GetResizeParams(); + + var entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path); + + if (Request.Query.Any()) { + using var img = await original.ToMagickImageCollectionAsync(); + dirs.Apply(img, resizeParams); + + var outStream = new MemoryStream(); + await img.WriteAsync(outStream, img.First().Format); + outStream.Position = 0; + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + + return new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + }); + + // byte array with mime type result + return new FileContentResult(entry.Data, entry.MimeType); + } + [HttpGet("/banners/{userId}/{hash}.{ext}")] + public async Task<IActionResult> GetUserBanner(string userId, string hash, string ext) { + var originalKey = fs.BaseUrl + Request.Path; + var cacheKey = Request.Path + Request.QueryString; + + DiscordImageResizeParams resizeParams = GetResizeParams(); + + var entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path); + + if (Request.Query.Any()) { + using var img = await original.ToMagickImageCollectionAsync(); + dirs.Apply(img, resizeParams); + + var outStream = new MemoryStream(); + await img.WriteAsync(outStream, img.First().Format); + outStream.Position = 0; + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + + return new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + }); + + // byte array with mime type result + return new FileContentResult(entry.Data, entry.MimeType); + } +} \ No newline at end of file