Skip to content

Commit 7834d37

Browse files
committed
fix: validation for nested objects
1 parent b22f74e commit 7834d37

4 files changed

Lines changed: 36 additions & 37 deletions

File tree

packages/apps/reputation-oracle/server/src/common/pipes/validation.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,20 @@ import {
77
ValidationPipeOptions,
88
} from '@nestjs/common';
99

10-
// TODO: Revisit validation options
1110
@Injectable()
1211
export class HttpValidationPipe extends ValidationPipe {
1312
constructor(options?: ValidationPipeOptions) {
1413
super({
1514
exceptionFactory: (errors: ValidationError[]) => {
16-
const errorMessages = errors
17-
.map(
18-
(error) =>
19-
Object.values((error as any).constraints) as unknown as string,
20-
)
21-
.flat();
15+
const flattenErrors = this.flattenValidationErrors(errors);
2216

2317
return new HttpException(
24-
errorMessages.join(', '),
18+
{ validationErrors: flattenErrors, message: 'Validation error' },
2519
HttpStatus.BAD_REQUEST,
2620
);
2721
},
2822
transform: true,
2923
whitelist: true,
30-
forbidUnknownValues: true,
3124
...options,
3225
});
3326
}

packages/apps/reputation-oracle/server/src/modules/kyc/kyc.controller.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ import {
1818
} from '@nestjs/common';
1919
import { Public } from '../../common/decorators';
2020
import { RequestWithUser } from '../../common/interfaces/request';
21-
import { KycSessionDto, KycSignedAddressDto, KycStatusDto } from './kyc.dto';
21+
import {
22+
StartSessionResponseDto,
23+
KycSignedAddressDto,
24+
UpdateKycStatusDto,
25+
} from './kyc.dto';
2226
import { KycService } from './kyc.service';
2327
import { KycWebhookAuthGuard } from './kyc-webhook-auth.guard';
2428
import { KycErrorFilter } from './kyc.error.filter';
@@ -36,14 +40,15 @@ export class KycController {
3640
@ApiResponse({
3741
status: 200,
3842
description: 'KYC session started successfully',
39-
type: KycSessionDto,
43+
type: StartSessionResponseDto,
4044
})
4145
@ApiBearerAuth()
4246
@Post('/start')
4347
@HttpCode(200)
44-
async startKyc(@Req() request: RequestWithUser): Promise<KycSessionDto> {
45-
const kycSessionData = await this.kycService.initSession(request.user);
46-
return kycSessionData;
48+
async startKyc(
49+
@Req() request: RequestWithUser,
50+
): Promise<StartSessionResponseDto> {
51+
return await this.kycService.initSession(request.user);
4752
}
4853

4954
@ApiOperation({
@@ -66,7 +71,7 @@ export class KycController {
6671
type: 'string',
6772
},
6873
})
69-
@ApiBody({ type: KycStatusDto })
74+
@ApiBody({ type: UpdateKycStatusDto })
7075
@ApiResponse({
7176
status: 200,
7277
description: 'Kyc status updated successfully',
@@ -75,7 +80,7 @@ export class KycController {
7580
@Post('/update')
7681
@UseGuards(KycWebhookAuthGuard)
7782
@HttpCode(200)
78-
async updateKycStatus(@Body() data: KycStatusDto): Promise<void> {
83+
async updateKycStatus(@Body() data: UpdateKycStatusDto): Promise<void> {
7984
await this.kycService.updateKycStatus(data);
8085
}
8186

packages/apps/reputation-oracle/server/src/modules/kyc/kyc.dto.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,24 @@ import {
66
IsString,
77
IsUrl,
88
IsUUID,
9+
ValidateNested,
910
} from 'class-validator';
11+
import { Type } from 'class-transformer';
1012
import { KycStatus } from '../../common/enums/user';
1113

12-
export class KycSessionDto {
14+
export class StartSessionResponseDto {
1315
@ApiProperty({ name: 'url' })
1416
@IsUrl()
1517
public url: string;
1618
}
1719

18-
export class KycDocumentDto {
20+
export class DocumentData {
1921
@ApiProperty()
2022
@IsString()
2123
public country: string;
2224
}
2325

24-
export class KycVerificationDto {
26+
export class VerificationData {
2527
@ApiProperty()
2628
@IsUUID()
2729
public id: string;
@@ -41,28 +43,21 @@ export class KycVerificationDto {
4143

4244
@ApiProperty()
4345
@IsObject()
44-
public document: KycDocumentDto;
46+
@ValidateNested()
47+
@Type(() => DocumentData)
48+
public document: DocumentData;
4549
}
4650

47-
export class TechnicalDataDto {
48-
@ApiProperty({ nullable: true })
49-
@IsString()
50-
@IsOptional()
51-
public ip: string | null;
52-
}
53-
54-
export class KycStatusDto {
51+
export class UpdateKycStatusDto {
5552
@ApiProperty()
5653
@IsString()
5754
public status: string;
5855

59-
@ApiProperty({ type: KycVerificationDto })
60-
@IsObject()
61-
public verification: KycVerificationDto;
62-
63-
@ApiProperty({ type: TechnicalDataDto })
56+
@ApiProperty({ type: VerificationData })
6457
@IsObject()
65-
public technicalData: TechnicalDataDto;
58+
@ValidateNested()
59+
@Type(() => VerificationData)
60+
public verification: VerificationData;
6661
}
6762

6863
export class KycSignedAddressDto {

packages/apps/reputation-oracle/server/src/modules/kyc/kyc.service.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { Injectable } from '@nestjs/common';
22

33
import { UserEntity } from '../user';
44
import { HttpService } from '@nestjs/axios';
5-
import { KycSessionDto, KycSignedAddressDto, KycStatusDto } from './kyc.dto';
5+
import {
6+
StartSessionResponseDto,
7+
KycSignedAddressDto,
8+
UpdateKycStatusDto,
9+
} from './kyc.dto';
610
import { KycRepository } from './kyc.repository';
711
import { KycStatus } from '../../common/enums/user';
812
import { firstValueFrom } from 'rxjs';
@@ -23,7 +27,9 @@ export class KycService {
2327
private readonly web3ConfigService: Web3ConfigService,
2428
) {}
2529

26-
public async initSession(userEntity: UserEntity): Promise<KycSessionDto> {
30+
public async initSession(
31+
userEntity: UserEntity,
32+
): Promise<StartSessionResponseDto> {
2733
if (userEntity.kyc?.sessionId) {
2834
if (userEntity.kyc.status === KycStatus.APPROVED) {
2935
throw new KycError(KycErrorMessage.ALREADY_APPROVED, userEntity.id);
@@ -82,7 +88,7 @@ export class KycService {
8288
};
8389
}
8490

85-
public async updateKycStatus(data: KycStatusDto): Promise<void> {
91+
public async updateKycStatus(data: UpdateKycStatusDto): Promise<void> {
8692
const { status, reason, id: sessionId } = data.verification;
8793
const { country } = data.verification.document;
8894

0 commit comments

Comments
 (0)