/** 编辑用户表单回填模型(任务 47):从用户行回填可编辑表单,镜像 Java AdminUserUpdateRequest。 */ import type { AdminUser } from '../../types/admin' import { CREATE_PASSWORD_MIN_LEN } from './user-create-model.ts' /** 编辑可选角色:超管不可改,未知归 normal;后端只收 admin|normal。 */ export type EditUserRole = 'normal' | 'admin' export interface EditUserForm { uid: number /** 仅展示用,后端不支持改用户名。 */ username: string /** 空串 = 不修改密码。 */ password: string role: EditUserRole /** 授权菜单 id;由授权数据加载后填充。 */ columnIds: number[] /** 后端原角色字符串,用于超管禁止编辑判定。 */ originalRole: string } export interface EditUserFormErrors { password?: string } /** 序列化到 PUT /api/admin/user/{uid} 的请求体(Java AdminUserUpdateRequest,空密码不下发)。 */ export interface EditUserUpdateRequest { role: EditUserRole columnIds: number[] password?: string } /** 行角色 → 可编辑角色:仅 admin 映射 admin,其余(含 unknown)归 normal。 */ export function editRoleOf(role: string | null | undefined): EditUserRole { return (role || '').trim().toLowerCase() === 'admin' ? 'admin' : 'normal' } /** 该角色是否允许被编辑:超级管理员不可编辑(镜像后端“不能修改超级管理员”)。 */ export function isEditableUser(role: string | null | undefined): boolean { return (role || '').trim().toLowerCase() !== 'super_admin' } /** 从用户行回填编辑表单:用户名只读、密码留空、columnIds 待授权加载填充。 */ export function fillEditUserForm(user: AdminUser): EditUserForm { const role = typeof user.role === 'string' ? user.role.trim() : '' return { uid: user.id, username: user.username || '', password: '', role: editRoleOf(role), columnIds: [], originalRole: role, } } /** 编辑表单校验:密码可留空(不改),非空时须达到最小长度。 */ export function validateEditUserForm(form: EditUserForm): { valid: boolean; errors: EditUserFormErrors } { const errors: EditUserFormErrors = {} const password = form.password || '' if (password && password.length < CREATE_PASSWORD_MIN_LEN) { errors.password = `密码至少${CREATE_PASSWORD_MIN_LEN}个字符,留空则不修改` } return { valid: Object.keys(errors).length === 0, errors } } /** 编辑表单 → 更新请求体:超管拒绝、空密码不下发、columnIds 拷贝不共享引用。 */ export function toEditUserUpdateRequest(form: EditUserForm): EditUserUpdateRequest { const originalRole = (form.originalRole || '').trim().toLowerCase() if (originalRole === 'super_admin') { throw new Error('不能修改超级管理员') } const role: EditUserRole = form.role === 'admin' ? 'admin' : 'normal' const request: EditUserUpdateRequest = { role, columnIds: Array.isArray(form.columnIds) ? form.columnIds.slice() : [], } const password = form.password || '' if (password) request.password = password return request }