20 KiB
IM Admin 内部查询接口缺口清单
目标:梳理 HotGo/Admin 迁移到“Admin 只访问 hotgo,IM Server 只访问租户库”后,IM Server 需要补齐的
/internal/admin-query/*只读接口。
当前日期:2026-08-27
适用项目:im_managerAdmin 后台、im_serverIM 服务端。
1. 背景
Kafka 写链路已经在 Admin 侧补齐:Admin 写操作落 im_admin_commands、im_admin_outbox,通过 Kafka 发给 IM Server,IM Server 执行业务后回传 im.admin.command.result。
查询链路还没有完全隔离。Admin 当前仍有不少页面通过 imtenant.DB() 或 resolveImTenantDB() 直连租户库。若要严格满足目标架构,Admin 查询租户业务数据时应调用 IM Server 的内部只读接口:
GET /internal/admin-query/tenants/{tenant_code}/...
IM Server 当前已经具备部分内部查询接口,但还不能覆盖 Admin 后台页面。
2. 已有接口
以下接口在 IM Server 当前实现中已经存在,可供 Admin 先迁移:
| 接口 | 用途 | 备注 |
|---|---|---|
GET /internal/admin-query/tenants/{tenant_code}/users/{user_id} |
用户详情 | 需要增强字段,见 P0。 |
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic} |
群详情和治理配置 | 需要增强 topic 基础字段,见 P0。 |
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/members |
群成员列表 | 当前偏 cursor 分页,Admin 表格还需要 total。 |
GET /internal/admin-query/tenants/{tenant_code}/messages/{topic}/{seq_id} |
消息详情 | 当前 Admin 暂未完整迁移消息页面。 |
GET /internal/admin-query/tenants/{tenant_code}/files/{file_id} |
文件详情 | 还缺文件列表和引用列表。 |
GET /internal/admin-query/tenants/{tenant_code}/kafka/dead-letters |
Kafka 死信列表 | Admin 已接入。 |
GET /internal/admin-query/tenants/{tenant_code}/kafka/dead-letters/{dead_id} |
Kafka 死信详情 | Admin 已接入。 |
3. 统一约定
3.1 鉴权
沿用 IM Server 内部 API HMAC 鉴权:
X-Service-Name
X-Timestamp
X-Nonce
X-Signature
服务端需要校验:
- service 是否存在。
- service 是否包含
admin_querycapability。 - timestamp 是否在允许窗口内。
- nonce 是否防重放。
- 签名是否匹配。
3.2 分页返回
Admin 的 BasicTable 更适合 page/per_page/total 格式。建议所有列表接口统一返回:
{
"code": 0,
"data": {
"items": [],
"total": 0,
"page": 1,
"per_page": 20
}
}
如果 IM Server 内部更适合 cursor,也建议同时返回:
{
"code": 0,
"data": {
"items": [],
"total": 0,
"page": 1,
"per_page": 20,
"next_cursor": "",
"has_more": false
}
}
3.3 详情返回
详情接口统一返回:
{
"code": 0,
"data": {}
}
3.4 时间与 ID
- 时间统一返回 RFC3339/RFC3339Nano 字符串。
- 雪花 ID、Tinode 用户 ID、19 位整数 ID 建议以字符串返回,避免前端丢精度。
- 入参同时兼容字符串 ID 和纯数字 ID 时,IM Server 内部自行解析。
4. P0:优先补齐
P0 是 Admin 当前核心页面迁移所需接口,补完后可以先迁移用户、群组、文件等高频页面。
4.1 用户列表
GET /internal/admin-query/tenants/{tenant_code}/users
用途:IM 用户管理列表。
建议查询参数:
| 参数 | 类型 | 说明 |
|---|---|---|
user_id |
string | 用户 ID,支持精确查询。 |
nickname |
string | 昵称模糊查询。 |
auth_name |
string | 登录标识,匹配 username/phone/email/凭证。 |
state |
int | 用户状态。 |
created_at_start |
string | 创建时间开始。 |
created_at_end |
string | 创建时间结束。 |
last_seen_start |
string | 最后在线开始。 |
last_seen_end |
string | 最后在线结束。 |
page |
int | 页码。 |
per_page |
int | 每页数量,最大建议 200。 |
建议返回字段:
| 字段 | 说明 |
|---|---|
user_id |
字符串用户 ID。 |
username |
用户名。 |
phone |
手机号。 |
nickname |
昵称。 |
public_account |
公开账号。 |
state |
用户状态。 |
gender |
性别。 |
region |
地区。 |
auth_names |
登录标识摘要。 |
credentials |
凭证摘要。 |
auth_version |
鉴权版本。 |
password_updated_at |
密码更新时间。 |
last_seen |
最后在线时间。 |
user_agent |
最后设备 UA。 |
created_at |
创建时间。 |
updated_at |
更新时间。 |
当前 Admin 直连涉及表:im_users、im_user_profiles、im_user_security、im_credentials。
4.2 用户详情增强
现有接口:
GET /internal/admin-query/tenants/{tenant_code}/users/{user_id}
建议增强返回字段:
| 字段 | 说明 |
|---|---|
profile |
结构化用户资料。 |
public |
Tinode public JSON。 |
trusted |
Tinode trusted JSON。 |
access |
访问权限 JSON。 |
tags |
标签。 |
security |
auth_version/password_updated_at 等安全信息。 |
credentials |
凭证列表,包含 method/value/done。 |
4.3 用户设备列表
GET /internal/admin-query/tenants/{tenant_code}/users/{user_id}/devices
用途:用户详情中的登录设备列表。
建议查询参数:
| 参数 | 类型 | 说明 |
|---|---|---|
device_id |
string | 设备 ID。 |
platform |
string | 平台。 |
page |
int | 页码。 |
per_page |
int | 每页数量。 |
建议返回字段:
| 字段 | 说明 |
|---|---|
device_id |
设备 ID。 |
platform |
平台。 |
user_agent |
UA。 |
last_seen |
最后在线。 |
created_at |
创建时间。 |
updated_at |
更新时间。 |
当前 Admin 直连涉及表:im_devices。
4.4 群列表
GET /internal/admin-query/tenants/{tenant_code}/groups
用途:IM 群组管理列表。
建议查询参数:
| 参数 | 类型 | 说明 |
|---|---|---|
topic |
string | 群 Topic。 |
owner_id |
string | 群主 ID。 |
state |
int | Tinode topic 状态。 |
group_status |
string | 业务群状态。 |
created_at_start |
string | 创建时间开始。 |
created_at_end |
string | 创建时间结束。 |
touched_at_start |
string | 活跃时间开始。 |
touched_at_end |
string | 活跃时间结束。 |
page |
int | 页码。 |
per_page |
int | 每页数量。 |
建议返回字段:
| 字段 | 说明 |
|---|---|
topic |
群 Topic。 |
state |
Tinode 状态。 |
owner_id |
群主 ID。 |
seq_id |
最新消息序号。 |
del_id |
删除序号。 |
sub_count |
Tinode 订阅成员数。 |
touched_at |
活跃时间。 |
created_at |
创建时间。 |
updated_at |
更新时间。 |
public |
Tinode public JSON。 |
trusted |
Tinode trusted JSON。 |
tags |
标签。 |
aux |
辅助 JSON。 |
group_name |
群名称。 |
avatar_file_id |
群头像文件 ID。 |
description |
群简介。 |
group_status |
业务群状态。 |
join_approval |
入群审批开关。 |
mute_all |
全员禁言。 |
member_upload_files |
成员上传文件。 |
member_private_chat |
成员私聊。 |
member_invite |
成员邀请。 |
max_member_count |
最大成员数。 |
max_admin_count |
最大管理员数。 |
business_member_count |
业务成员数。 |
settings_version |
治理配置版本。 |
settings_updated_at |
治理配置更新时间。 |
当前 Admin 直连涉及表:im_topics、im_group_settings。
4.5 群详情增强
现有接口:
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}
当前接口主要返回 im_group_settings。建议增强 Tinode topic 基础字段:
| 字段 | 说明 |
|---|---|
state |
Topic 状态。 |
seq_id |
最新消息序号。 |
del_id |
删除序号。 |
sub_count |
订阅数量。 |
public |
public JSON。 |
trusted |
trusted JSON。 |
access |
access JSON。 |
tags |
tags JSON。 |
aux |
aux JSON。 |
touched_at |
活跃时间。 |
4.6 群成员列表增强
现有接口:
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/members
建议增强查询参数:
| 参数 | 类型 | 说明 |
|---|---|---|
user_id |
string | 用户 ID 精确过滤。 |
role |
string | owner/admin/member。 |
member_status |
string | 成员状态。 |
q |
string | 昵称、公开账号等关键词。 |
eligible_role |
string | 候选角色筛选。 |
page |
int | 页码。 |
per_page |
int | 每页数量。 |
cursor |
string | 兼容 cursor 分页。 |
limit |
int | 兼容 cursor 分页。 |
建议增强返回:
| 字段 | 说明 |
|---|---|
total |
总数,Admin 表格需要。 |
items[].user_id |
用户 ID。 |
items[].nickname |
昵称。 |
items[].state |
用户状态。 |
items[].mode_want |
期望权限。 |
items[].mode_given |
授予权限。 |
items[].recv_seq_id |
接收序号。 |
items[].read_seq_id |
已读序号。 |
items[].del_id |
删除序号。 |
items[].role |
业务角色。 |
items[].member_status |
成员状态。 |
items[].group_nickname |
群昵称。 |
items[].pinned |
置顶。 |
items[].mute_notifications |
免打扰。 |
items[].join_source |
加入来源。 |
items[].joined_by |
邀请或处理人。 |
items[].joined_at |
加入时间。 |
items[].left_at |
离开时间。 |
items[].removed_by |
移除人。 |
items[].version |
版本。 |
当前 Admin 直连涉及表:im_group_members、im_subscriptions、im_users、im_user_profiles。
4.7 入群申请列表
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/join-requests
建议查询参数:status、applicant_user_id、page、per_page。
建议返回字段:request_id、topic、applicant_user_id、inviter_user_id、source、message、status、reject_reason、handled_by、handled_at、expires_at、version、created_at、updated_at。
当前 Admin 直连涉及表:im_group_join_requests。
4.8 群邀请列表
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/invitations
建议查询参数:status、target_user_id、inviter_user_id、page、per_page。
建议返回字段:invitation_id、topic、inviter_user_id、target_user_id、message、status、result、join_request_id、expires_at、handled_at、created_at、updated_at。
当前 Admin 直连涉及表:im_group_invitations。
4.9 群公告列表
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/announcements
建议查询参数:status、page、per_page。
建议返回字段:announcement_id、topic、author_user_id、content、status、version、published_at、deleted_by、deleted_at、created_at、updated_at。
当前 Admin 直连涉及表:im_group_announcements。
4.10 群禁言列表
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/mutes
建议查询参数:status、user_id、page、per_page。
建议返回字段:topic、user_id、muted_by、muted_at、expires_at、reason、status、revoked_by、revoked_at、version、created_at、updated_at。
当前 Admin 直连涉及表:im_group_mutes。
4.11 群管理日志
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/admin-logs
建议查询参数:action、operator_id、page、per_page。
建议返回字段:log_id、topic、operator_id、target_user_id、action、object_type、object_id、before_data、after_data、request_id、idempotency_key、created_at。
当前 Admin 直连涉及表:im_group_admin_logs。
4.12 群文件列表
GET /internal/admin-query/tenants/{tenant_code}/groups/{topic}/files
用途:群治理页面中的群文件列表。不要和已有单文件详情接口混淆。
建议查询参数:status、file_type、file_name、uploader_id、page、per_page。
建议返回字段:group_file_id、topic、file_id、source_topic、source_seq、uploader_id、file_name、mime_type、file_type、file_size、status、deleted_by、deleted_at、created_at、updated_at。
当前 Admin 直连涉及表:im_group_files。
4.13 文件列表
GET /internal/admin-query/tenants/{tenant_code}/files
用途:IM 文件管理列表。
建议查询参数:file_id、user_id、status、mime_type、created_at_start、created_at_end、page、per_page。
建议返回字段:id、file_id、user_id、mime_type、file_size、file_name、location、etag、status、quarantine_reason、created_at、updated_at。
当前 Admin 直连涉及表:im_fileuploads。
4.14 文件引用列表
GET /internal/admin-query/tenants/{tenant_code}/files/{file_id}/links
用途:文件详情中展示消息引用。
建议返回字段:topic、seq_id、user_id、created_at。
当前 Admin 直连涉及表:im_filemsglinks。
5. P1:后台审核和运营页面
5.1 审计日志
GET /internal/admin-query/tenants/{tenant_code}/audit-logs
GET /internal/admin-query/tenants/{tenant_code}/audit-logs/{id}
建议查询参数:actor_user_id、action、target_type、target_id、created_at_start、created_at_end、page、per_page。
建议返回字段:id、request_id、actor_user_id、action、target_type、target_id、ip、user_agent、detail、created_at。
当前 Admin 直连涉及表:im_audit_logs。
5.2 实名审核
GET /internal/admin-query/tenants/{tenant_code}/realname-verifications
GET /internal/admin-query/tenants/{tenant_code}/realname-verifications/{id}
建议查询参数:user_id、status、real_name、created_at_start、created_at_end、page、per_page。
建议返回字段:id、user_id、real_name、id_card_no_masked、front_file_id、back_file_id、status、reject_reason、reviewed_by、reviewed_at、created_at、updated_at。
当前 Admin 直连涉及表:im_realname_verifications。
5.3 举报工单
GET /internal/admin-query/tenants/{tenant_code}/abuse-reports
GET /internal/admin-query/tenants/{tenant_code}/abuse-reports/{id}
GET /internal/admin-query/tenants/{tenant_code}/reports/abuse/{report_id}/target
建议查询参数:reporter_user_id、target_type、target_id、status、created_at_start、created_at_end、page、per_page。
建议返回字段:id、report_id、reporter_user_id、target_type、target_id、reason_code、description、evidence_file_ids、status、handler_id、handled_at、handle_result、created_at、updated_at。
当前 Admin 直连涉及表:im_abuse_reports。
5.4 意见反馈
GET /internal/admin-query/tenants/{tenant_code}/feedback-submissions
GET /internal/admin-query/tenants/{tenant_code}/feedback-submissions/{id}
建议查询参数:user_id、category、status、created_at_start、created_at_end、page、per_page。
建议返回字段:id、feedback_id、user_id、category、content、contact、file_ids、status、handler_id、handled_at、reply、created_at、updated_at。
当前 Admin 直连涉及表:im_feedback_submissions。
5.5 业务 Outbox
GET /internal/admin-query/tenants/{tenant_code}/outbox/business-events
GET /internal/admin-query/tenants/{tenant_code}/outbox/group-events
GET /internal/admin-query/tenants/{tenant_code}/outbox/business-events/{id}
GET /internal/admin-query/tenants/{tenant_code}/outbox/group-events/{id}
建议查询参数:event_type、status、target_type、target、created_at_start、created_at_end、page、per_page。
当前 Admin 直连涉及表:im_business_events_outbox、im_group_events_outbox。
6. P2:如果要完全消除租户库直连
这些不是 Kafka 联调第一优先级,但如果最终要求 Admin 完全不碰租户库,也需要 IM Server 提供内部查询或改为 hotgo 摘要表。
6.1 组织架构
GET /internal/admin-query/tenants/{tenant_code}/org/departments
GET /internal/admin-query/tenants/{tenant_code}/org/members
当前 Admin 直连涉及表:im_org_departments、im_org_members、im_users。
6.2 工作台应用
GET /internal/admin-query/tenants/{tenant_code}/workbench/apps
当前 Admin 直连涉及工作台相关租户表。
6.3 租户任务看板摘要
GET /internal/admin-query/tenants/{tenant_code}/dashboard/summary
当前 Admin 会统计多个租户库中的待处理实名、举报、反馈、Outbox 等数量。
6.4 租户配置类查询
如果这些配置仍放在租户库,也需要补接口;如果后续迁到 hotgo 控制库,则不需要通过 IM Server 查询。
GET /internal/admin-query/tenants/{tenant_code}/feedback-config
GET /internal/admin-query/tenants/{tenant_code}/mailbox-config
GET /internal/admin-query/tenants/{tenant_code}/abuse-reasons
GET /internal/admin-query/tenants/{tenant_code}/app-releases
涉及模块:反馈配置、总经理信箱配置、举报原因、App 发布策略。
6.5 IM Server 补齐状态
截至 2026-08-27,IM Server 已补齐本清单中的内部查询入口,统一走 /internal/admin-query/tenants/{tenant_code}/...,并沿用 HMAC 鉴权。
已接入范围:
- P0:用户列表、用户详情增强、用户设备、群列表、群详情增强、群成员 total、入群申请、群邀请、群公告、群禁言、群管理日志、群文件、文件列表、文件详情、文件引用。
- P1:审计日志、实名审核、举报工单、举报目标快照、意见反馈、业务 Outbox、群 Outbox。
- P2:组织部门、组织成员、工作台应用、任务看板摘要、反馈配置、总经理信箱配置、举报原因、App 发布策略。
实现说明:
- IM Server 内部使用白名单只读查询规格,不提供任意 SQL 入口。
- 列表接口统一返回
items/total/page/per_page。 - 详情接口统一返回单对象。
- 复杂字段先返回租户库原始 JSON 或轻量关联摘要,Admin 联调时如需展示专用字段再做二次增强。
- 若租户库未创建某些 P1/P2 表,对应接口会返回内部错误;发版前需要确保租户库 schema 已完整迁移。
7. Admin 侧迁移建议
7.1 第一批迁移
在 IM Server 补完 P0 后,Admin 优先迁移:
- 用户列表、用户详情、用户设备。
- 群列表、群详情、群成员。
- 群入群申请、邀请、公告、禁言、管理日志、群文件。
- 文件列表、文件详情、文件引用。
7.2 第二批迁移
在 IM Server 补完 P1 后,Admin 再迁移:
- 审计日志。
- 实名审核。
- 举报工单。
- 意见反馈。
- 业务 Outbox。
7.3 保留 hotgo 查询的范围
以下数据天然属于 hotgo 控制库,Admin 可继续查 hotgo,不需要走 IM Server:
- 租户表和租户绑定表。
- Admin 命令表:
im_admin_commands。 - Admin Outbox 表:
im_admin_outbox。 - Admin Kafka 审计事件表:
im_audit_events。 - 菜单、角色、管理员、系统配置、字典等 HotGo 系统表。
8. 验收标准
- Admin 查询租户业务数据时,不再出现新的
imtenant.DB()调用。 - Admin 查询 IM Server 内部接口时,统一使用 HMAC 签名。
- 列表接口支持
page/per_page/total,兼容后台表格分页。 - 详情接口返回结构化 JSON,不返回数据库内部敏感字段。
- 用户 ID、雪花 ID 等大整数以字符串返回。
- IM Server 为内部查询写审计日志,至少包含
tenant_code、service_name、path、query、trace_id、status、duration_ms。 - 关闭 IM Server 内部查询能力时,Admin 应得到明确错误,不泄露租户库信息。