From c3095f2a9ba13528233700c62efb0387acfd5014 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 31 May 2025 12:11:45 +0800 Subject: [PATCH] :recycle: Refactor the publisher loading in posts --- DysonNetwork.Sphere/AppDatabase.cs | 71 ++++++++++++++++------ DysonNetwork.Sphere/Post/PostController.cs | 5 +- DysonNetwork.Sphere/Post/PostService.cs | 41 +++++++++++++ DysonNetwork.sln.DotSettings.user | 1 + 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/DysonNetwork.Sphere/AppDatabase.cs b/DysonNetwork.Sphere/AppDatabase.cs index d5bdaa0..272cc37 100644 --- a/DysonNetwork.Sphere/AppDatabase.cs +++ b/DysonNetwork.Sphere/AppDatabase.cs @@ -3,6 +3,7 @@ using DysonNetwork.Sphere.Permission; using DysonNetwork.Sphere.Publisher; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Query; using NodaTime; using Npgsql; using Quartz; @@ -49,7 +50,7 @@ public class AppDatabase( public DbSet PublisherMembers { get; set; } public DbSet PublisherSubscriptions { get; set; } public DbSet PublisherFeatures { get; set; } - + public DbSet Posts { get; set; } public DbSet PostReactions { get; set; } public DbSet PostTags { get; set; } @@ -64,10 +65,10 @@ public class AppDatabase( public DbSet ChatMessages { get; set; } public DbSet ChatRealtimeCall { get; set; } public DbSet ChatReactions { get; set; } - + public DbSet Stickers { get; set; } public DbSet StickerPacks { get; set; } - + public DbSet Wallets { get; set; } public DbSet WalletPockets { get; set; } public DbSet PaymentOrders { get; set; } @@ -75,14 +76,14 @@ public class AppDatabase( public DbSet CustomApps { get; set; } public DbSet CustomAppSecrets { get; set; } - + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dataSourceBuilder = new NpgsqlDataSourceBuilder(configuration.GetConnectionString("App")); dataSourceBuilder.EnableDynamicJson(); dataSourceBuilder.UseNetTopologySuite(); dataSourceBuilder.UseNodaTime(); - + if (configuration.GetValue("Debug")) optionsBuilder.EnableSensitiveDataLogging(); @@ -104,20 +105,20 @@ public class AppDatabase( { Key = "default", Nodes = new List - { - "posts.create", - "posts.react", - "publishers.create", - "files.create", - "chat.create", - "chat.messages.create", - "chat.realtime.create", - "accounts.statuses.create", - "accounts.statuses.update", - "stickers.packs.create", - "stickers.create" - }.Select(permission => - PermissionService.NewPermissionNode("group:default", "global", permission, true)) + { + "posts.create", + "posts.react", + "publishers.create", + "files.create", + "chat.create", + "chat.messages.create", + "chat.realtime.create", + "accounts.statuses.create", + "accounts.statuses.update", + "stickers.packs.create", + "stickers.create" + }.Select(permission => + PermissionService.NewPermissionNode("group:default", "global", permission, true)) .ToList() }); await context.SaveChangesAsync(cancellationToken); @@ -359,4 +360,36 @@ public class AppDatabaseFactory : IDesignTimeDbContextFactory var optionsBuilder = new DbContextOptionsBuilder(); return new AppDatabase(optionsBuilder.Options, configuration); } +} + +public static class OptionalQueryExtensions +{ + public static IQueryable If( + this IQueryable source, + bool condition, + Func, IQueryable> transform + ) + { + return condition ? transform(source) : source; + } + + public static IQueryable If( + this IIncludableQueryable source, + bool condition, + Func, IQueryable> transform + ) + where T : class + { + return condition ? transform(source) : source; + } + + public static IQueryable If( + this IIncludableQueryable> source, + bool condition, + Func>, IQueryable> transform + ) + where T : class + { + return condition ? transform(source) : source; + } } \ No newline at end of file diff --git a/DysonNetwork.Sphere/Post/PostController.cs b/DysonNetwork.Sphere/Post/PostController.cs index 2ea3b7c..344bfc6 100644 --- a/DysonNetwork.Sphere/Post/PostController.cs +++ b/DysonNetwork.Sphere/Post/PostController.cs @@ -40,7 +40,7 @@ public class PostController( .FilterWithVisibility(currentUser, userFriends, isListing: true) .CountAsync(); var posts = await query - .Include(e => e.Publisher) + .Include(e => e.RepliedPost) .Include(e => e.ThreadedPost) .Include(e => e.ForwardedPost) .Include(e => e.Attachments) @@ -53,6 +53,7 @@ public class PostController( .Take(take) .ToListAsync(); posts = PostService.TruncatePostContent(posts); + posts = await ps.LoadPublishers(posts); var postsId = posts.Select(e => e.Id).ToList(); var reactionMaps = await ps.GetPostReactionMapBatch(postsId); @@ -106,7 +107,6 @@ public class PostController( .CountAsync(); var posts = await db.Posts .Where(e => e.RepliedPostId == id) - .Include(e => e.Publisher) .Include(e => e.ThreadedPost) .Include(e => e.ForwardedPost) .Include(e => e.Attachments) @@ -118,6 +118,7 @@ public class PostController( .Take(take) .ToListAsync(); posts = PostService.TruncatePostContent(posts); + posts = await ps.LoadPublishers(posts); var postsId = posts.Select(e => e.Id).ToList(); var reactionMaps = await ps.GetPostReactionMapBatch(postsId); diff --git a/DysonNetwork.Sphere/Post/PostService.cs b/DysonNetwork.Sphere/Post/PostService.cs index 90d1d5c..f4785a4 100644 --- a/DysonNetwork.Sphere/Post/PostService.cs +++ b/DysonNetwork.Sphere/Post/PostService.cs @@ -271,6 +271,47 @@ public class PostService( ) ); } + + public async Task> LoadPublishers(List posts) + { + var publisherIds = posts + .Where(e => e.Publisher.AccountId != null) + .SelectMany(e => + [ + e.Publisher.Id, + e.RepliedPost?.Publisher.Id, + e.ForwardedPost?.Publisher.Id, + e.ThreadedPost?.Publisher.Id + ]) + .Where(e => e != null) + .Distinct() + .ToList(); + if (publisherIds.Count == 0) return posts; + + var publishers = await db.Publishers + .Where(e => e.AccountId != null && publisherIds.Contains(e.AccountId.Value)) + .ToDictionaryAsync(e => e.AccountId!.Value); + + foreach (var post in posts) + { + if (publishers.TryGetValue(post.Publisher.Id, out var publisher)) + post.Publisher = publisher; + + if (post.RepliedPost?.Publisher.Id != null && + publishers.TryGetValue(post.RepliedPost.Publisher.Id, out var repliedPublisher)) + post.RepliedPost.Publisher = repliedPublisher; + + if (post.ForwardedPost?.Publisher.Id != null && + publishers.TryGetValue(post.ForwardedPost.Publisher.Id, out var forwardedPublisher)) + post.ForwardedPost.Publisher = forwardedPublisher; + + if (post.ThreadedPost?.Publisher.Id != null && + publishers.TryGetValue(post.ThreadedPost.Publisher.Id, out var threadedPublisher)) + post.ThreadedPost.Publisher = threadedPublisher; + } + + return posts; + } } public static class PostQueryExtensions diff --git a/DysonNetwork.sln.DotSettings.user b/DysonNetwork.sln.DotSettings.user index dcf78d8..7ae25af 100644 --- a/DysonNetwork.sln.DotSettings.user +++ b/DysonNetwork.sln.DotSettings.user @@ -23,6 +23,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded