test: harden business boundary conditions

This commit is contained in:
2026-07-15 00:03:55 +08:00
parent 17a5046ea0
commit b1f35f9d1a
65 changed files with 2311 additions and 293 deletions

View File

@@ -1,43 +1,81 @@
import { IsOptional, IsString, IsNotEmpty, IsInt, IsArray, IsDateString, IsEnum, ArrayNotEmpty, ValidateNested } from 'class-validator';
import {
IsOptional,
IsString,
IsNotEmpty,
IsInt,
IsArray,
IsDateString,
IsEnum,
ArrayNotEmpty,
ValidateNested,
Min,
} from 'class-validator';
import { Type, Transform } from 'class-transformer';
import { ClassType, ClassStatus, TeacherRoleType } from '../../entities';
export class ClassTeacherItemDto {
@IsInt()
userId: number;
@IsEnum(TeacherRoleType)
roleType: string;
@IsOptional()
@IsString()
subject?: string;
}
export class CreateClassDto {
@IsString() @IsNotEmpty()
@IsString()
@IsNotEmpty()
name: string;
@IsString() @IsNotEmpty()
@IsString()
@IsNotEmpty()
code: string;
@IsEnum(ClassType) @IsString() @IsNotEmpty()
@IsEnum(ClassType)
@IsString()
@IsNotEmpty()
classType: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
startDate?: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
endDate?: string;
@IsEnum(ClassStatus) @IsOptional() @IsString()
@IsEnum(ClassStatus)
@IsOptional()
@IsString()
status?: string;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
headTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
lifeTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
academicTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
@Min(0)
maxStudents?: number;
@IsOptional() @IsString()
@IsOptional()
@IsString()
notes?: string;
@IsOptional() @IsArray()
@IsOptional()
@IsArray()
@IsInt({ each: true })
studentIds?: number[];
@IsOptional()
@@ -46,55 +84,73 @@ export class CreateClassDto {
@Type(() => ImportUserItem)
users?: ImportUserItem[];
@IsOptional() @IsArray()
teachers?: Array<{ userId: number; roleType: string; subject?: string }>;
@IsOptional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => ClassTeacherItemDto)
teachers?: ClassTeacherItemDto[];
}
export class UpdateClassDto {
@IsOptional() @IsString()
@IsOptional()
@IsString()
name?: string;
@IsOptional() @IsString()
@IsOptional()
@IsString()
code?: string;
@IsEnum(ClassType) @IsOptional() @IsString()
@IsEnum(ClassType)
@IsOptional()
@IsString()
classType?: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
startDate?: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
endDate?: string;
@IsEnum(ClassStatus) @IsOptional() @IsString()
@IsEnum(ClassStatus)
@IsOptional()
@IsString()
status?: string;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
headTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
lifeTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
academicTeacherId?: number;
@IsOptional() @IsInt()
@IsOptional()
@IsInt()
@Min(0)
maxStudents?: number;
@IsOptional() @IsString()
@IsOptional()
@IsString()
notes?: string;
}
export class QueryClassDto {
@IsOptional() @IsString()
@IsOptional()
@IsString()
status?: string;
@IsOptional() @IsString()
@IsOptional()
@IsString()
classType?: string;
@IsOptional() @IsString()
@IsOptional()
@IsString()
keyword?: string;
@IsOptional()
@@ -108,7 +164,8 @@ export class QueryClassDto {
}
export class AddStudentsDto {
@IsArray() @IsInt({ each: true })
@IsArray()
@IsInt({ each: true })
studentIds: number[];
}
@@ -119,23 +176,28 @@ export class AddTeacherDto {
@IsEnum(TeacherRoleType)
roleType: string;
@IsOptional() @IsString()
@IsOptional()
@IsString()
subject?: string;
}
export class QueryClassScheduleDto {
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
startDate?: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
endDate?: string;
}
export class QueryClassAttendanceSummaryDto {
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
startDate?: string;
@IsOptional() @IsDateString()
@IsOptional()
@IsDateString()
endDate?: string;
}
export class BatchImportStudentsDto {
@@ -147,12 +209,15 @@ export class BatchImportStudentsDto {
}
export class ImportUserItem {
@IsString() @IsNotEmpty()
@IsString()
@IsNotEmpty()
dingUserId: string;
@IsString() @IsNotEmpty()
@IsString()
@IsNotEmpty()
name: string;
@IsOptional() @IsString()
@IsOptional()
@IsString()
mobile?: string;
}