diff --git a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs index 7f7040e..81ddb83 100644 --- a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs +++ b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs @@ -35,7 +35,8 @@ public class RealmServiceGrpc( : realm.ToProtoValue(); } - public override async Task GetRealmBatch(GetRealmBatchRequest request, ServerCallContext context) + public override async Task GetRealmBatch(GetRealmBatchRequest request, + ServerCallContext context) { var ids = request.Ids.Select(Guid.Parse).ToList(); var realms = await db.Realms.Where(r => ids.Contains(r.Id)).ToListAsync(); @@ -67,19 +68,33 @@ public class RealmServiceGrpc( return new GetUserRealmsResponse { RealmIds = { realms.Select(g => g.ToString()) } }; } - public override async Task GetPublicRealms(Empty request, ServerCallContext context) + public override Task GetPublicRealms( + GetPublicRealmsRequest request, + ServerCallContext context + ) { - var realms = await db.Realms.Where(r => r.IsPublic).ToListAsync(); + var realmsQueryable = db.Realms.Where(r => r.IsPublic).AsQueryable(); + + realmsQueryable = 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) + }; + var response = new GetPublicRealmsResponse(); - response.Realms.AddRange(realms.Select(r => r.ToProtoValue())); - return response; + response.Realms.AddRange(realmsQueryable.Select(r => r.ToProtoValue())); + return Task.FromResult(response); } - public override async Task SearchRealms(SearchRealmsRequest request, ServerCallContext context) + public override async Task SearchRealms(SearchRealmsRequest request, + ServerCallContext context) { var realms = await db.Realms .Where(r => r.IsPublic) - .Where(r => EF.Functions.Like(r.Slug, $"{request.Query}%") || EF.Functions.Like(r.Name, $"{request.Query}%")) + .Where(r => EF.Functions.Like(r.Slug, $"{request.Query}%") || + EF.Functions.Like(r.Name, $"{request.Query}%")) .Take(request.Limit) .ToListAsync(); var response = new GetPublicRealmsResponse(); @@ -94,9 +109,9 @@ public class RealmServiceGrpc( .AsNoTracking() .Include(a => a.Profile) .FirstOrDefaultAsync(a => a.Id == Guid.Parse(member.AccountId)); - + if (account == null) throw new RpcException(new Status(StatusCode.NotFound, "Account not found")); - + CultureService.SetCultureInfo(account.Language); await pusher.SendPushNotificationToUserAsync( @@ -138,7 +153,7 @@ public class RealmServiceGrpc( .AsNoTracking() .Include(a => a.Profile) .FirstOrDefaultAsync(a => a.Id == Guid.Parse(member.AccountId)); - + var response = new RealmMember(member) { Account = account?.ToProtoValue() }; return response; } @@ -167,4 +182,4 @@ public class RealmServiceGrpc( return response; } -} +} \ No newline at end of file diff --git a/DysonNetwork.Shared/Proto/realm.proto b/DysonNetwork.Shared/Proto/realm.proto index e02f6dc..89b7abe 100644 --- a/DysonNetwork.Shared/Proto/realm.proto +++ b/DysonNetwork.Shared/Proto/realm.proto @@ -46,7 +46,7 @@ service RealmService { // Get realms for a user rpc GetUserRealms(GetUserRealmsRequest) returns (GetUserRealmsResponse) {} // Get public realms - rpc GetPublicRealms(google.protobuf.Empty) returns (GetPublicRealmsResponse) {} + rpc GetPublicRealms(GetPublicRealmsRequest) returns (GetPublicRealmsResponse) {} // Search public realms rpc SearchRealms(SearchRealmsRequest) returns (GetPublicRealmsResponse) {} // Send invitation notification @@ -84,6 +84,10 @@ message GetUserRealmsResponse { repeated string realm_ids = 1; } +message GetPublicRealmsRequest { + optional string order_by = 1; +} + message GetPublicRealmsResponse { repeated Realm realms = 1; } diff --git a/DysonNetwork.Shared/Registry/RemoteRealmService.cs b/DysonNetwork.Shared/Registry/RemoteRealmService.cs index b4cb767..e8f86d3 100644 --- a/DysonNetwork.Shared/Registry/RemoteRealmService.cs +++ b/DysonNetwork.Shared/Registry/RemoteRealmService.cs @@ -27,9 +27,12 @@ public class RemoteRealmService(RealmService.RealmServiceClient realms) return response.RealmIds.Select(Guid.Parse).ToList(); } - public async Task> GetPublicRealms() + public async Task> GetPublicRealms(string orderBy = "date") { - var response = await realms.GetPublicRealmsAsync(new Empty()); + var response = await realms.GetPublicRealmsAsync(new GetPublicRealmsRequest + { + OrderBy = orderBy + }); return response.Realms.Select(SnRealm.FromProtoValue).ToList(); } diff --git a/DysonNetwork.Sphere/Discovery/DiscoveryService.cs b/DysonNetwork.Sphere/Discovery/DiscoveryService.cs index 8ee124c..5ffb711 100644 --- a/DysonNetwork.Sphere/Discovery/DiscoveryService.cs +++ b/DysonNetwork.Sphere/Discovery/DiscoveryService.cs @@ -8,24 +8,10 @@ public class DiscoveryService(RemoteRealmService remoteRealmService) string? query, int take = 10, int offset = 0, - bool randomizer = false + bool random = false ) { - var allRealms = await remoteRealmService.GetPublicRealms(); - var communityRealms = allRealms.Where(r => r.IsCommunity); - - if (!string.IsNullOrEmpty(query)) - { - communityRealms = communityRealms.Where(r => - r.Name.Contains(query, StringComparison.OrdinalIgnoreCase) - ); - } - - // Since we don't have CreatedAt in the proto model, we'll just apply randomizer if requested - var orderedRealms = randomizer - ? communityRealms.OrderBy(_ => Random.Shared.Next()) - : communityRealms.OrderByDescending(q => q.Members.Count()); - - return orderedRealms.Skip(offset).Take(take).ToList(); + 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