From a272403f27254be7b6b619eaf79938161a125aaf Mon Sep 17 00:00:00 2001 From: xiong Date: Fri, 24 Jul 2026 10:05:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=8F=AD=E7=BA=A7=E5=BD=92?= =?UTF-8?q?=E6=A1=A3=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/classes/classes.controller.spec.ts | 20 +++++++++++++++++++ apps/server/src/classes/classes.controller.ts | 3 +++ apps/server/src/classes/dto/class.dto.ts | 2 ++ 3 files changed, 25 insertions(+) diff --git a/apps/server/src/classes/classes.controller.spec.ts b/apps/server/src/classes/classes.controller.spec.ts index 1c8d7e4..102a40d 100644 --- a/apps/server/src/classes/classes.controller.spec.ts +++ b/apps/server/src/classes/classes.controller.spec.ts @@ -1,5 +1,7 @@ +import { ValidationPipe } from '@nestjs/common'; import { ClassesController } from './classes.controller'; import { ClassesService } from './classes.service'; +import { QueryClassDto } from './dto/class.dto'; import { OperationLogsService } from '../operation-logs/operation-logs.service'; import { NotificationsService } from '../notifications/notifications.service'; import { CaslAction, SubjectName } from '../authorization'; @@ -94,3 +96,21 @@ describe('ClassesController - class data scope', () => { expect(service.assertClassAccess).toHaveBeenCalledWith(21, 8, false); }); }); + +describe('QueryClassDto - query transformation', () => { + const pipe = new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true }); + + it.each([ + ['false', false], + ['0', false], + ['true', true], + ['1', true], + ])('transforms isArchived=%s to %s', async (input, expected) => { + await expect( + pipe.transform( + { isArchived: input }, + { type: 'query', metatype: QueryClassDto, data: undefined }, + ), + ).resolves.toEqual({ isArchived: expected }); + }); +}); diff --git a/apps/server/src/classes/classes.controller.ts b/apps/server/src/classes/classes.controller.ts index 2dc8dca..547528b 100644 --- a/apps/server/src/classes/classes.controller.ts +++ b/apps/server/src/classes/classes.controller.ts @@ -8,6 +8,8 @@ import { Param, Query, UseGuards, + UsePipes, + ValidationPipe, Request, Res, } from '@nestjs/common'; @@ -45,6 +47,7 @@ const teacherRoleLabels: Record = { }; @UseGuards(JwtAuthGuard) +@UsePipes(new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true })) @Controller('classes') export class ClassesController { constructor( diff --git a/apps/server/src/classes/dto/class.dto.ts b/apps/server/src/classes/dto/class.dto.ts index 9df9088..3d1e837 100644 --- a/apps/server/src/classes/dto/class.dto.ts +++ b/apps/server/src/classes/dto/class.dto.ts @@ -9,6 +9,7 @@ import { ArrayNotEmpty, ValidateNested, Min, + IsBoolean, } from 'class-validator'; import { Type, Transform } from 'class-transformer'; import { ClassType, ClassStatus, TeacherRoleType } from '../../entities'; @@ -160,6 +161,7 @@ export class QueryClassDto { if (value === 'false' || value === '0') return false; return value; }) + @IsBoolean() isArchived?: boolean; }