From 26eab64e8c0946184087908cf8d797cbaaa756d1 Mon Sep 17 00:00:00 2001 From: pancakes Date: Tue, 4 Feb 2025 23:14:06 +1000 Subject: [PATCH] [backend/api] Include avatar and banner alt text in user renderer --- .../Controllers/Web/Renderers/UserRenderer.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/Iceshrimp.Backend/Controllers/Web/Renderers/UserRenderer.cs b/Iceshrimp.Backend/Controllers/Web/Renderers/UserRenderer.cs index 5f114e50..766d2989 100644 --- a/Iceshrimp.Backend/Controllers/Web/Renderers/UserRenderer.cs +++ b/Iceshrimp.Backend/Controllers/Web/Renderers/UserRenderer.cs @@ -21,6 +21,9 @@ public class UserRenderer(IOptions config, DatabaseConte if (!data.Emojis.TryGetValue(user.Id, out var emoji)) throw new Exception("DTO didn't contain emoji for user"); + var avatarAlt = data.AvatarAlt.GetValueOrDefault(user.Id); + var bannerAlt = data.BannerAlt.GetValueOrDefault(user.Id); + return new UserResponse { Id = user.Id, @@ -28,9 +31,9 @@ public class UserRenderer(IOptions config, DatabaseConte Host = user.Host, DisplayName = user.DisplayName, AvatarUrl = user.GetAvatarUrl(config.Value), - AvatarAlt = user.Avatar?.Comment, + AvatarAlt = avatarAlt, BannerUrl = user.GetBannerUrl(config.Value), - BannerAlt = user.Banner?.Comment, + BannerAlt = bannerAlt, InstanceName = instanceName, InstanceIconUrl = instanceIcon, Emojis = emoji, @@ -44,7 +47,12 @@ public class UserRenderer(IOptions config, DatabaseConte { var instanceData = await GetInstanceDataAsync([user]); var emojis = await GetEmojisAsync([user]); - var data = new UserRendererDto { Emojis = emojis, InstanceData = instanceData }; + var avatarAlt = await GetAvatarAltAsync([user]); + var bannerAlt = await GetBannerAltAsync([user]); + var data = new UserRendererDto + { + Emojis = emojis, InstanceData = instanceData, AvatarAlt = avatarAlt, BannerAlt = bannerAlt + }; return Render(user, data); } @@ -55,12 +63,33 @@ public class UserRenderer(IOptions config, DatabaseConte return await db.Instances.Where(p => hosts.Contains(p.Host)).ToListAsync(); } + private async Task> GetAvatarAltAsync(IEnumerable users) + { + var ids = users.Select(p => p.Id).ToList(); + return await db.Users + .Where(p => ids.Contains(p.Id)) + .Include(p => p.Avatar) + .ToDictionaryAsync(p => p.Id, p => p.Avatar?.Comment); + } + + private async Task> GetBannerAltAsync(IEnumerable users) + { + var ids = users.Select(p => p.Id).ToList(); + return await db.Users + .Where(p => ids.Contains(p.Id)) + .Include(p => p.Banner) + .ToDictionaryAsync(p => p.Id, p => p.Banner?.Comment); + } + public async Task> RenderManyAsync(IEnumerable users) { var userList = users.ToList(); var data = new UserRendererDto { - InstanceData = await GetInstanceDataAsync(userList), Emojis = await GetEmojisAsync(userList) + InstanceData = await GetInstanceDataAsync(userList), + Emojis = await GetEmojisAsync(userList), + AvatarAlt = await GetAvatarAltAsync(userList), + BannerAlt = await GetBannerAltAsync(userList) }; return userList.Select(p => Render(p, data)); @@ -93,5 +122,7 @@ public class UserRenderer(IOptions config, DatabaseConte { public required List InstanceData; public required Dictionary> Emojis; + public required Dictionary AvatarAlt; + public required Dictionary BannerAlt; } }