From e6aa61b03b9dcd5180de26ef14c7bb0464eda139 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 22 Oct 2025 23:31:42 +0800 Subject: [PATCH] :bug: Bug fixes in the Sphere still referencing the old realm db --- DysonNetwork.Pass/Realm/RealmServiceGrpc.cs | 12 +++++++++++ DysonNetwork.Shared/Models/Realm.cs | 5 +++-- DysonNetwork.Shared/Proto/realm.proto | 8 +++++++ .../Registry/RemoteRealmService.cs | 7 +++++++ .../Autocompletion/AutocompletionService.cs | 21 ++++++++----------- .../Publisher/PublisherController.cs | 6 ++++-- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs index 3e13bc3..7f7040e 100644 --- a/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs +++ b/DysonNetwork.Pass/Realm/RealmServiceGrpc.cs @@ -75,6 +75,18 @@ public class RealmServiceGrpc( return response; } + 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}%")) + .Take(request.Limit) + .ToListAsync(); + var response = new GetPublicRealmsResponse(); + response.Realms.AddRange(realms.Select(r => r.ToProtoValue())); + return response; + } + public override async Task SendInviteNotify(SendInviteNotifyRequest request, ServerCallContext context) { var member = request.Member; diff --git a/DysonNetwork.Shared/Models/Realm.cs b/DysonNetwork.Shared/Models/Realm.cs index 049f16e..2e6d749 100644 --- a/DysonNetwork.Shared/Models/Realm.cs +++ b/DysonNetwork.Shared/Models/Realm.cs @@ -39,7 +39,8 @@ public class SnRealm : ModelBase, IIdentifiedResource return new Realm { Id = Id.ToString(), - Name = Name + Name = Name, + Slug = Slug }; } @@ -49,7 +50,7 @@ public class SnRealm : ModelBase, IIdentifiedResource { Id = Guid.Parse(proto.Id), Name = proto.Name, - Slug = "", // Required but not in proto + Slug = proto.Slug, Description = "", IsCommunity = false, IsPublic = false diff --git a/DysonNetwork.Shared/Proto/realm.proto b/DysonNetwork.Shared/Proto/realm.proto index 99bb8c5..bbf2a05 100644 --- a/DysonNetwork.Shared/Proto/realm.proto +++ b/DysonNetwork.Shared/Proto/realm.proto @@ -15,6 +15,7 @@ import 'account.proto'; message Realm { string id = 1; string name = 2; + string slug = 3; } message RealmMember { @@ -38,6 +39,8 @@ service RealmService { rpc GetUserRealms(GetUserRealmsRequest) returns (GetUserRealmsResponse) {} // Get public realms rpc GetPublicRealms(google.protobuf.Empty) returns (GetPublicRealmsResponse) {} + // Search public realms + rpc SearchRealms(SearchRealmsRequest) returns (GetPublicRealmsResponse) {} // Send invitation notification rpc SendInviteNotify(SendInviteNotifyRequest) returns (google.protobuf.Empty) {} // Check if member has required role @@ -77,6 +80,11 @@ message GetPublicRealmsResponse { repeated Realm realms = 1; } +message SearchRealmsRequest { + string query = 1; + int32 limit = 2; +} + message SendInviteNotifyRequest { RealmMember member = 1; } diff --git a/DysonNetwork.Shared/Registry/RemoteRealmService.cs b/DysonNetwork.Shared/Registry/RemoteRealmService.cs index 93d3856..b4cb767 100644 --- a/DysonNetwork.Shared/Registry/RemoteRealmService.cs +++ b/DysonNetwork.Shared/Registry/RemoteRealmService.cs @@ -33,6 +33,13 @@ public class RemoteRealmService(RealmService.RealmServiceClient realms) return response.Realms.Select(SnRealm.FromProtoValue).ToList(); } + public async Task> SearchRealms(string query, int limit) + { + var request = new SearchRealmsRequest { Query = query, Limit = limit }; + var response = await realms.SearchRealmsAsync(request); + return response.Realms.Select(SnRealm.FromProtoValue).ToList(); + } + public async Task> GetRealmBatch(List ids) { var request = new GetRealmBatchRequest(); diff --git a/DysonNetwork.Sphere/Autocompletion/AutocompletionService.cs b/DysonNetwork.Sphere/Autocompletion/AutocompletionService.cs index 0f9cdda..5a3cf6b 100644 --- a/DysonNetwork.Sphere/Autocompletion/AutocompletionService.cs +++ b/DysonNetwork.Sphere/Autocompletion/AutocompletionService.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace DysonNetwork.Sphere.Autocompletion; -public class AutocompletionService(AppDatabase db, RemoteAccountService remoteAccountsHelper) +public class AutocompletionService(AppDatabase db, RemoteAccountService remoteAccountsHelper, RemoteRealmService remoteRealmService) { public async Task> GetAutocompletion(string content, Guid? chatId = null, Guid? realmId = null, int limit = 10) { @@ -95,17 +95,14 @@ public class AutocompletionService(AppDatabase db, RemoteAccountService remoteAc break; case "r": - var realms = await db.Realms - .Where(r => EF.Functions.Like(r.Slug, $"{query}%") || EF.Functions.Like(r.Name, $"{query}%")) - .Take(limit) - .Select(r => new DysonNetwork.Shared.Models.Autocompletion - { - Type = "realm", - Keyword = "@r/" + r.Slug, - Data = r - }) - .ToListAsync(); - results.AddRange(realms); + var realms = await remoteRealmService.SearchRealms(query, limit); + var autocompletions = realms.Select(r => new DysonNetwork.Shared.Models.Autocompletion + { + Type = "realm", + Keyword = "@r/" + r.Slug, + Data = r + }); + results.AddRange(autocompletions); break; case "c": diff --git a/DysonNetwork.Sphere/Publisher/PublisherController.cs b/DysonNetwork.Sphere/Publisher/PublisherController.cs index 0ec75fc..bc5cecc 100644 --- a/DysonNetwork.Sphere/Publisher/PublisherController.cs +++ b/DysonNetwork.Sphere/Publisher/PublisherController.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using DysonNetwork.Shared.Auth; using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; +using DysonNetwork.Shared.Registry; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -17,7 +18,8 @@ public class PublisherController( AccountService.AccountServiceClient accounts, FileService.FileServiceClient files, FileReferenceService.FileReferenceServiceClient fileRefs, - ActionLogService.ActionLogServiceClient als + ActionLogService.ActionLogServiceClient als, + RemoteRealmService remoteRealmService ) : ControllerBase { @@ -352,7 +354,7 @@ public class PublisherController( return BadRequest("Name and Nick are required."); if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); - var realm = await db.Realms.FirstOrDefaultAsync(r => r.Slug == realmSlug); + var realm = await remoteRealmService.GetRealmBySlug(realmSlug); if (realm == null) return NotFound("Realm not found"); var accountId = Guid.Parse(currentUser.Id);