tyt-api-nest/src/users/dto/create-user.dto.ts
2026-03-13 02:40:21 +08:00

67 lines
2.1 KiB
TypeScript

import { Role } from '../../generated/prisma/enums.js';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { EmptyStringToUndefined } from '../../common/transforms/empty-string-to-undefined.transform.js';
import {
IsEnum,
IsInt,
IsOptional,
IsString,
Matches,
Min,
MinLength,
} from 'class-validator';
/**
* B 端创建用户 DTO。
*/
export class CreateUserDto {
@ApiProperty({ description: '用户姓名', example: '李医生' })
@IsString({ message: 'name 必须是字符串' })
name!: string;
@ApiProperty({ description: '手机号', example: '13800000002' })
@IsString({ message: 'phone 必须是字符串' })
@Matches(/^1\d{10}$/, { message: 'phone 必须是合法手机号' })
phone!: string;
@ApiPropertyOptional({ description: '密码(可选)', example: 'Abcd1234' })
@IsOptional()
@IsString({ message: 'password 必须是字符串' })
@MinLength(8, { message: 'password 长度至少 8 位' })
password?: string;
@ApiPropertyOptional({ description: '微信 openId', example: 'wx-open-id-demo' })
@IsOptional()
@IsString({ message: 'openId 必须是字符串' })
openId?: string;
@ApiProperty({ description: '角色', enum: Role, example: Role.DOCTOR })
@IsEnum(Role, { message: 'role 枚举值不合法' })
role!: Role;
@ApiPropertyOptional({ description: '医院 ID', example: 1 })
@IsOptional()
@EmptyStringToUndefined()
@Type(() => Number)
@IsInt({ message: 'hospitalId 必须是整数' })
@Min(1, { message: 'hospitalId 必须大于 0' })
hospitalId?: number;
@ApiPropertyOptional({ description: '科室 ID', example: 1 })
@IsOptional()
@EmptyStringToUndefined()
@Type(() => Number)
@IsInt({ message: 'departmentId 必须是整数' })
@Min(1, { message: 'departmentId 必须大于 0' })
departmentId?: number;
@ApiPropertyOptional({ description: '小组 ID', example: 1 })
@IsOptional()
@EmptyStringToUndefined()
@Type(() => Number)
@IsInt({ message: 'groupId 必须是整数' })
@Min(1, { message: 'groupId 必须大于 0' })
groupId?: number;
}