From b7ddbdcbaadf93f6e6677fcfd775e8bb24467a28 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 11 Mar 2024 01:37:44 +0100 Subject: [PATCH] [backend/federation] Fix polls being falsely marked as edited when results become available (ISH-128) --- .../Core/Services/NoteService.cs | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Iceshrimp.Backend/Core/Services/NoteService.cs b/Iceshrimp.Backend/Core/Services/NoteService.cs index e5526c65..b4b13d38 100644 --- a/Iceshrimp.Backend/Core/Services/NoteService.cs +++ b/Iceshrimp.Backend/Core/Services/NoteService.cs @@ -659,8 +659,11 @@ public class NoteService( if (dbNote.Text is not null) { - dbNote.Mentions = mentionedUserIds; - dbNote.MentionedRemoteUsers = remoteMentions; + if (!dbNote.Mentions.SequenceEqual(mentionedUserIds)) + dbNote.Mentions = mentionedUserIds; + if (!dbNote.MentionedRemoteUsers.SequenceEqual(remoteMentions)) + dbNote.MentionedRemoteUsers = remoteMentions; + if (dbNote.Visibility == Note.NoteVisibility.Specified) { var visibleUserIds = (await note.GetRecipients(actor) @@ -673,12 +676,16 @@ public class NoteService( visibleUserIds.Add(dbNote.ReplyUserId); // We want to make sure not to revoke visibility - dbNote.VisibleUserIds = visibleUserIds.Concat(dbNote.VisibleUserIds).Distinct().ToList(); + var missing = visibleUserIds.Except(dbNote.VisibleUserIds).ToList(); + if (missing.Count != 0) + dbNote.VisibleUserIds.AddRange(missing); } dbNote.Text = mentionsResolver.ResolveMentions(dbNote.Text, dbNote.UserHost, mentions, splitDomainMapping); dbNote.Tags = ResolveHashtags(dbNote.Text, note); } + + var isPollEdited = false; if (note is ASQuestion question) { @@ -703,6 +710,8 @@ public class NoteService( if (!dbNote.Poll.Choices.SequenceEqual(choices.Select(p => p.Name)) || dbNote.Poll.Multiple != (question.AnyOf != null)) { + isPollEdited = true; + await db.PollVotes.Where(p => p.Note == dbNote).ExecuteDeleteAsync(); dbNote.Poll.Choices = choices.Select(p => p.Name).Cast().ToList(); dbNote.Poll.Votes = choices.Select(p => (int?)p.Replies?.TotalItems ?? 0).ToList(); @@ -717,6 +726,8 @@ public class NoteService( } else { + isPollEdited = true; + var poll = new Poll { Note = dbNote, @@ -755,7 +766,11 @@ public class NoteService( dbNote.FileIds = files.Select(p => p.Id).ToList(); dbNote.AttachedFileTypes = files.Select(p => p.Type).ToList(); - dbNote.UpdatedAt = DateTime.UtcNow; + if (note is not ASQuestion || isPollEdited || db.Entry(dbNote).State != EntityState.Unchanged) + { + dbNote.UpdatedAt = DateTime.UtcNow; + await db.AddAsync(noteEdit); + } db.Update(dbNote); await db.AddAsync(noteEdit);