[backend/core] Use KeyedLocker when resolving pinned notes (ISH-67)

This commit is contained in:
Laura Hausmann 2024-03-01 03:43:50 +01:00
parent 81059291c3
commit 5082f15e75
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -704,18 +704,22 @@ public class UserService(
// Clean up user list memberships // Clean up user list memberships
await db.UserListMembers.Where(p => p.UserList.User == user && p.User == followee).ExecuteDeleteAsync(); await db.UserListMembers.Where(p => p.UserList.User == user && p.User == followee).ExecuteDeleteAsync();
} }
[SuppressMessage("ReSharper", "SuggestBaseTypeForParameter", Justification = "Method only makes sense for users")] [SuppressMessage("ReSharper", "SuggestBaseTypeForParameter", Justification = "Method only makes sense for users")]
private void UpdateUserPinnedNotesInBackground(ASActor actor, User user, bool force = false) private void UpdateUserPinnedNotesInBackground(ASActor actor, User user, bool force = false)
{ {
if (followupTaskSvc.IsBackgroundWorker && !force) return; if (followupTaskSvc.IsBackgroundWorker && !force) return;
if (KeyedLocker.IsInUse($"pinnedNotes:{user.Id}")) return;
_ = followupTaskSvc.ExecuteTask("UpdateUserPinnedNotes", async provider => _ = followupTaskSvc.ExecuteTask("UpdateUserPinnedNotes", async provider =>
{ {
var bgDb = provider.GetRequiredService<DatabaseContext>(); using (await KeyedLocker.LockAsync($"pinnedNotes:{user.Id}"))
var bgNoteSvc = provider.GetRequiredService<NoteService>(); {
var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id); var bgDb = provider.GetRequiredService<DatabaseContext>();
if (bgUser == null) return; var bgNoteSvc = provider.GetRequiredService<NoteService>();
await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser); var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id);
if (bgUser == null) return;
await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser);
}
}); });
} }