cursor-init/src/modules/permission/permission.schema.ts

188 lines
5.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file 权限模块Schema定义
* @author AI Assistant
* @date 2024-12-19
* @lastEditor AI Assistant
* @lastEditTime 2025-01-07
* @description 定义权限模块的Schema包括新增权限、删除权限、修改权限、查看权限树等
*/
import { t, type Static } from 'elysia';
/**
* 新增权限请求参数Schema
* @description 新增权限的请求参数验证规则
*/
export const CreatePermissionSchema = t.Object({
/** 权限标识,全局唯一 */
permissionKey: t
.Transform(
t.String({
minLength: 1,
maxLength: 100,
pattern: '^[a-zA-Z0-9_]+$',
description: '权限标识,全局唯一,只允许字母数字下划线,自动转换为小写并去除两端空格',
examples: ['user:create', 'user:read', 'user:update', 'user:delete'],
}),
)
.Decode((value: string) => value.trim().toLowerCase())
.Encode((value: string) => value),
/** 权限名称 */
name: t
.Transform(
t.String({
minLength: 1,
maxLength: 50,
description: '权限名称,同级下唯一,自动去除两端空格',
examples: ['创建用户', '查看用户', '修改用户', '删除用户'],
}),
)
.Decode((value: string) => value.trim())
.Encode((value: string) => value),
/** 权限描述 */
description: t.Optional(
t.Transform(
t.String({
maxLength: 255,
description: '权限描述,自动去除两端空格',
examples: ['创建新用户的权限', '查看用户信息的权限'],
}),
)
.Decode((value: string) => value.trim())
.Encode((value: string) => value),
),
/** 权限类型(1=菜单 2=按钮 3=接口 4=数据) */
type: t.Union([
t.Literal(1),
t.Literal(2),
t.Literal(3),
t.Literal(4),
t.Literal('1'),
t.Literal('2'),
t.Literal('3'),
t.Literal('4'),
], {
description: '权限类型1=菜单2=按钮3=接口4=数据',
examples: [1, 2, 3, 4],
}),
/** 接口路径标识 */
apiPathKey: t.Optional(
t.Transform(
t.String({
maxLength: 200,
description: '接口路径标识type为3接口时建议填写自动去除两端空格',
examples: ['/api/user', '/api/user/create', 'POST:/api/user'],
}),
)
.Decode((value: string) => value.trim())
.Encode((value: string) => value),
),
/** 前端路由标识 */
pagePathKey: t.Optional(
t.Transform(
t.String({
maxLength: 200,
description: '前端路由标识type为1菜单时建议填写自动去除两端空格',
examples: ['/user', '/user/list', '/user/detail'],
}),
)
.Decode((value: string) => value.trim())
.Encode((value: string) => value),
),
/** 所属模块 */
module: t
.Transform(
t.String({
minLength: 1,
maxLength: 30,
pattern: '^[a-zA-Z0-9_]+$',
description: '所属模块,只允许字母数字下划线,自动转换为小写并去除两端空格',
examples: ['user', 'role', 'permission', 'system'],
}),
)
.Decode((value: string) => value.trim().toLowerCase())
.Encode((value: string) => value),
/** 父权限ID0表示顶级 */
pid: t.Optional(
t.Union([
t.Literal('0'),
t.String({
pattern: '^[1-9]\\d*$',
description: '父权限IDBigint字符串形式',
}),
], {
description: '父权限ID0表示顶级权限',
examples: ['0', '1', '2'],
default: '0',
}),
),
/** 排序值 */
sort: t.Optional(
t.String({
maxLength: 20,
description: '排序值,同级内排序使用',
examples: ['0','1', '10', '100'],
})
),
/** 图标标识 */
icon: t.Optional(
t.Transform(
t.String({
maxLength: 100,
description: '图标标识CSS类名或图标路径自动去除两端空格',
examples: ['icon-user', 'icon-add', '/icons/user.png'],
}),
)
.Decode((value: string) => value.trim())
.Encode((value: string) => value),
),
/** 状态(1=启用, 0=禁用) */
status: t.Optional(
t.Union([
t.Literal(1),
t.Literal(0),
t.Literal('1'),
t.Literal('0'),
], {
description: '权限状态1=启用0=禁用',
examples: [1, 0],
default: 1,
}),
),
});
/** 新增权限请求参数类型 */
export type CreatePermissionRequest = Static<typeof CreatePermissionSchema>;
/**
* 删除权限接口参数Schema
* @description 校验DELETE /api/permission/:id 路径参数
*/
export const DeletePermissionParamsSchema = t.Object({
id: t.String({
pattern: '^[1-9]\\d*$',
description: '权限IDbigint字符串必须为正整数',
examples: ['1', '100', '123456789'],
}),
});
/** 删除权限参数类型 */
export type DeletePermissionParams = Static<typeof DeletePermissionParamsSchema>;
/**
* 权限类型枚举
*/
export const PermissionType = {
MENU: 1, // 菜单
BUTTON: 2, // 按钮
API: 3, // 接口
DATA: 4, // 数据
} as const;
/**
* 权限状态枚举
*/
export const PermissionStatus = {
ENABLED: 1, // 启用
DISABLED: 0, // 禁用
} as const;