Fixes https://github.com/twentyhq/twenty/issues/13577. When naming or renaming an object, we are already checking that the name was available compared to other existing objects. But we also need to check that the relation fields that will be created or updated are available as well: we create relation fields on Attachment, Note, Favorite, Task and TimelineActivites, that bear the name of the object. Thus, it is not possible to create an object that has the same name as one of the fields on Attachment, Note etc: name, createdAt, ... are not valid names.
51 lines
2.0 KiB
TypeScript
51 lines
2.0 KiB
TypeScript
import { assertUnreachable } from 'twenty-shared/utils';
|
|
|
|
import {
|
|
ConflictError,
|
|
ForbiddenError,
|
|
InternalServerError,
|
|
NotFoundError,
|
|
UserInputError,
|
|
} from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
|
import {
|
|
ObjectMetadataException,
|
|
ObjectMetadataExceptionCode,
|
|
} from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
|
|
import { InvalidMetadataException } from 'src/engine/metadata-modules/utils/exceptions/invalid-metadata.exception';
|
|
import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2';
|
|
import { workspaceMigrationBuilderExceptionV2Formatter } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter';
|
|
|
|
export const objectMetadataGraphqlApiExceptionHandler = (error: Error) => {
|
|
if (error instanceof WorkspaceMigrationBuilderExceptionV2) {
|
|
workspaceMigrationBuilderExceptionV2Formatter(error);
|
|
}
|
|
|
|
if (error instanceof InvalidMetadataException) {
|
|
throw new UserInputError(error);
|
|
}
|
|
|
|
if (error instanceof ObjectMetadataException) {
|
|
switch (error.code) {
|
|
case ObjectMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND:
|
|
throw new NotFoundError(error);
|
|
case ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT:
|
|
throw new UserInputError(error);
|
|
case ObjectMetadataExceptionCode.OBJECT_MUTATION_NOT_ALLOWED:
|
|
case ObjectMetadataExceptionCode.NAME_CONFLICT:
|
|
throw new ForbiddenError(error);
|
|
case ObjectMetadataExceptionCode.OBJECT_ALREADY_EXISTS:
|
|
throw new ConflictError(error);
|
|
case ObjectMetadataExceptionCode.INTERNAL_SERVER_ERROR:
|
|
case ObjectMetadataExceptionCode.INVALID_ORM_OUTPUT:
|
|
throw new InternalServerError(error);
|
|
case ObjectMetadataExceptionCode.MISSING_CUSTOM_OBJECT_DEFAULT_LABEL_IDENTIFIER_FIELD:
|
|
throw error;
|
|
default: {
|
|
return assertUnreachable(error.code);
|
|
}
|
|
}
|
|
}
|
|
|
|
throw error;
|
|
};
|