Skip to content

Commit e768692

Browse files
committed
Refactor package dependencies and update import paths for restools; add DTO and ObjectId validation pipes
1 parent ea21cc1 commit e768692

15 files changed

+96
-37
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
"@nestjs/swagger": "^8.0.7",
6363
"@the-software-compagny/nestjs_module_factorydrive": "^1.1.5",
6464
"@the-software-compagny/nestjs_module_factorydrive-s3": "^1.0.1",
65-
"@the-software-compagny/nestjs_module_restools": "^0.0.11",
6665
"ajv": "^8.16.0",
6766
"ajv-errors": "^3.0.0",
6867
"ajv-formats": "^3.0.1",
@@ -74,12 +73,14 @@
7473
"class-transformer": "^0.5.1",
7574
"class-validator": "^0.14.1",
7675
"cookie-parser": "^1.4.6",
76+
"dayjs": "^1.11.18",
7777
"fast-password-entropy": "^1.1.1",
7878
"glob": "^11.0.0",
7979
"handlebars": "^4.7.8",
8080
"helmet": "^7.1.0",
8181
"hibp": "^14.1.2",
8282
"ioredis": "^5.4.1",
83+
"is-plain-object": "^5.0.0",
8384
"loglevel": "^1.9.1",
8485
"lru-cache": "^11.0.2",
8586
"microdiff": "^1.5.0",
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { ArgumentMetadata, HttpStatus, Injectable, Logger, ValidationError, ValidationPipe, ValidationPipeOptions } from '@nestjs/common'
2+
3+
interface ValidationRecursive {
4+
[key: string]: string
5+
}
6+
7+
@Injectable()
8+
export class DtoValidationPipe extends ValidationPipe {
9+
public constructor(options?: ValidationPipeOptions) {
10+
super({
11+
transform: true,
12+
transformOptions: {
13+
enableImplicitConversion: true,
14+
},
15+
exceptionFactory: (errors: ValidationError[]) => this.exceptionHandler(errors),
16+
...options,
17+
})
18+
}
19+
20+
public async transform(value: any, metadata: ArgumentMetadata): Promise<any> {
21+
return (await super.transform(value, metadata)) || value;
22+
}
23+
24+
public exceptionHandler(errors: ValidationError[]) {
25+
let validations: ValidationRecursive = {}
26+
for (const error of errors) {
27+
validations = { ...validations, ...this.validationRecursive(error) }
28+
}
29+
30+
const message = `Erreur de validation : ${Object.keys(validations).join(', ')}`.trim()
31+
Logger.debug(`${message} (${JSON.stringify(validations)})`, DtoValidationPipe.name)
32+
33+
return {
34+
statusCode: HttpStatus.BAD_REQUEST,
35+
message,
36+
validations,
37+
}
38+
}
39+
40+
protected validationRecursive(error: ValidationError, prefix = ''): ValidationRecursive {
41+
let validations = {}
42+
if (error.constraints) {
43+
validations[`${prefix + error.property}`] = Object.values(error.constraints)[0]
44+
}
45+
if (error.children.length > 0) {
46+
for (const errorChild of error.children) {
47+
if (errorChild.constraints) {
48+
validations[`${prefix + error.property}.${errorChild.property}`] = Object.values(errorChild.constraints)[0]
49+
}
50+
if (errorChild.children.length > 0) {
51+
validations = { ...validations, ...this.validationRecursive(errorChild, `${prefix + error.property}.${errorChild.property}.`) }
52+
}
53+
}
54+
}
55+
return validations
56+
}
57+
}

src/_common/restools/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
export * from './search-filter-options.decorator'
22
export * from './search-filter-schema.decorator'
3+
export * from './dto-validation.pipe'
4+
export * from './object-id-validation.pipe'
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ArgumentMetadata, BadRequestException, Injectable, Logger, PipeTransform } from '@nestjs/common'
2+
3+
let ObjectId: any
4+
(async () => {
5+
try {
6+
const mongooseModule = await import('mongoose')
7+
ObjectId = mongooseModule.Types.ObjectId
8+
} catch (error) {
9+
Logger.debug(`Mongoose module not found`, ObjectIdValidationPipe.name)
10+
}
11+
})()
12+
13+
@Injectable()
14+
export class ObjectIdValidationPipe implements PipeTransform<string, typeof ObjectId> {
15+
public transform(value: string | typeof ObjectId, _metadata: ArgumentMetadata): typeof ObjectId {
16+
if (!ObjectId.isValid(value)) {
17+
throw new BadRequestException(`Invalid ObjectId <${value}>`)
18+
}
19+
return new ObjectId(value)
20+
}
21+
}

src/core/agents/agents.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
FilterSchema,
66
SearchFilterOptions,
77
SearchFilterSchema,
8-
} from '@the-software-compagny/nestjs_module_restools';
8+
} from '~/_common/restools';
99
import { Response } from 'express';
1010
import { Types } from 'mongoose';
1111
import { AbstractController } from '~/_common/abstracts/abstract.controller';

src/core/filestorage/filestorage.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
ObjectIdValidationPipe,
2222
SearchFilterOptions,
2323
SearchFilterSchema,
24-
} from '@the-software-compagny/nestjs_module_restools';
24+
} from '~/_common/restools';
2525
import { Response } from 'express';
2626
import { Types } from 'mongoose';
2727
import { AbstractController } from '~/_common/abstracts/abstract.controller';

src/core/form/form.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
SearchFilterOptions,
1010
FilterOptions,
1111
ObjectIdValidationPipe,
12-
} from '@the-software-compagny/nestjs_module_restools';
12+
} from '~/_common/restools';
1313
import { Types } from 'mongoose';
1414
import { ApiCreateDecorator } from '~/_common/decorators/api-create.decorator';
1515
import { ApiDeletedResponseDecorator } from '~/_common/decorators/api-deleted-response.decorator';

src/core/jobs/jobs.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
FilterSchema,
66
SearchFilterOptions,
77
SearchFilterSchema,
8-
} from '@the-software-compagny/nestjs_module_restools';
8+
} from '~/_common/restools';
99
import { Request, Response } from 'express';
1010
import { Types } from 'mongoose';
1111
import { AbstractController } from '~/_common/abstracts/abstract.controller';

src/core/keyrings/keyrings.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
FilterSchema,
1313
SearchFilterOptions,
1414
SearchFilterSchema,
15-
} from '@the-software-compagny/nestjs_module_restools';
15+
} from '~/_common/restools';
1616
import { ApiCreateDecorator } from '~/_common/decorators/api-create.decorator';
1717
import { ApiPaginatedDecorator } from '~/_common/decorators/api-paginated.decorator';
1818
import { PartialProjectionType } from '~/_common/types/partial-projection.type';

src/management/identities/identities-crud.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
FilterSchema,
1818
SearchFilterOptions,
1919
SearchFilterSchema,
20-
} from '@the-software-compagny/nestjs_module_restools';
20+
} from '~/_common/restools';
2121
import { Response } from 'express';
2222
import { Document, Types } from 'mongoose';
2323
import { AbstractController } from '~/_common/abstracts/abstract.controller';

0 commit comments

Comments
 (0)