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; }