Fix default relation standard field deletion (#13975)
Authorize relation standard field deletion if targetObjectMetadata is not present in existingFlatObjectMetadataMaps
This commit is contained in:
+18
-2
@@ -16,6 +16,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m
|
||||
import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util';
|
||||
import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-name-synced-with-label.util';
|
||||
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
|
||||
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
|
||||
import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util';
|
||||
import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util';
|
||||
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
|
||||
@@ -28,6 +29,7 @@ import {
|
||||
InvalidMetadataException,
|
||||
InvalidMetadataExceptionCode,
|
||||
} from 'src/engine/metadata-modules/utils/exceptions/invalid-metadata.exception';
|
||||
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
|
||||
|
||||
export type ValidateOneFieldMetadataArgs<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
@@ -215,7 +217,18 @@ export class FlatFieldMetadataValidatorService {
|
||||
}
|
||||
}
|
||||
|
||||
if (!flatFieldMetadataToDelete.isCustom) {
|
||||
const isRelationFieldAndRelationTargetObjectMetadataHasBeenDeleted =
|
||||
isRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
|
||||
!isDefined(
|
||||
existingFlatObjectMetadataMaps.byId[
|
||||
flatFieldMetadataToDelete.relationTargetObjectMetadataId
|
||||
],
|
||||
);
|
||||
|
||||
if (
|
||||
isStandardMetadata(flatFieldMetadataToDelete) &&
|
||||
!isRelationFieldAndRelationTargetObjectMetadataHasBeenDeleted
|
||||
) {
|
||||
errors.push(
|
||||
new FieldMetadataException(
|
||||
"Standard Fields can't be deleted",
|
||||
@@ -224,7 +237,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
);
|
||||
}
|
||||
|
||||
if (flatFieldMetadataToDelete.isActive) {
|
||||
if (
|
||||
flatFieldMetadataToDelete.isActive &&
|
||||
!isRelationFieldAndRelationTargetObjectMetadataHasBeenDeleted
|
||||
) {
|
||||
errors.push(
|
||||
new FieldMetadataException(
|
||||
"Active fields can't be deleted",
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
import { extractAndSanitizeObjectStringFields } from 'twenty-shared/utils';
|
||||
|
||||
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||
import { generateDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/generate-default-value';
|
||||
import { generateNullable } from 'src/engine/metadata-modules/field-metadata/utils/generate-nullable';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
|
||||
@@ -48,7 +49,7 @@ export const getDefaultFlatFieldMetadata = ({
|
||||
flatRelationTargetFieldMetadata: null,
|
||||
flatRelationTargetObjectMetadata: null,
|
||||
options: null,
|
||||
defaultValue: defaultValue ?? null,
|
||||
defaultValue: defaultValue ?? generateDefaultValue(createFieldInput.type),
|
||||
settings: settings ?? null,
|
||||
createdAt,
|
||||
updatedAt: createdAt,
|
||||
|
||||
+2
-10
@@ -1,12 +1,11 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { t } from '@lingui/core/macro';
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
|
||||
import { FailedFlatFieldMetadataValidationExceptions } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type';
|
||||
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
|
||||
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
|
||||
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
|
||||
import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
|
||||
import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.util';
|
||||
@@ -178,14 +177,7 @@ export class FlatObjectMetadataValidatorService {
|
||||
|
||||
for (const flatFieldMetadataToValidate of flatObjectMetadataToValidate.flatFieldMetadatas) {
|
||||
const relationTargetFlatObjectMetadataMaps =
|
||||
(isFlatFieldMetadataEntityOfType(
|
||||
flatFieldMetadataToValidate,
|
||||
FieldMetadataType.RELATION,
|
||||
) ||
|
||||
isFlatFieldMetadataEntityOfType(
|
||||
flatFieldMetadataToValidate,
|
||||
FieldMetadataType.MORPH_RELATION,
|
||||
)) &&
|
||||
isRelationFlatFieldMetadata(flatFieldMetadataToValidate) &&
|
||||
isDefined(otherFlatObjectMetadataMapsToValidate)
|
||||
? computeRelationTargetFlatObjectMetadataMaps({
|
||||
flatFieldMetadata: flatFieldMetadataToValidate,
|
||||
|
||||
+2
-4
@@ -1,6 +1,6 @@
|
||||
import { type FieldMetadataType } from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { findRelationFlatFieldMetadataTargetFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata.util';
|
||||
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
|
||||
@@ -10,9 +10,7 @@ export const computeRelationTargetFlatObjectMetadataMaps = ({
|
||||
flatFieldMetadata,
|
||||
flatObjectMetadataMaps,
|
||||
}: {
|
||||
flatFieldMetadata: FlatFieldMetadata<
|
||||
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
|
||||
>;
|
||||
flatFieldMetadata: FlatFieldMetadata<RelationFieldMetadataType>;
|
||||
flatObjectMetadataMaps: FlatObjectMetadataMaps;
|
||||
}): FlatObjectMetadataMaps | undefined => {
|
||||
const relationTargetFlatFieldMetadata =
|
||||
|
||||
+2
-1
@@ -94,7 +94,8 @@ export class WorkspaceMigrationBuilderV2Service {
|
||||
await this.workspaceMigrationV2FieldActionsBuilderService.validateAndBuildFieldActions(
|
||||
{
|
||||
buildOptions,
|
||||
fromFlatObjectMetadataMaps,
|
||||
fromFlatObjectMetadataMaps:
|
||||
objectActionsValidateAndBuildResult.optimisticFlatObjectMetadataMaps,
|
||||
toFlatObjectMetadataMaps,
|
||||
objectMetadataDeletedCreatedUpdatedFields,
|
||||
},
|
||||
|
||||
+2
-1
@@ -85,7 +85,8 @@ export class WorkspaceMigrationV2FieldActionsBuilderService {
|
||||
const validationErrors =
|
||||
await this.flatFieldMetadataValidatorService.validateFlatFieldMetadataUpdate(
|
||||
{
|
||||
existingFlatObjectMetadataMaps: fromFlatObjectMetadataMaps,
|
||||
existingFlatObjectMetadataMaps:
|
||||
validateAndBuildResult.optimisticFlatObjectMetadataMaps,
|
||||
flatFieldMetadataToValidate: toFlatFieldMetadata,
|
||||
workspaceId,
|
||||
otherFlatObjectMetadataMapsToValidate: undefined,
|
||||
|
||||
Reference in New Issue
Block a user