feat(admin): account governance and user sync pages
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* 账号治理接口(对齐 @photo/contracts tags [admin]:listAdminUsers 管理列表
|
||||
* 模式 / updateAdminUser / resetAdminUserPassword / activateAdminUser /
|
||||
* deactivateAdminUser)
|
||||
*
|
||||
* - 管理列表不带 accountPrefix(带了即切到邀请前缀查询模式,见 api/albums
|
||||
* fetchLookupUsers):全量用户 + query/status 过滤 + createdAt+ID 倒序游标
|
||||
* - PATCH 部分语义(role/localLocked/displayName;sourceStatus 只读展示)
|
||||
* - 自我保护在服务层(自改角色/自锁 400 VALIDATION_FAILED,http 层已本地化)
|
||||
* - activate 仅管 credentialStatus 维度(pending→active,初始凭据经
|
||||
* reset-password 出具);deactivate = localLocked=true + 撤全部会话
|
||||
*/
|
||||
import request from '@/utils/http'
|
||||
|
||||
/** 管理列表(全量用户 + query/status 过滤 + 游标分页) */
|
||||
export function fetchAdminUsers(params: Api.AdminUser.ListParams) {
|
||||
return request.get<Api.AdminUser.ListResponse>({ url: '/v1/admin/users', params })
|
||||
}
|
||||
|
||||
/** 更新用户治理属性(部分更新;服务端幂等 no-op 不落审计) */
|
||||
export function fetchUpdateAdminUser(userId: string, data: Api.AdminUser.UpdatePayload) {
|
||||
return request.patch<Api.AdminUser.Item>({ url: `/v1/admin/users/${userId}`, data })
|
||||
}
|
||||
|
||||
/** 管理员重置用户密码(指定或服务端生成;撤销目标全部既有会话) */
|
||||
export function fetchResetAdminUserPassword(
|
||||
userId: string,
|
||||
data: Api.AdminUser.ResetPasswordPayload
|
||||
) {
|
||||
return request.post<Api.AdminUser.ResetPasswordResponse>({
|
||||
url: `/v1/admin/users/${userId}/reset-password`,
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/** 激活待激活用户(credentialStatus pending→active,幂等;不出凭据) */
|
||||
export function fetchActivateAdminUser(userId: string) {
|
||||
return request.post<Api.AdminUser.Item>({ url: `/v1/admin/users/${userId}/activate` })
|
||||
}
|
||||
|
||||
/** 停用用户(localLocked=true + 撤销全部会话,幂等;上游状态不动) */
|
||||
export function fetchDeactivateAdminUser(userId: string) {
|
||||
return request.post<Api.AdminUser.Item>({ url: `/v1/admin/users/${userId}/deactivate` })
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* 用户同步管理接口(对齐 @photo/contracts tags [admin]:getUserSyncStatus /
|
||||
* listUserSyncRuns / triggerUserSyncRun / listUserSyncErrors)
|
||||
*
|
||||
* - status/runs/errors 为纯读;runs 为 startedAt+ID 倒序键集游标
|
||||
* - POST runs → 202 受理(异步执行;运行中批次复用其 runId),结果经
|
||||
* status/runs 轮询查询——页面侧的等待/轮询逻辑见 utils/system/syncPolling
|
||||
* - errors 按 runId 查单批次坏行明细(未知批次=空数组,契约无 404)
|
||||
*/
|
||||
import request from '@/utils/http'
|
||||
|
||||
/** 同步引擎状态 + 最近批次计数 */
|
||||
export function fetchUserSyncStatus() {
|
||||
return request.get<Api.UserSync.Status>({ url: '/v1/admin/user-sync/status' })
|
||||
}
|
||||
|
||||
/** 运行历史(游标分页) */
|
||||
export function fetchUserSyncRuns(params: { cursor?: string; limit?: number }) {
|
||||
return request.get<Api.UserSync.RunListResponse>({
|
||||
url: '/v1/admin/user-sync/runs',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/** 手动触发同步补拉(202 受理;与定时共用互斥锁) */
|
||||
export function fetchTriggerUserSyncRun() {
|
||||
return request.post<Api.UserSync.RunCreatedResponse>({ url: '/v1/admin/user-sync/runs' })
|
||||
}
|
||||
|
||||
/** 单批次失败明细(runId 必填) */
|
||||
export function fetchUserSyncErrors(runId: string) {
|
||||
return request.get<Api.UserSync.ErrorListResponse>({
|
||||
url: '/v1/admin/user-sync/errors',
|
||||
params: { runId }
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user