import { Injectable } from '@nestjs/common'; import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface, } from 'class-validator'; import { FieldMetadataDefaultValue } from 'src/metadata/field-metadata/interfaces/field-metadata-default-value.interface'; import { FieldMetadataService } from 'src/metadata/field-metadata/field-metadata.service'; import { FieldMetadataEntity, FieldMetadataType, } from 'src/metadata/field-metadata/field-metadata.entity'; import { validateDefaultValueForType } from 'src/metadata/field-metadata/utils/validate-default-value-for-type.util'; @Injectable() @ValidatorConstraint({ name: 'isFieldMetadataDefaultValue', async: true }) export class IsFieldMetadataDefaultValue implements ValidatorConstraintInterface { constructor(private readonly fieldMetadataService: FieldMetadataService) {} async validate( value: FieldMetadataDefaultValue, args: ValidationArguments, ): Promise { // Try to extract type value from the object let type: FieldMetadataType | null = args.object['type']; if (!type) { // Extract id value from the instance, should happen only when updating // @ts-expect-error Todo: Fix typing error const id: string | undefined = args.instance?.['id']; if (!id) { return false; } let fieldMetadata: FieldMetadataEntity; try { fieldMetadata = await this.fieldMetadataService.findOneOrFail(id); } catch { return false; } type = fieldMetadata.type; } return validateDefaultValueForType(type, value); } defaultMessage(): string { return 'FieldMetadataDefaultValue is not valid'; } }