39 lines
1.8 KiB
C#
39 lines
1.8 KiB
C#
namespace WxAgent.Core;
|
|
|
|
public sealed record WechatDatabaseGroupMember(long MemberId, string Username, string DisplayName, bool IsOwner);
|
|
|
|
public sealed record WechatGroupMemberPage(string GroupUsername, IReadOnlyList<WechatDatabaseGroupMember> Members, int? NextOffset)
|
|
{
|
|
public bool HasMore => NextOffset is not null;
|
|
}
|
|
|
|
public static class WechatGroupMemberQuery
|
|
{
|
|
public const string Sql = """
|
|
SELECT m.member_id, c.username, c.nick_name, c.remark, cr.owner
|
|
FROM chat_room AS cr
|
|
JOIN chatroom_member AS m ON m.room_id = cr.id
|
|
JOIN contact AS c ON c.id = m.member_id
|
|
WHERE cr.username = $group
|
|
ORDER BY m.member_id LIMIT $limit OFFSET $offset;
|
|
""";
|
|
|
|
public static IReadOnlyList<KeyValuePair<string, object?>> Parameters(string groupUsername, int limit, int offset)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(groupUsername) || !groupUsername.EndsWith("@chatroom", StringComparison.Ordinal))
|
|
throw new WxAgentException(WxAgentErrorCode.InvalidArgument, "A stable @chatroom username is required.");
|
|
if (limit is < 1 or > 10000 || offset < 0 || offset > int.MaxValue - limit)
|
|
throw new WxAgentException(WxAgentErrorCode.InvalidArgument, "Member limit must be 1-10000 and offset must leave room for the next page.");
|
|
return new KeyValuePair<string, object?>[]
|
|
{
|
|
new("$group", groupUsername), new("$limit", limit + 1), new("$offset", offset)
|
|
};
|
|
}
|
|
|
|
public static WechatGroupMemberPage Page(string groupUsername, IReadOnlyList<WechatDatabaseGroupMember> rows, int limit, int offset)
|
|
{
|
|
_ = Parameters(groupUsername, limit, offset);
|
|
return new(groupUsername, rows.Take(limit).ToArray(), rows.Count > limit ? offset + limit : null);
|
|
}
|
|
}
|