summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs41
1 files changed, 41 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs
new file mode 100644

index 00000000..1f28f9bd --- /dev/null +++ b/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs
@@ -0,0 +1,41 @@ +using ArcaneLibs.Extensions.Streams; +using Microsoft.AspNetCore.Mvc; +using Spacebar.AdminApi.TestClient.Services.Services; +using Spacebar.Cdn.Extensions; +using Spacebar.Cdn.Services; +using Spacebar.Interop.Cdn.Abstractions; + +namespace Spacebar.Cdn.Controllers; + +[ApiController] +public class ImagesAndStickerController(LruFileCache lfc, IFileSource fs, CdnWorkerService cws) : ControllerBase { + [HttpGet("/stickers/{id}")] + [HttpGet("/stickers/{id}.{ext}")] + [HttpGet("/emojis/{id}")] + [HttpGet("/emojis/{id}.{ext}")] + public async Task<IActionResult> GetUserAvatar(string id, string ext = "png") { + DiscordImageResizeParams resizeParams = Request.GetResizeParams(); + var cacheKey = Request.Path + resizeParams.ToSerializedName(); + LruFileCache.Entry? entry; + if (!Request.Query.Any() || resizeParams.Passthrough) { + var original = await fs.GetFile(Request.Path.ToString().Replace("."+ext, "")); + entry = new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + else + entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path.ToString().Replace("."+ext, "")); + var res = await cws.GetRawClient("q8").GetAsync("/scale" + Request.Path.ToString().Replace("."+ext, "") + Request.QueryString); + var outStream = await res.Content.ReadAsStreamAsync(); + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = res.Content.Headers.ContentType?.ToString() ?? original.MimeType + }; + }); + + return new FileContentResult(entry.Data, entry.MimeType); + } +} \ No newline at end of file