✨ Reaction made status
This commit is contained in:
		@@ -47,6 +47,7 @@ public class Post : ModelBase, IIdentifiedResource, IActivity
 | 
			
		||||
    public int Downvotes { get; set; }
 | 
			
		||||
    [NotMapped] public Dictionary<string, int> ReactionsCount { get; set; } = new();
 | 
			
		||||
    [NotMapped] public int RepliesCount { get; set; }
 | 
			
		||||
    [NotMapped] public Dictionary<string, bool>? ReactionsMade { get; set; }
 | 
			
		||||
 | 
			
		||||
    public Guid? RepliedPostId { get; set; }
 | 
			
		||||
    public Post? RepliedPost { get; set; }
 | 
			
		||||
 
 | 
			
		||||
@@ -182,7 +182,8 @@ public partial class PostService(
 | 
			
		||||
                                    Title = localizer["PostReplyTitle", sender.Nick],
 | 
			
		||||
                                    Body = string.IsNullOrWhiteSpace(post.Title)
 | 
			
		||||
                                        ? localizer["PostReplyBody", sender.Nick, ChopPostForNotification(post).content]
 | 
			
		||||
                                        : localizer["PostReplyContentBody", sender.Nick, post.Title, ChopPostForNotification(post).content],
 | 
			
		||||
                                        : localizer["PostReplyContentBody", sender.Nick, post.Title,
 | 
			
		||||
                                            ChopPostForNotification(post).content],
 | 
			
		||||
                                    IsSavable = true,
 | 
			
		||||
                                    ActionUri = $"/posts/{post.Id}"
 | 
			
		||||
                                }
 | 
			
		||||
@@ -519,6 +520,24 @@ public partial class PostService(
 | 
			
		||||
            );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<Dictionary<Guid, Dictionary<string, bool>>> GetPostReactionMadeMapBatch(List<Guid> postIds, Guid accountId)
 | 
			
		||||
    {
 | 
			
		||||
        var reactions = await db.Set<PostReaction>()
 | 
			
		||||
            .Where(r => postIds.Contains(r.PostId) && r.AccountId == accountId)
 | 
			
		||||
            .Select(r => new { r.PostId, r.Symbol })
 | 
			
		||||
            .ToListAsync();
 | 
			
		||||
 | 
			
		||||
        return postIds.ToDictionary(
 | 
			
		||||
            postId => postId,
 | 
			
		||||
            postId => reactions
 | 
			
		||||
                .Where(r => r.PostId == postId)
 | 
			
		||||
                .ToDictionary(
 | 
			
		||||
                    r => r.Symbol,
 | 
			
		||||
                    _ => true
 | 
			
		||||
                )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Increases the view count for a post.
 | 
			
		||||
    /// Uses the flush buffer service to batch database updates for better performance.
 | 
			
		||||
@@ -595,20 +614,28 @@ public partial class PostService(
 | 
			
		||||
        var postsId = posts.Select(e => e.Id).ToList();
 | 
			
		||||
 | 
			
		||||
        var reactionMaps = await GetPostReactionMapBatch(postsId);
 | 
			
		||||
        var reactionMadeMap = currentUser is not null
 | 
			
		||||
            ? await GetPostReactionMadeMapBatch(postsId, Guid.Parse(currentUser.Id))
 | 
			
		||||
            : new Dictionary<Guid, Dictionary<string, bool>>();
 | 
			
		||||
        var repliesCountMap = await GetPostRepliesCountBatch(postsId);
 | 
			
		||||
 | 
			
		||||
        foreach (var post in posts)
 | 
			
		||||
        {
 | 
			
		||||
            // Set reactions count
 | 
			
		||||
            // Set reaction count
 | 
			
		||||
            post.ReactionsCount = reactionMaps.TryGetValue(post.Id, out var count)
 | 
			
		||||
                ? count
 | 
			
		||||
                : new Dictionary<string, int>();
 | 
			
		||||
 | 
			
		||||
            // Set replies count
 | 
			
		||||
            // Set reaction made status
 | 
			
		||||
            post.ReactionsMade = reactionMadeMap.TryGetValue(post.Id, out var made)
 | 
			
		||||
                ? made
 | 
			
		||||
                : [];
 | 
			
		||||
            
 | 
			
		||||
            // Set reply count
 | 
			
		||||
            post.RepliesCount = repliesCountMap.TryGetValue(post.Id, out var repliesCount)
 | 
			
		||||
                ? repliesCount
 | 
			
		||||
                : 0;
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            // Track view for each post in the list
 | 
			
		||||
            if (currentUser != null)
 | 
			
		||||
                await IncreaseViewCount(post.Id, currentUser.Id);
 | 
			
		||||
@@ -688,4 +715,4 @@ public static class PostQueryExtensions
 | 
			
		||||
                        (e.Publisher.AccountId != null && userFriends.Contains(e.Publisher.AccountId.Value)) ||
 | 
			
		||||
                        publishersId.Contains(e.PublisherId));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user