diff --git a/libs/json-api-nestjs/src/lib/config/bindings.ts b/libs/json-api-nestjs/src/lib/config/bindings.ts index 78a98b19..7378a3c6 100644 --- a/libs/json-api-nestjs/src/lib/config/bindings.ts +++ b/libs/json-api-nestjs/src/lib/config/bindings.ts @@ -50,7 +50,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { decorator: Query, @@ -72,7 +72,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, ], }, @@ -97,7 +97,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { decorator: Body, @@ -114,7 +114,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { property: PARAMS_RELATION_NAME, @@ -132,7 +132,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { property: PARAMS_RELATION_NAME, @@ -154,7 +154,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { property: PARAMS_RELATION_NAME, @@ -176,7 +176,7 @@ const Bindings: BindingsConfig = { { property: PARAMS_RESOURCE_ID, decorator: Param, - mixins: [idPipeMixin], + mixins: [], }, { property: PARAMS_RELATION_NAME, diff --git a/libs/json-api-nestjs/src/lib/factory/ajv/utils/input-body-post-schema.ts b/libs/json-api-nestjs/src/lib/factory/ajv/utils/input-body-post-schema.ts index 2a912f38..570948ee 100644 --- a/libs/json-api-nestjs/src/lib/factory/ajv/utils/input-body-post-schema.ts +++ b/libs/json-api-nestjs/src/lib/factory/ajv/utils/input-body-post-schema.ts @@ -23,7 +23,7 @@ export function inputBodyPostSchema( camelToKebab(getEntityName(entity)) ); - const relDataType = { + const relDataType: Record = { type: 'object', properties: { data: { @@ -34,8 +34,6 @@ export function inputBodyPostSchema( }, id: { type: 'string', - pattern: '^\\d+$', - description: 'Use string should be as number string', }, }, required: ['type', 'id'], @@ -104,6 +102,14 @@ export function inputBodyPostSchema( }; const relationships = Object.keys(relationsField).reduce((acum, item) => { + if ( + Reflect.getMetadata('design:type', entity['prototype'], item) === Number + ) { + relDataType.properties.data.properties.id.pattern = '^\\d+$'; + relDataType.properties.data.properties.id.description = + 'Use string should be as number string'; + } + const resultSchema = { ...relDataType.properties.data, properties: { diff --git a/libs/json-api-nestjs/src/lib/mixin/pipes/body-input-post/body-input-post.pipe.ts b/libs/json-api-nestjs/src/lib/mixin/pipes/body-input-post/body-input-post.pipe.ts index 16c6a448..70dcc70b 100644 --- a/libs/json-api-nestjs/src/lib/mixin/pipes/body-input-post/body-input-post.pipe.ts +++ b/libs/json-api-nestjs/src/lib/mixin/pipes/body-input-post/body-input-post.pipe.ts @@ -5,7 +5,7 @@ import { } from '@nestjs/common'; import { Repository } from 'typeorm'; import AjvCall, { ValidateFunction } from 'ajv'; -import { validate as classValidate } from 'class-validator'; +import { isUUID, validate as classValidate } from 'class-validator'; import { PipeMixin, ValidationError } from '../../../types'; import { ResourceRequestObject } from '../../../types-common/request'; @@ -104,6 +104,29 @@ export class BodyInputPostPipe implements PipeTransform { throw new UnprocessableEntityException(errorResult); } + const relationsMetadata = this.repository.metadata.relations; + + for (const relationMetadata of relationsMetadata) { + const targetMetadata = relationMetadata.inverseEntityMetadata; + const primaryColumn = targetMetadata.primaryColumns[0]; + const isUuidPrimaryKey = primaryColumn.generationStrategy === 'uuid'; + + if (isUuidPrimaryKey) { + const valid = isUUID( + value.data.relationships[relationMetadata.propertyName].data.id + ); + + if (!valid) { + throw new UnprocessableEntityException({ + source: { + pointer: `/data/relationships/${relationMetadata.propertyName}/id`, + }, + detail: `Invalid UUID`, + }); + } + } + } + const dateKey = Object.keys(value.data.attributes).filter( (i) => Reflect.getMetadata(