🐛 Fix realm query
This commit is contained in:
@@ -35,7 +35,8 @@ public class RealmServiceGrpc(
|
||||
: realm.ToProtoValue();
|
||||
}
|
||||
|
||||
public override async Task<GetRealmBatchResponse> GetRealmBatch(GetRealmBatchRequest request, ServerCallContext context)
|
||||
public override async Task<GetRealmBatchResponse> 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<GetPublicRealmsResponse> GetPublicRealms(Empty request, ServerCallContext context)
|
||||
public override Task<GetPublicRealmsResponse> 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<GetPublicRealmsResponse> SearchRealms(SearchRealmsRequest request, ServerCallContext context)
|
||||
public override async Task<GetPublicRealmsResponse> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -27,9 +27,12 @@ public class RemoteRealmService(RealmService.RealmServiceClient realms)
|
||||
return response.RealmIds.Select(Guid.Parse).ToList();
|
||||
}
|
||||
|
||||
public async Task<List<SnRealm>> GetPublicRealms()
|
||||
public async Task<List<SnRealm>> 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user