From a92d127ff60c04b700728ffe84c3185ca1f06d14 Mon Sep 17 00:00:00 2001 From: Rory& Date: Sun, 12 Apr 2026 02:21:09 +0200 Subject: CDN-CS: it works!!! --- .../Spacebar.Cdn/Controllers/UserController.cs | 151 ++++++++++----------- 1 file changed, 74 insertions(+), 77 deletions(-) (limited to 'extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs') diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs index a6c47036..ee9ced71 100644 --- a/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs +++ b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs @@ -1,77 +1,74 @@ -// 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 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 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 +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 UserController(LruFileCache lfc, IFileSource fs, CdnWorkerService cws) : ControllerBase { + [HttpGet("/avatars/{userId}/{hash}")] + [HttpGet("/avatars/{userId}/{hash}.{ext}")] + public async Task GetUserAvatar(string userId, string hash, string ext = "png") { + DiscordImageResizeParams resizeParams = Request.GetResizeParams(); + var originalKey = fs.BaseUrl + Request.Path; + var cacheKey = Request.Path + resizeParams.ToSerializedName(); + LruFileCache.Entry? entry; + if (!Request.Query.Any() || resizeParams.Passthrough) { + var original = await fs.GetFile(Request.Path); + 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); + var res = await cws.GetRawClient("q8").GetAsync("/scale" + Request.Path + Request.QueryString); + var outStream = await res.Content.ReadAsStreamAsync(); + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = res.Content.Headers.ContentType?.ToString() ?? original.MimeType + }; + }); + + // byte array with mime type result + return new FileContentResult(entry.Data, entry.MimeType); + } + // [HttpGet("/banners/{userId}/{hash}.{ext}")] + // public async Task 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 -- cgit 1.5.1