From 0cc6f86f3b9ba390429e3f41d7838170e2cb366f Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 6 Jan 2026 22:32:02 +0800 Subject: [PATCH] :recycle: Remove the discovery service in the Sphere. --- .../Realm/RealmDiscoveryController.cs | 37 +++++++++++++++++++ DysonNetwork.Pass/Realm/RealmServiceGrpc.cs | 24 +++++++----- DysonNetwork.Shared/Proto/realm.proto | 2 + .../Registry/RemoteRealmService.cs | 5 ++- .../Discovery/DiscoveryController.cs | 18 --------- .../Discovery/DiscoveryService.cs | 17 --------- .../DysonNetwork.Sphere.csproj | 4 -- .../Startup/ServiceCollectionExtensions.cs | 2 - .../Timeline/TimelineService.cs | 4 +- 9 files changed, 58 insertions(+), 55 deletions(-) create mode 100644 DysonNetwork.Pass/Realm/RealmDiscoveryController.cs delete mode 100644 DysonNetwork.Sphere/Discovery/DiscoveryController.cs delete mode 100644 DysonNetwork.Sphere/Discovery/DiscoveryService.cs diff --git a/DysonNetwork.Pass/Realm/RealmDiscoveryController.cs b/DysonNetwork.Pass/Realm/RealmDiscoveryController.cs new file mode 100644 index 00000000..40fc124f --- /dev/null +++ b/DysonNetwork.Pass/Realm/RealmDiscoveryController.cs @@ -0,0 +1,37 @@ +using DysonNetwork.Shared.Models; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace DysonNetwork.Pass.Realm; + +[ApiController] +[Route("api/realms/discovery")] +public class RealmDiscoveryController(AppDatabase db) : ControllerBase +{ + [HttpGet] + public async Task>> GetRealmDiscovery( + [FromQuery] string? query, + [FromQuery] int take = 10, + [FromQuery] int offset = 0 + ) + { + var realmsQuery = db.Realms + .Where(r => r.IsCommunity) + .OrderByDescending(r => r.Members.Count) + .AsQueryable(); + if (!string.IsNullOrWhiteSpace(query)) + realmsQuery = realmsQuery.Where(r => + EF.Functions.ILike(r.Name, $"%{query}%") || + EF.Functions.ILike(r.Description, $"%{query}%") + ); + + var totalCount = await realmsQuery.CountAsync(); + Response.Headers["X-Total"] = totalCount.ToString(); + + var realms = await realmsQuery + .Take(take) + .Skip(offset) + .ToListAsync(); + return Ok(realms); + } +} \ No newline at end of file diff --git a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs index 81ddb830..ab3dcc47 100644 --- a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs +++ b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs @@ -68,24 +68,30 @@ public class RealmServiceGrpc( return new GetUserRealmsResponse { RealmIds = { realms.Select(g => g.ToString()) } }; } - public override Task GetPublicRealms( + public override async Task GetPublicRealms( GetPublicRealmsRequest request, ServerCallContext context ) { - var realmsQueryable = db.Realms.Where(r => r.IsPublic).AsQueryable(); + var realmsQuery = db.Realms.AsQueryable(); - realmsQueryable = request.OrderBy switch + realmsQuery = request.IsCommunity ? + realmsQuery.Where(r => r.IsCommunity) : + realmsQuery.Where(r => r.IsPublic); + + realmsQuery = request.OrderBy switch { - "random" => realmsQueryable.OrderBy(_ => EF.Functions.Random()), - "name" => realmsQueryable.OrderBy(r => r.Name), - "popularity" => realmsQueryable.OrderByDescending(r => r.Members.Count), - _ => realmsQueryable.OrderByDescending(r => r.CreatedAt) + "random" => realmsQuery.OrderBy(_ => EF.Functions.Random()), + "name" => realmsQuery.OrderBy(r => r.Name), + "popularity" => realmsQuery.OrderByDescending(r => r.Members.Count), + _ => realmsQuery.OrderByDescending(r => r.CreatedAt) }; + var realms = await realmsQuery.Take(request.Take).ToListAsync(); + var response = new GetPublicRealmsResponse(); - response.Realms.AddRange(realmsQueryable.Select(r => r.ToProtoValue())); - return Task.FromResult(response); + response.Realms.AddRange(realms.Select(r => r.ToProtoValue())); + return response; } public override async Task SearchRealms(SearchRealmsRequest request, diff --git a/DysonNetwork.Shared/Proto/realm.proto b/DysonNetwork.Shared/Proto/realm.proto index 89b7abea..1e57bddc 100644 --- a/DysonNetwork.Shared/Proto/realm.proto +++ b/DysonNetwork.Shared/Proto/realm.proto @@ -86,6 +86,8 @@ message GetUserRealmsResponse { message GetPublicRealmsRequest { optional string order_by = 1; + int32 take = 2; + bool is_community = 3; } message GetPublicRealmsResponse { diff --git a/DysonNetwork.Shared/Registry/RemoteRealmService.cs b/DysonNetwork.Shared/Registry/RemoteRealmService.cs index e8f86d38..f8e510ec 100644 --- a/DysonNetwork.Shared/Registry/RemoteRealmService.cs +++ b/DysonNetwork.Shared/Registry/RemoteRealmService.cs @@ -27,11 +27,12 @@ public class RemoteRealmService(RealmService.RealmServiceClient realms) return response.RealmIds.Select(Guid.Parse).ToList(); } - public async Task> GetPublicRealms(string orderBy = "date") + public async Task> GetPublicRealms(string orderBy = "date", int take = 20) { var response = await realms.GetPublicRealmsAsync(new GetPublicRealmsRequest { - OrderBy = orderBy + OrderBy = orderBy, + Take = take }); return response.Realms.Select(SnRealm.FromProtoValue).ToList(); } diff --git a/DysonNetwork.Sphere/Discovery/DiscoveryController.cs b/DysonNetwork.Sphere/Discovery/DiscoveryController.cs deleted file mode 100644 index 59ba95b3..00000000 --- a/DysonNetwork.Sphere/Discovery/DiscoveryController.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace DysonNetwork.Sphere.Discovery; - -[ApiController] -[Route("/api/discovery")] -public class DiscoveryController(DiscoveryService discoveryService) : ControllerBase -{ - [HttpGet("realms")] - public Task> GetPublicRealms( - [FromQuery] string? query, - [FromQuery] int take = 10, - [FromQuery] int offset = 0 - ) - { - return discoveryService.GetCommunityRealmAsync(query, take, offset); - } -} diff --git a/DysonNetwork.Sphere/Discovery/DiscoveryService.cs b/DysonNetwork.Sphere/Discovery/DiscoveryService.cs deleted file mode 100644 index 5ffb7118..00000000 --- a/DysonNetwork.Sphere/Discovery/DiscoveryService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using DysonNetwork.Shared.Registry; - -namespace DysonNetwork.Sphere.Discovery; - -public class DiscoveryService(RemoteRealmService remoteRealmService) -{ - public async Task> GetCommunityRealmAsync( - string? query, - int take = 10, - int offset = 0, - bool random = false - ) - { - var allRealms = await remoteRealmService.GetPublicRealms(random ? "random" : "popularity"); - return allRealms.Where(r => r.IsCommunity).Skip(offset).Take(take).ToList(); - } -} \ No newline at end of file diff --git a/DysonNetwork.Sphere/DysonNetwork.Sphere.csproj b/DysonNetwork.Sphere/DysonNetwork.Sphere.csproj index c20be9fa..316cba36 100644 --- a/DysonNetwork.Sphere/DysonNetwork.Sphere.csproj +++ b/DysonNetwork.Sphere/DysonNetwork.Sphere.csproj @@ -46,10 +46,6 @@ - - - - ResXFileCodeGenerator diff --git a/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs b/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs index add3a280..a0543529 100644 --- a/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs +++ b/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs @@ -5,7 +5,6 @@ using DysonNetwork.Shared.Cache; using DysonNetwork.Shared.Geometry; using DysonNetwork.Sphere.ActivityPub; using DysonNetwork.Sphere.Autocompletion; -using DysonNetwork.Sphere.Discovery; using DysonNetwork.Sphere.Localization; using DysonNetwork.Sphere.Poll; using DysonNetwork.Sphere.Post; @@ -94,7 +93,6 @@ public static class ServiceCollectionExtensions services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/DysonNetwork.Sphere/Timeline/TimelineService.cs b/DysonNetwork.Sphere/Timeline/TimelineService.cs index 141207a8..d1daab23 100644 --- a/DysonNetwork.Sphere/Timeline/TimelineService.cs +++ b/DysonNetwork.Sphere/Timeline/TimelineService.cs @@ -1,7 +1,6 @@ using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Shared.Registry; -using DysonNetwork.Sphere.Discovery; using DysonNetwork.Sphere.Post; using Microsoft.EntityFrameworkCore; using NodaTime; @@ -13,7 +12,6 @@ public class TimelineService( Publisher.PublisherService pub, Post.PostService ps, RemoteRealmService rs, - DiscoveryService ds, AccountService.AccountServiceClient accounts, RemoteWebArticleService webArticles ) @@ -194,7 +192,7 @@ public class TimelineService( private async Task GetRealmDiscoveryActivity(int count = 5) { - var realms = await ds.GetCommunityRealmAsync(null, count, 0, true); + var realms = await rs.GetPublicRealms("random", count); return realms.Count > 0 ? new TimelineDiscoveryEvent( realms.Select(x => new DiscoveryItem("realm", x)).ToList()