[backend/api] Include avatar and banner alt text in user renderer

This commit is contained in:
pancakes 2025-02-04 23:14:06 +10:00 committed by Laura Hausmann
parent 36c6092fd2
commit 26eab64e8c
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -21,6 +21,9 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, DatabaseConte
if (!data.Emojis.TryGetValue(user.Id, out var emoji)) if (!data.Emojis.TryGetValue(user.Id, out var emoji))
throw new Exception("DTO didn't contain emoji for user"); 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 return new UserResponse
{ {
Id = user.Id, Id = user.Id,
@ -28,9 +31,9 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, DatabaseConte
Host = user.Host, Host = user.Host,
DisplayName = user.DisplayName, DisplayName = user.DisplayName,
AvatarUrl = user.GetAvatarUrl(config.Value), AvatarUrl = user.GetAvatarUrl(config.Value),
AvatarAlt = user.Avatar?.Comment, AvatarAlt = avatarAlt,
BannerUrl = user.GetBannerUrl(config.Value), BannerUrl = user.GetBannerUrl(config.Value),
BannerAlt = user.Banner?.Comment, BannerAlt = bannerAlt,
InstanceName = instanceName, InstanceName = instanceName,
InstanceIconUrl = instanceIcon, InstanceIconUrl = instanceIcon,
Emojis = emoji, Emojis = emoji,
@ -44,7 +47,12 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, DatabaseConte
{ {
var instanceData = await GetInstanceDataAsync([user]); var instanceData = await GetInstanceDataAsync([user]);
var emojis = await GetEmojisAsync([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); return Render(user, data);
} }
@ -55,12 +63,33 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, DatabaseConte
return await db.Instances.Where(p => hosts.Contains(p.Host)).ToListAsync(); return await db.Instances.Where(p => hosts.Contains(p.Host)).ToListAsync();
} }
private async Task<Dictionary<string, string?>> GetAvatarAltAsync(IEnumerable<User> 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<Dictionary<string, string?>> GetBannerAltAsync(IEnumerable<User> 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<IEnumerable<UserResponse>> RenderManyAsync(IEnumerable<User> users) public async Task<IEnumerable<UserResponse>> RenderManyAsync(IEnumerable<User> users)
{ {
var userList = users.ToList(); var userList = users.ToList();
var data = new UserRendererDto 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)); return userList.Select(p => Render(p, data));
@ -93,5 +122,7 @@ public class UserRenderer(IOptions<Config.InstanceSection> config, DatabaseConte
{ {
public required List<Instance> InstanceData; public required List<Instance> InstanceData;
public required Dictionary<string, List<EmojiResponse>> Emojis; public required Dictionary<string, List<EmojiResponse>> Emojis;
public required Dictionary<string, string?> AvatarAlt;
public required Dictionary<string, string?> BannerAlt;
} }
} }