From 8380bffa292da0abcc398d6a9450f3a770f9096a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 11 Feb 2024 18:42:53 +0100 Subject: [PATCH] [backend/masto-client] Batch account rendering in NoteRenderer --- .../Mastodon/Renderers/NoteRenderer.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Renderers/NoteRenderer.cs b/Iceshrimp.Backend/Controllers/Mastodon/Renderers/NoteRenderer.cs index 0fe01110..a43e93dc 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Renderers/NoteRenderer.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Renderers/NoteRenderer.cs @@ -15,9 +15,13 @@ public class NoteRenderer( MfmConverter mfmConverter, DatabaseContext db ) { - public async Task RenderAsync(Note note, List? mentions = null, int recurse = 2) { - var uri = note.Uri ?? $"https://{config.Value.WebDomain}/notes/{note.Id}"; - var renote = note.Renote != null && recurse > 0 ? await RenderAsync(note.Renote, mentions, --recurse) : null; + public async Task RenderAsync(Note note, List? accounts = null, List? mentions = null, + int recurse = 2 + ) { + var uri = note.Uri ?? $"https://{config.Value.WebDomain}/notes/{note.Id}"; + var renote = note.Renote != null && recurse > 0 + ? await RenderAsync(note.Renote, accounts, mentions, --recurse) + : null; var text = note.Text; //TODO: append quote uri var content = text != null ? await mfmConverter.ToHtmlAsync(text, note.MentionedRemoteUsers) : null; @@ -37,11 +41,13 @@ public class NoteRenderer( mentions = [..mentions.Where(p => note.Mentions.Contains(p.Id))]; } + var account = accounts?.FirstOrDefault(p => p.Id == note.UserId) ?? await userRenderer.RenderAsync(note.User); + var res = new Status { Id = note.Id, Uri = uri, Url = note.Url ?? uri, - Account = await userRenderer.RenderAsync(note.User), //TODO: batch this + Account = account, ReplyId = note.ReplyId, ReplyUserId = note.ReplyUserId, Renote = renote, //TODO: check if it's a pure renote @@ -68,7 +74,7 @@ public class NoteRenderer( return res; } - private async Task> GetMentions(IReadOnlyCollection notes) { + private async Task> GetMentions(IEnumerable notes) { var ids = notes.SelectMany(n => n.Mentions).Distinct(); return await db.Users.Where(p => ids.Contains(p.Id)) .Select(u => new Mention { @@ -82,9 +88,14 @@ public class NoteRenderer( .ToListAsync(); } + private async Task> GetAccounts(IEnumerable users) { + return (await userRenderer.RenderManyAsync(users.DistinctBy(p => p.Id))).ToList(); + } + public async Task> RenderManyAsync(IEnumerable notes) { var noteList = notes.ToList(); + var accounts = await GetAccounts(noteList.Select(p => p.User)); var mentions = await GetMentions(noteList); - return await noteList.Select(async p => await RenderAsync(p, mentions)).AwaitAllAsync(); + return await noteList.Select(async p => await RenderAsync(p, accounts, mentions)).AwaitAllAsync(); } } \ No newline at end of file