🐛 Fix realm query
This commit is contained in:
@@ -35,7 +35,8 @@ public class RealmServiceGrpc(
|
|||||||
: realm.ToProtoValue();
|
: 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 ids = request.Ids.Select(Guid.Parse).ToList();
|
||||||
var realms = await db.Realms.Where(r => ids.Contains(r.Id)).ToListAsync();
|
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()) } };
|
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();
|
var response = new GetPublicRealmsResponse();
|
||||||
response.Realms.AddRange(realms.Select(r => r.ToProtoValue()));
|
response.Realms.AddRange(realmsQueryable.Select(r => r.ToProtoValue()));
|
||||||
return response;
|
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
|
var realms = await db.Realms
|
||||||
.Where(r => r.IsPublic)
|
.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)
|
.Take(request.Limit)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
var response = new GetPublicRealmsResponse();
|
var response = new GetPublicRealmsResponse();
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ service RealmService {
|
|||||||
// Get realms for a user
|
// Get realms for a user
|
||||||
rpc GetUserRealms(GetUserRealmsRequest) returns (GetUserRealmsResponse) {}
|
rpc GetUserRealms(GetUserRealmsRequest) returns (GetUserRealmsResponse) {}
|
||||||
// Get public realms
|
// Get public realms
|
||||||
rpc GetPublicRealms(google.protobuf.Empty) returns (GetPublicRealmsResponse) {}
|
rpc GetPublicRealms(GetPublicRealmsRequest) returns (GetPublicRealmsResponse) {}
|
||||||
// Search public realms
|
// Search public realms
|
||||||
rpc SearchRealms(SearchRealmsRequest) returns (GetPublicRealmsResponse) {}
|
rpc SearchRealms(SearchRealmsRequest) returns (GetPublicRealmsResponse) {}
|
||||||
// Send invitation notification
|
// Send invitation notification
|
||||||
@@ -84,6 +84,10 @@ message GetUserRealmsResponse {
|
|||||||
repeated string realm_ids = 1;
|
repeated string realm_ids = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetPublicRealmsRequest {
|
||||||
|
optional string order_by = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message GetPublicRealmsResponse {
|
message GetPublicRealmsResponse {
|
||||||
repeated Realm realms = 1;
|
repeated Realm realms = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,9 +27,12 @@ public class RemoteRealmService(RealmService.RealmServiceClient realms)
|
|||||||
return response.RealmIds.Select(Guid.Parse).ToList();
|
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();
|
return response.Realms.Select(SnRealm.FromProtoValue).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,24 +8,10 @@ public class DiscoveryService(RemoteRealmService remoteRealmService)
|
|||||||
string? query,
|
string? query,
|
||||||
int take = 10,
|
int take = 10,
|
||||||
int offset = 0,
|
int offset = 0,
|
||||||
bool randomizer = false
|
bool random = false
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var allRealms = await remoteRealmService.GetPublicRealms();
|
var allRealms = await remoteRealmService.GetPublicRealms(random ? "random" : "popularity");
|
||||||
var communityRealms = allRealms.Where(r => r.IsCommunity);
|
return allRealms.Where(r => r.IsCommunity).Skip(offset).Take(take).ToList();
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user