ObjectMetadataServiceV2.createOne (#13849)

# Introduction

Introducing v2 object metadata service create one handler v2, not
overkilling the flatObjectMetadata validation for the moment that will
require sequential validation for the import in order to handle
relations and morph relations
This commit is contained in:
Paul Rastoin
2025-08-12 16:49:35 +02:00
committed by GitHub
parent c94f33f1b7
commit de0468d104
26 changed files with 573 additions and 176 deletions
@@ -0,0 +1,54 @@
import { t } from '@lingui/core/macro';
import { type FailedFlatObjectMetadataValidationExceptions } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { runFlatObjectMetadataValidators } from 'src/engine/metadata-modules/flat-object-metadata/utils/run-flat-object-metadata-validators.util';
import {
ObjectMetadataException,
ObjectMetadataExceptionCode,
} from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
import { type FlatMetadataValidator } from 'src/engine/metadata-modules/types/flat-metadata-validator.type';
import {
beneathDatabaseIdentifierMinimumLength,
exceedsDatabaseIdentifierMaximumLength,
} from 'src/engine/metadata-modules/utils/validate-database-identifier-length.utils';
export const validateFlatObjectMetadataLabel = ({
labelPlural,
labelSingular,
}: Pick<
FlatObjectMetadata,
'labelPlural' | 'labelSingular'
>): FailedFlatObjectMetadataValidationExceptions[] => {
const errors: FailedFlatObjectMetadataValidationExceptions[] = [];
const validators: FlatMetadataValidator<string>[] = [
{
validator: (label) => beneathDatabaseIdentifierMinimumLength(label),
message: t`Object label is too short`,
},
{
validator: (label) => exceedsDatabaseIdentifierMaximumLength(label),
message: t`Object label is too long`,
},
];
errors.push(
...[labelSingular, labelPlural].flatMap((label) =>
runFlatObjectMetadataValidators(label, validators),
),
);
const labelsAreIdentical =
labelSingular.trim().toLowerCase() === labelPlural.trim().toLowerCase();
if (labelsAreIdentical) {
errors.push(
new ObjectMetadataException(
t`The singular and plural labels cannot be the same for an object`,
ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
),
);
}
return errors;
};
@@ -0,0 +1,37 @@
import { t } from '@lingui/core/macro';
import { type FailedFlatObjectMetadataValidationExceptions } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { runFlatObjectMetadataValidators } from 'src/engine/metadata-modules/flat-object-metadata/utils/run-flat-object-metadata-validators.util';
import {
ObjectMetadataException,
ObjectMetadataExceptionCode,
} from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
import { METADATA_NAME_VALIDATORS } from 'src/engine/metadata-modules/utils/constants/metadata-name-flat-metadata-validators.constants';
export const validateFlatObjectMetadataNames = ({
namePlural,
nameSingular,
}: Pick<FlatObjectMetadata, 'nameSingular' | 'namePlural'>) => {
const errors: FailedFlatObjectMetadataValidationExceptions[] = [];
errors.push(
...[nameSingular, namePlural].flatMap((name) =>
runFlatObjectMetadataValidators(name, METADATA_NAME_VALIDATORS),
),
);
const namesAreIdentical =
namePlural.trim().toLowerCase() === nameSingular.trim().toLowerCase();
if (namesAreIdentical) {
errors.push(
new ObjectMetadataException(
t`The singular and plural names cannot be the same for an object`,
ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
),
);
}
return errors;
};