✨ Realm and chat with status listing member API
This commit is contained in:
@@ -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; }
|
||||
|
||||
|
@@ -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(
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@@ -49,6 +49,7 @@ public class RealmMember : ModelBase
|
||||
public Realm Realm { get; set; } = null!;
|
||||
public Guid AccountId { get; set; }
|
||||
[NotMapped] public Account? Account { get; set; }
|
||||
[NotMapped] public AccountStatusReference? Status { get; set; }
|
||||
|
||||
public int Role { get; set; } = RealmMemberRole.Normal;
|
||||
public Instant? JoinedAt { get; set; }
|
||||
|
@@ -1,6 +1,7 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using DysonNetwork.Shared.Data;
|
||||
using DysonNetwork.Shared.Proto;
|
||||
using DysonNetwork.Shared.Registry;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
@@ -18,7 +19,8 @@ public class RealmController(
|
||||
FileService.FileServiceClient files,
|
||||
FileReferenceService.FileReferenceServiceClient fileRefs,
|
||||
ActionLogService.ActionLogServiceClient als,
|
||||
AccountService.AccountServiceClient accounts
|
||||
AccountService.AccountServiceClient accounts,
|
||||
AccountClientHelper accountsHelper
|
||||
) : Controller
|
||||
{
|
||||
[HttpGet("{slug}")]
|
||||
@@ -234,45 +236,52 @@ public class RealmController(
|
||||
.Where(m => m.RealmId == realm.Id)
|
||||
.Where(m => m.LeaveAt == null);
|
||||
|
||||
// if (withStatus)
|
||||
// {
|
||||
// var members = await query
|
||||
// .OrderBy(m => m.CreatedAt)
|
||||
// .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["X-Total"] = total.ToString();
|
||||
//
|
||||
// var result = members.Skip(offset).Take(take).ToList();
|
||||
//
|
||||
// return Ok(await rs.LoadMemberAccounts(result));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
var total = await query.CountAsync();
|
||||
Response.Headers["X-Total"] = total.ToString();
|
||||
if (withStatus)
|
||||
{
|
||||
var members = await query
|
||||
.OrderBy(m => m.JoinedAt)
|
||||
.ToListAsync();
|
||||
|
||||
var members = await query
|
||||
.OrderBy(m => m.CreatedAt)
|
||||
.Skip(offset)
|
||||
.Take(take)
|
||||
.ToListAsync();
|
||||
members = await rs.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 rs.LoadMemberAccounts(result));
|
||||
}
|
||||
else
|
||||
{
|
||||
var total = await query.CountAsync();
|
||||
Response.Headers["X-Total"] = total.ToString();
|
||||
|
||||
var members = await query
|
||||
.OrderBy(m => m.CreatedAt)
|
||||
.Skip(offset)
|
||||
.Take(take)
|
||||
.ToListAsync();
|
||||
members = await rs.LoadMemberAccounts(members);
|
||||
|
||||
return Ok(members.Where(m => m.Account is not null).ToList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -689,7 +698,7 @@ public class RealmController(
|
||||
.Where(c => c.RealmId == realm.Id)
|
||||
.Select(c => c.Id)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
db.Realms.Remove(realm);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
|
@@ -23,7 +23,7 @@ public class WebFeedService(
|
||||
PublisherId = publisher.Id,
|
||||
};
|
||||
|
||||
database.Set<WebFeed>().Add(feed);
|
||||
database.WebFeeds.Add(feed);
|
||||
await database.SaveChangesAsync();
|
||||
|
||||
return feed;
|
||||
|
Reference in New Issue
Block a user