fix: ensure nested objects are properly validated & transformed

To validate nested objects, class-transformer requires
the `@ValidateNested` annotation.
For arrays, class-transfomer requires
setting `each: true`.

To correctly transform nested objects from JSON to instances,
class-transformer requires the `@Type` annotation.

References:
https://github.com/typestack/class-validator#validating-nested-objects
https://github.com/typestack/class-validator#validating-arrays
https://github.com/typestack/class-transformer#working-with-nested-objects
Signed-off-by: David Mehren <git@herrmehren.de>
This commit is contained in:
David Mehren 2022-03-05 12:02:13 +01:00 committed by Philip Molares
parent 324536bc2d
commit 59a235ebc4
3 changed files with 16 additions and 7 deletions

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { import {
IsArray, IsArray,
IsDate, IsDate,
@ -104,14 +105,15 @@ export class NoteMetadataDto extends BaseDto {
* @example "['john.smith', 'jane.smith']" * @example "['john.smith', 'jane.smith']"
*/ */
@IsArray() @IsArray()
@ValidateNested() @IsString({ each: true })
@ApiProperty() @ApiProperty()
editedBy: UserInfoDto['username'][]; editedBy: string[];
/** /**
* Permissions currently in effect for the note * Permissions currently in effect for the note
*/ */
@ValidateNested() @ValidateNested({ each: true })
@Type(() => NotePermissionsDto)
@ApiProperty({ type: NotePermissionsDto }) @ApiProperty({ type: NotePermissionsDto })
permissions: NotePermissionsDto; permissions: NotePermissionsDto;
} }

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { import {
IsArray, IsArray,
IsBoolean, IsBoolean,
@ -96,16 +97,18 @@ export class NotePermissionsDto {
/** /**
* List of users the note is shared with * List of users the note is shared with
*/ */
@ValidateNested() @ValidateNested({ each: true })
@IsArray() @IsArray()
@Type(() => NoteUserPermissionEntryDto)
@ApiProperty({ isArray: true, type: NoteUserPermissionEntryDto }) @ApiProperty({ isArray: true, type: NoteUserPermissionEntryDto })
sharedToUsers: NoteUserPermissionEntryDto[]; sharedToUsers: NoteUserPermissionEntryDto[];
/** /**
* List of groups the note is shared with * List of groups the note is shared with
*/ */
@ValidateNested() @ValidateNested({ each: true })
@IsArray() @IsArray()
@Type(() => NoteGroupPermissionEntryDto)
@ApiProperty({ isArray: true, type: NoteGroupPermissionEntryDto }) @ApiProperty({ isArray: true, type: NoteGroupPermissionEntryDto })
sharedToGroups: NoteGroupPermissionEntryDto[]; sharedToGroups: NoteGroupPermissionEntryDto[];
} }
@ -115,7 +118,8 @@ export class NotePermissionsUpdateDto {
* List of users the note should be shared with * List of users the note should be shared with
*/ */
@IsArray() @IsArray()
@ValidateNested() @ValidateNested({ each: true })
@Type(() => NoteUserPermissionUpdateDto)
@ApiProperty({ isArray: true, type: NoteUserPermissionUpdateDto }) @ApiProperty({ isArray: true, type: NoteUserPermissionUpdateDto })
sharedToUsers: NoteUserPermissionUpdateDto[]; sharedToUsers: NoteUserPermissionUpdateDto[];
@ -123,7 +127,8 @@ export class NotePermissionsUpdateDto {
* List of groups the note should be shared with * List of groups the note should be shared with
*/ */
@IsArray() @IsArray()
@ValidateNested() @ValidateNested({ each: true })
@Type(() => NoteGroupPermissionUpdateDto)
@ApiProperty({ isArray: true, type: NoteGroupPermissionUpdateDto }) @ApiProperty({ isArray: true, type: NoteGroupPermissionUpdateDto })
sharedToGroups: NoteGroupPermissionUpdateDto[]; sharedToGroups: NoteGroupPermissionUpdateDto[];
} }

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsArray, IsString, ValidateNested } from 'class-validator'; import { IsArray, IsString, ValidateNested } from 'class-validator';
import { EditDto } from '../revisions/edit.dto'; import { EditDto } from '../revisions/edit.dto';
@ -31,6 +32,7 @@ export class NoteDto extends BaseDto {
*/ */
@IsArray() @IsArray()
@ValidateNested({ each: true }) @ValidateNested({ each: true })
@Type(() => EditDto)
@ApiProperty({ isArray: true, type: EditDto }) @ApiProperty({ isArray: true, type: EditDto })
editedByAtPosition: EditDto[]; editedByAtPosition: EditDto[];
} }