Realm and chat with status listing member API

This commit is contained in:
2025-08-17 23:32:58 +08:00
parent aa9ae5c11e
commit b49cd1c382
10 changed files with 172 additions and 81 deletions

View File

@@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using DysonNetwork.Shared.Data;
using DysonNetwork.Shared.Proto;
using NodaTime;
using Account = DysonNetwork.Pass.Account.Account;
@@ -75,6 +76,7 @@ public class ChatMember : ModelBase
public ChatRoom ChatRoom { get; set; } = null!;
public Guid AccountId { get; set; }
[NotMapped] public Account? Account { get; set; }
[NotMapped] public AccountStatusReference? Status { get; set; }
[MaxLength(1024)] public string? Nick { get; set; }

View File

@@ -5,6 +5,7 @@ using DysonNetwork.Shared;
using DysonNetwork.Shared.Auth;
using DysonNetwork.Shared.Data;
using DysonNetwork.Shared.Proto;
using DysonNetwork.Shared.Registry;
using DysonNetwork.Sphere.Localization;
using DysonNetwork.Sphere.Realm;
using Grpc.Core;
@@ -25,7 +26,8 @@ public class ChatRoomController(
FileService.FileServiceClient files,
FileReferenceService.FileReferenceServiceClient fileRefs,
ActionLogService.ActionLogServiceClient als,
PusherService.PusherServiceClient pusher
PusherService.PusherServiceClient pusher,
AccountClientHelper accountsHelper
) : ControllerBase
{
[HttpGet("{id:guid}")]
@@ -164,7 +166,7 @@ public class ChatRoomController(
public class ChatRoomRequest
{
[Required][MaxLength(1024)] public string? Name { get; set; }
[Required] [MaxLength(1024)] public string? Name { get; set; }
[MaxLength(4096)] public string? Description { get; set; }
[MaxLength(32)] public string? PictureId { get; set; }
[MaxLength(32)] public string? BackgroundId { get; set; }
@@ -507,45 +509,52 @@ public class ChatRoomController(
.Where(m => m.ChatRoomId == roomId)
.Where(m => m.LeaveAt == null);
// if (withStatus)
// {
// var members = await query
// .OrderBy(m => m.JoinedAt)
// .ToListAsync();
//
// var memberStatuses = await aes.GetStatuses(members.Select(m => m.AccountId).ToList());
//
// if (!string.IsNullOrEmpty(status))
// {
// members = members.Where(m =>
// memberStatuses.TryGetValue(m.AccountId, out var s) && s.Label != null &&
// s.Label.Equals(status, StringComparison.OrdinalIgnoreCase)).ToList();
// }
//
// members = members.OrderByDescending(m => memberStatuses.TryGetValue(m.AccountId, out var s) && s.IsOnline)
// .ToList();
//
// var total = members.Count;
// Response.Headers.Append("X-Total", total.ToString());
//
// var result = members.Skip(skip).Take(take).ToList();
//
// return Ok(await crs.LoadMemberAccounts(result));
// }
// else
// {
var total = await query.CountAsync();
Response.Headers.Append("X-Total", total.ToString());
if (withStatus)
{
var members = await query
.OrderBy(m => m.JoinedAt)
.ToListAsync();
var members = await query
.OrderBy(m => m.JoinedAt)
.Skip(offset)
.Take(take)
.ToListAsync();
members = await crs.LoadMemberAccounts(members);
var memberStatuses = await accountsHelper.GetAccountStatusBatch(
members.Select(m => m.AccountId).ToList()
);
return Ok(members.Where(m => m.Account is not null).ToList());
// }
if (!string.IsNullOrEmpty(status))
{
members = members
.Select(m =>
{
m.Status = memberStatuses.TryGetValue(m.AccountId, out var s) ? s : null;
return m;
})
.ToList();
}
members = members
.OrderByDescending(m => m.Status?.IsOnline ?? false)
.ToList();
var total = members.Count;
Response.Headers.Append("X-Total", total.ToString());
var result = members.Skip(offset).Take(take).ToList();
return Ok(await crs.LoadMemberAccounts(result));
}
else
{
var total = await query.CountAsync();
Response.Headers.Append("X-Total", total.ToString());
var members = await query
.OrderBy(m => m.JoinedAt)
.Skip(offset)
.Take(take)
.ToListAsync();
members = await crs.LoadMemberAccounts(members);
return Ok(members.Where(m => m.Account is not null).ToList());
}
}
@@ -985,4 +994,4 @@ public class ChatRoomController(
}
);
}
}
}