Simplify and enhance v2 type devxp (#15032)

# Introduction
This PR introduces a huge type refactor that will leverage dynamic intra
entity optimistic flat maps update in the future and also a more
granular cache invalidation enhancing performances

close https://github.com/twentyhq/core-team-issues/issues/1717
close https://github.com/twentyhq/core-team-issues/issues/1716
close https://github.com/twentyhq/core-team-issues/issues/1643

## What's done

### Comparators centralization
Comparator is now done through global configuration as const for each
metadata names
Thanks to 

Note:
Definition of standard is evolving, standard is now scoped to an app.
Meaning that a manifest should be able to update its own standards
objects but on other app standards ones ? Each synchronizable entities
will have a standardOverrides ?

## Typing refactor

### `AllFlatEntityTypesByMetadataName`

**Single source of truth for the complete type ecosystem**, mapping each
metadata name to its entity types, flat entities, and migration actions:

```typescript
export type AllFlatEntityTypesByMetadataName = {
  fieldMetadata: {
    actions: { created: CreateFieldAction; updated: UpdateFieldAction; deleted: DeleteFieldAction; };
    flatEntity: FlatFieldMetadata;
    entity: FieldMetadataEntity;
  };
  objectMetadata: { /* ... */ };
  // ... all 10 metadata types
};
```

### `ALL_METADATA_NAME_MANY_TO_ONE_RELATIONS`

**Explicitly declares database relationships** between entities with
compile-time validation:

```typescript
export const ALL_METADATA_NAME_MANY_TO_ONE_RELATIONS = {
  viewField: {
    view: 'viewId',
    fieldMetadata: 'fieldMetadataId',
  },
  cronTrigger: {
    serverlessFunction: 'serverlessFunctionId',
  },
  // ... all relations
} as const satisfies MetadataNameAndRelations;
```

### `ALL_FLAT_ENTITY_CONFIGURATION`

**Centralizes comparison and serialization logic** for each metadata
type:

```typescript
export const ALL_FLAT_ENTITY_CONFIGURATION = {
  fieldMetadata: {
    propertiesToCompare: ['name', 'type', 'label', 'defaultValue', /* ... */],
    propertiesToStringify: ['options', 'settings', 'defaultValue'],
  },
  objectMetadata: {
    propertiesToCompare: ['nameSingular', 'namePlural', 'isActive', /* ... */],
    propertiesToStringify: [],
  },
  // ... all metadata types
} as const satisfies AllFlatEntityConfiguration;
```

## Combined Impact

These three configurations work together to create a **strongly-typed,
centrally-managed metadata system**:

1. **`AllFlatEntityTypesByMetadataName`** defines *what exists*
2. **`ALL_METADATA_NAME_MANY_TO_ONE_RELATIONS`** defines *how they
relate*
3. **`ALL_FLAT_ENTITY_CONFIGURATION`** defines *how to compare and
serialize them*

**Result:** Builders and validators become thin wrappers around
type-safe, configuration-driven logic instead of containing scattered,
error-prone manual implementations.

## What's next

### StandardOverrides standardization
Every metadata entity can be a standard one for a workspace if it's an
installed app, which means it might not expose the whole entity api to
be editable through an import dynamically
The standard overrides logic should not be applied to Fields and Objects
but to every entities

At the moment we have a logic of `EDITABLE_PROPERTIES` through the api,
and also `STANDARD_OVERRIDEDABLE_PROPERTIES`
This should be configuration centered like `propertiesToCompare` and
`propertiesToStringify`.
Scoping this PR to two last for the moment. As update dispatch to
standardOverrides could be considered as a side effect prefer waiting to
start the side effect refactor

### Granular Optimistic deprecation
With this new grain at runtime we will be able to add a flat entity and
dispatch its addition to related flat maps, so we don't have to describe
an optimistic method for each flat entity operations

See `addFlatEntityToFlatEntityAndRelatedEntityMapsOrThrow`

Note: Still in wip and included in this PR but about to create a new one
to integrate these utils and remove existing methods

### ValidateBuildAndRun dynamic args typed defintion
We should restrain the devxp to send expected flat maps entity as at
least from to or dependency as we now have the grain both a type lvl and
runtime to do so
It should not be possible in the devxp to forgot adding the views to the
v2 builder when passing the view field anymore ( that would lead to
permanent validation error in view field integrity checks )

## Conclusion
Thanks for reading and reviewing !
Any suggestions are more than welcomed ! ( same as for questions too ! )
This commit is contained in:
Paul Rastoin
2025-10-13 10:31:34 +02:00
committed by GitHub
parent 3a6621ef6c
commit 6188c72f74
265 changed files with 2537 additions and 3166 deletions
@@ -3,11 +3,11 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { ApiKeyModule } from 'src/engine/core-modules/api-key/api-key.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/field-metadata.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module';
import { ObjectPermissionModule } from 'src/engine/metadata-modules/object-permission/object-permission.module';
@@ -3,10 +3,10 @@ import { InjectDataSource } from '@nestjs/typeorm';
import { DataSource } from 'typeorm';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service';
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
@@ -1,23 +1,14 @@
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { type CreatedDeletedUpdatedActions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
import { getMetadataEmptyWorkspaceMigrationActionRecord } from 'src/engine/workspace-manager/workspace-migration-v2/utils/get-metadata-empty-workspace-migration-action-record.util';
const emptyCreatedDeletedUpdated: CreatedDeletedUpdatedActions<WorkspaceMigrationActionV2> =
{
created: [],
deleted: [],
updated: [],
};
export const EMPTY_ORCHESTRATOR_ACTIONS_REPORT = {
index: emptyCreatedDeletedUpdated,
objectMetadata: emptyCreatedDeletedUpdated,
view: emptyCreatedDeletedUpdated,
viewField: emptyCreatedDeletedUpdated,
fieldMetadata: emptyCreatedDeletedUpdated,
serverlessFunction: emptyCreatedDeletedUpdated,
databaseEventTrigger: emptyCreatedDeletedUpdated,
cronTrigger: emptyCreatedDeletedUpdated,
routeTrigger: emptyCreatedDeletedUpdated,
viewFilter: emptyCreatedDeletedUpdated,
} as const satisfies OrchestratorActionsReport;
export const EMPTY_ORCHESTRATOR_ACTIONS_REPORT = (
Object.keys(ALL_METADATA_NAME) as (keyof typeof ALL_METADATA_NAME)[]
).reduce(
(orchestratorReport, metadataName) => ({
...orchestratorReport,
[metadataName]:
getMetadataEmptyWorkspaceMigrationActionRecord(metadataName),
}),
{} as OrchestratorActionsReport,
);
@@ -1,10 +1,10 @@
import { type AllFlatEntitiesByMetadataEngineName } from 'src/engine/core-modules/common/types/all-flat-entities-by-metadata-engine-name.type';
import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name';
import { type FieldMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-field-metadata/types/field-metadata-minimal-information.type';
import { type ObjectMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-object-metadata/types/object-metadata-minimal-information.type';
import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { type TranslatedFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/translate-validation-errors.util';
import { type WorkspaceMigrationFieldActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationObjectActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { type WorkspaceMigrationFieldActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationObjectActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
export type ValidationErrorFieldResponse =
Partial<FieldMetadataMinimalInformation> & {
@@ -22,7 +22,7 @@ export type ValidationErrorResponse = {
summary: {
totalErrors: number;
} & {
[P in keyof AllFlatEntitiesByMetadataEngineName as `invalid${Capitalize<P>}`]: number;
[P in keyof AllFlatEntityTypesByMetadataName as `invalid${Capitalize<P>}`]: number;
};
errors: OrchestratorFailureReport;
};
@@ -2,8 +2,8 @@ import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { EMPTY_ALL_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { EMPTY_ALL_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { EMPTY_ORCHESTRATOR_ACTIONS_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-actions-report.constant';
import {
OrchestratorFailureReport,
@@ -458,7 +458,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
...aggregatedOrchestratorActionsReport.fieldMetadata.created,
...aggregatedOrchestratorActionsReport.fieldMetadata.updated,
...aggregatedOrchestratorActionsReport.index.created,
...aggregatedOrchestratorActionsReport.index.updated,
...aggregatedOrchestratorActionsReport.index.updated.flat(),
///
// Views
@@ -0,0 +1,8 @@
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export const isPropertyUpdate = <T, P extends keyof T>(
update: PropertyUpdate<T, keyof T>,
property: P,
): update is PropertyUpdate<T, P> => {
return update.property === property;
};
@@ -1,10 +1,10 @@
import { type FromTo } from 'twenty-shared/types';
import { type AllFlatEntitiesByMetadataEngineName } from 'src/engine/core-modules/common/types/all-flat-entities-by-metadata-engine-name.type';
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { type CreatedDeletedUpdatedActions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2';
@@ -18,16 +18,11 @@ export type WorkspaceMigrationOrchestratorBuildArgs = {
};
export type OrchestratorFailureReport = {
[P in keyof AllFlatEntitiesByMetadataEngineName]: FailedFlatEntityValidation<
AllFlatEntitiesByMetadataEngineName[P]
>[];
[P in AllMetadataName]: FailedFlatEntityValidation<MetadataFlatEntity<P>>[];
};
export type OrchestratorActionsReport = {
// TODO could improve this typing but making generic actions and using extract
[P in keyof AllFlatEntitiesByMetadataEngineName]: CreatedDeletedUpdatedActions<WorkspaceMigrationActionV2>;
} & {
fieldMetadata: CreatedDeletedUpdatedActions<WorkspaceMigrationActionV2>;
[P in AllMetadataName]: MetadataWorkspaceMigrationActionsRecord<P>;
};
export type WorkspaceMigrationOrchestratorFailedResult = {
@@ -9,8 +9,8 @@ import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-obje
import { EMPTY_ORCHESTRATOR_ACTIONS_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-actions-report.constant';
import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions } from 'src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
type CreateAggregationTestCase = EachTestingContext<{
input: OrchestratorActionsReport;
@@ -6,8 +6,8 @@ import {
import { EMPTY_ORCHESTRATOR_ACTIONS_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-actions-report.constant';
import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { aggregateOrchestratorActionsReportDeleteObjectAndDeleteFieldActions } from 'src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-delete-object-and-delete-field.util';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
type DeleteAggregationTestCase = EachTestingContext<{
input: OrchestratorActionsReport;
@@ -1,8 +1,8 @@
import { isDefined } from 'twenty-shared/utils';
import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
type AggregateOrchestratorActionsReportCreateObjectAndCreateFieldActionsArgs = {
orchestratorActionsReport: OrchestratorActionsReport;
@@ -1,8 +1,8 @@
import { isDefined } from 'twenty-shared/utils';
import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
type AggregateOrchestratorActionsReportDeleteObjectAndDeleteFieldActionsArgs = {
orchestratorActionsReport: OrchestratorActionsReport;
@@ -1,37 +1,57 @@
import { type FromTo } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-flat-entity-maps.constant';
import { type AllFlatEntities } from 'src/engine/core-modules/common/types/all-flat-entities.type';
import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { type ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant';
import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant';
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type';
import { type FlatEntityPropertiesToStringify } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-stringify.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { compareTwoFlatEntity } from 'src/engine/metadata-modules/flat-entity/utils/compare-two-flat-entity.util';
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
export type DeletedCreatedUpdatedMatrix<T extends AllFlatEntities> = {
createdFlatEntityMaps: FlatEntityMaps<T>;
deletedFlatEntityMaps: FlatEntityMaps<T>;
updatedFlatEntityMaps: FromTo<FlatEntityMaps<T>>;
export type DeletedCreatedUpdatedMatrix<T extends AllMetadataName> = {
createdFlatEntityMaps: MetadataFlatEntityMaps<T>;
deletedFlatEntityMaps: MetadataFlatEntityMaps<T>;
updatedFlatEntityMaps: {
byId: Record<
string,
{
updates: FlatEntityPropertiesUpdates<T>;
}
>;
};
};
export type UniversalIdentifierItem = {
universalIdentifier: string;
};
type FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs<
T extends AllMetadataName,
> = FromTo<MetadataFlatEntity<T>[]> & {
buildOptions: WorkspaceMigrationBuilderOptions;
comparisonOptions: Pick<
(typeof ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY)[T],
'propertiesToCompare' | 'propertiesToStringify'
>;
};
export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = <
T extends AllFlatEntities,
T extends AllMetadataName,
>({
from,
to,
buildOptions,
}: FromTo<T[]> & {
buildOptions: WorkspaceMigrationBuilderOptions;
}): DeletedCreatedUpdatedMatrix<T> => {
comparisonOptions: { propertiesToCompare, propertiesToStringify },
}: FlatEntityDeletedCreatedUpdatedMatrixDispatcherArgs<T>): DeletedCreatedUpdatedMatrix<T> => {
const initialDispatcher: DeletedCreatedUpdatedMatrix<T> = {
createdFlatEntityMaps: EMPTY_FLAT_ENTITY_MAPS,
deletedFlatEntityMaps: EMPTY_FLAT_ENTITY_MAPS,
updatedFlatEntityMaps: {
from: EMPTY_FLAT_ENTITY_MAPS,
to: EMPTY_FLAT_ENTITY_MAPS,
},
updatedFlatEntityMaps: { byId: {} },
};
const fromMap = new Map(from.map((obj) => [obj.universalIdentifier, obj]));
@@ -39,44 +59,54 @@ export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = <
if (buildOptions.inferDeletionFromMissingEntities) {
for (const [universalIdentifier, fromEntity] of fromMap) {
if (!toMap.has(universalIdentifier)) {
initialDispatcher.deletedFlatEntityMaps =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: fromEntity,
flatEntityMaps: initialDispatcher.deletedFlatEntityMaps,
});
if (toMap.has(universalIdentifier)) {
continue;
}
initialDispatcher.deletedFlatEntityMaps =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: fromEntity,
flatEntityMaps: initialDispatcher.deletedFlatEntityMaps,
});
}
}
for (const [universalIdentifier, toFlatEntity] of toMap) {
if (!fromMap.has(universalIdentifier)) {
initialDispatcher.createdFlatEntityMaps =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: toFlatEntity,
flatEntityMaps: initialDispatcher.createdFlatEntityMaps,
});
if (fromMap.has(universalIdentifier)) {
continue;
}
initialDispatcher.createdFlatEntityMaps =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: toFlatEntity,
flatEntityMaps: initialDispatcher.createdFlatEntityMaps,
});
}
for (const [universalIdentifier, fromFlatEntity] of fromMap) {
const toFlatEntity = toMap.get(universalIdentifier);
// TODO Perf improvement compare directly here to avoid mapping the whole workspaces + avoid compare duplication
// Would not have FromTo anymore but an PropertyUpdates[]
if (toFlatEntity) {
initialDispatcher.updatedFlatEntityMaps.from =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: fromFlatEntity,
flatEntityMaps: initialDispatcher.updatedFlatEntityMaps.from,
});
initialDispatcher.updatedFlatEntityMaps.to =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: toFlatEntity,
flatEntityMaps: initialDispatcher.updatedFlatEntityMaps.to,
});
if (!isDefined(toFlatEntity)) {
continue;
}
const updates = compareTwoFlatEntity({
fromFlatEntity,
toFlatEntity,
propertiesToCompare: propertiesToCompare as unknown as Extract<
FlatEntityPropertiesToCompare<T>,
keyof MetadataFlatEntity<T>
>[],
propertiesToStringify: propertiesToStringify as unknown as Extract<
FlatEntityPropertiesToStringify<T>,
keyof MetadataFlatEntity<T>
>[],
});
if (updates.length === 0) {
continue;
}
initialDispatcher.updatedFlatEntityMaps.byId[toFlatEntity.id] = {
updates,
};
}
return initialDispatcher;
@@ -0,0 +1,13 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
export const getMetadataEmptyWorkspaceMigrationActionRecord = <
T extends AllMetadataName,
>(
_metadataName: T,
) =>
({
created: [],
deleted: [],
updated: [],
}) as MetadataWorkspaceMigrationActionsRecord<T>;
@@ -1,6 +0,0 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type CronTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -1,54 +1,34 @@
import { Injectable } from '@nestjs/common';
import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type';
import { compareTwoFlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/utils/compare-two-flat-cron-trigger.util';
import { CronTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/cron-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateCronTriggerAction,
WorkspaceMigrationCronTriggerActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-cron-trigger-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { UpdateCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/workspace-migration-cron-trigger-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatCronTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-cron-trigger-validator.service';
@Injectable()
export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'cronTrigger',
FlatCronTrigger,
WorkspaceMigrationCronTriggerActionV2,
CronTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.cronTrigger
> {
constructor(
private readonly flatCronTriggerValidatorService: FlatCronTriggerValidatorService,
) {
super('cronTrigger');
super(ALL_METADATA_NAME.cronTrigger);
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.cronTrigger>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.cronTrigger,
'created'
>
> {
const validationResult =
await this.flatCronTriggerValidatorService.validateFlatCronTriggerCreation(
{
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -58,6 +38,11 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatCronTriggerToValidate,
} = args;
return {
status: 'success',
action: {
@@ -68,26 +53,18 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
};
}
protected async validateFlatEntityDeletion({
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.cronTrigger>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.cronTrigger,
'deleted'
>
> {
const validationResult =
this.flatCronTriggerValidatorService.validateFlatCronTriggerDeletion({
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
this.flatCronTriggerValidatorService.validateFlatCronTriggerDeletion(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -96,6 +73,11 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
};
}
const {
flatEntityToValidate: flatCronTriggerToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -106,36 +88,16 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
};
}
protected async validateFlatEntityUpdate({
flatEntityUpdate: { from: fromFlatCronTrigger, to: toFlatCronTrigger },
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.cronTrigger>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.cronTrigger,
'updated'
>
> {
const cronTriggerUpdatedProperties = compareTwoFlatCronTrigger({
fromFlatCronTrigger,
toFlatCronTrigger,
});
if (cronTriggerUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatCronTriggerValidatorService.validateFlatCronTriggerUpdate({
flatCronTriggerToValidate: toFlatCronTrigger,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
this.flatCronTriggerValidatorService.validateFlatCronTriggerUpdate(args);
if (validationResult.errors.length > 0) {
return {
@@ -143,11 +105,16 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
...validationResult,
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateCronTriggerAction: UpdateCronTriggerAction = {
type: 'update_cron_trigger',
cronTriggerId: toFlatCronTrigger.id,
updates: cronTriggerUpdatedProperties,
cronTriggerId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,6 +0,0 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type DatabaseEventTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -1,6 +1,5 @@
import { type FlatDatabaseEventTriggerPropertiesToCompare } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger-properties-to-compare.type';
import { type FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
export type CreateDatabaseEventTriggerAction = {
type: 'create_database_event_trigger';
@@ -10,14 +9,7 @@ export type CreateDatabaseEventTriggerAction = {
export type UpdateDatabaseEventTriggerAction = {
type: 'update_database_event_trigger';
databaseEventTriggerId: string;
updates: Array<
{
[P in FlatDatabaseEventTriggerPropertiesToCompare]: PropertyUpdate<
FlatDatabaseEventTrigger,
P
>;
}[FlatDatabaseEventTriggerPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'databaseEventTrigger'>;
};
export type DeleteDatabaseEventTriggerAction = {
@@ -1,54 +1,36 @@
import { Injectable } from '@nestjs/common';
import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type';
import { compareTwoFlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/utils/compare-two-flat-database-event-trigger.util';
import { DatabaseEventTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/database-event-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateDatabaseEventTriggerAction,
WorkspaceMigrationDatabaseEventTriggerActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-database-event-trigger-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { UpdateDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/workspace-migration-database-event-trigger-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatDatabaseEventTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-database-event-trigger-validator.service';
@Injectable()
export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'databaseEventTrigger',
FlatDatabaseEventTrigger,
WorkspaceMigrationDatabaseEventTriggerActionV2,
DatabaseEventTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.databaseEventTrigger
> {
constructor(
private readonly flatDatabaseEventTriggerValidatorService: FlatDatabaseEventTriggerValidatorService,
) {
super('databaseEventTrigger');
super(ALL_METADATA_NAME.databaseEventTrigger);
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.databaseEventTrigger,
'created'
>
> {
const validationResult =
await this.flatDatabaseEventTriggerValidatorService.validateFlatDatabaseEventTriggerCreation(
{
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -58,6 +40,11 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
};
}
const {
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -68,27 +55,19 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
};
}
protected async validateFlatEntityDeletion({
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.databaseEventTrigger,
'deleted'
>
> {
const validationResult =
this.flatDatabaseEventTriggerValidatorService.validateFlatDatabaseEventTriggerDeletion(
{
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -98,6 +77,11 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
};
}
const {
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -108,41 +92,19 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
};
}
protected async validateFlatEntityUpdate({
flatEntityUpdate: {
from: fromFlatDatabaseEventTrigger,
to: toFlatDatabaseEventTrigger,
},
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.databaseEventTrigger,
'updated'
>
> {
const databaseEventTriggerUpdatedProperties =
compareTwoFlatDatabaseEventTrigger({
fromFlatDatabaseEventTrigger,
toFlatDatabaseEventTrigger,
});
if (databaseEventTriggerUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatDatabaseEventTriggerValidatorService.validateFlatDatabaseEventTriggerUpdate(
{
flatDatabaseEventTriggerToValidate: toFlatDatabaseEventTrigger,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -152,10 +114,16 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateDatabaseEventTriggerAction: UpdateDatabaseEventTriggerAction = {
type: 'update_database_event_trigger',
databaseEventTriggerId: toFlatDatabaseEventTrigger.id,
updates: databaseEventTriggerUpdatedProperties,
databaseEventTriggerId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,6 +1,5 @@
import { type FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateFieldAction = {
type: 'create_field';
@@ -12,14 +11,7 @@ export type UpdateFieldAction = {
type: 'update_field';
fieldMetadataId: string;
objectMetadataId: string;
updates: Array<
{
[P in FlatFieldMetadataPropertiesToCompare]: PropertyUpdate<
FlatFieldMetadata,
P
>;
}[FlatFieldMetadataPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'fieldMetadata'>;
};
export type DeleteFieldAction = {
@@ -2,65 +2,39 @@ import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateFieldAction,
WorkspaceMigrationFieldActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatFieldMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-field-metadata-validator.service';
export type FieldMetadataRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatObjectMetadataMaps'
>;
@Injectable()
export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'fieldMetadata',
FlatFieldMetadata,
WorkspaceMigrationFieldActionV2,
FieldMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.fieldMetadata
> {
constructor(
private readonly flatFieldValidatorService: FlatFieldMetadataValidatorService,
) {
super('fieldMetadata');
super(ALL_METADATA_NAME.fieldMetadata);
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatFieldMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
workspaceId,
remainingFlatEntityMapsToValidate,
}: FlatEntityValidationArgs<
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.fieldMetadata>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationFieldActionV2,
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.fieldMetadata,
'created'
>
> {
const validationResult =
await this.flatFieldValidatorService.validateFlatFieldMetadataCreation({
dependencyOptimisticFlatEntityMaps,
flatFieldMetadataToValidate,
optimisticFlatFieldMetadataMaps,
workspaceId,
remainingFlatEntityMapsToValidate,
});
await this.flatFieldValidatorService.validateFlatFieldMetadataCreation(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -69,6 +43,11 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatFieldMetadataToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -100,28 +79,16 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatFieldMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
workspaceId,
}: FlatEntityValidationArgs<
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.fieldMetadata>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationFieldActionV2,
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.fieldMetadata,
'deleted'
>
> {
const validationResult =
this.flatFieldValidatorService.validateFlatFieldMetadataDeletion({
dependencyOptimisticFlatEntityMaps,
flatFieldMetadataToValidate,
optimisticFlatFieldMetadataMaps,
workspaceId,
});
this.flatFieldValidatorService.validateFlatFieldMetadataDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -130,6 +97,11 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatFieldMetadataToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -161,38 +133,20 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: { from: fromFlatFieldMetadata, to: toFlatFieldMetadata },
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
workspaceId,
}: FlatEntityUpdateValidationArgs<
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationFieldActionV2,
FlatFieldMetadata,
FieldMetadataRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.fieldMetadata
>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.fieldMetadata,
'updated'
>
> {
const flatFieldMetadataUpdatedProperties = compareTwoFlatFieldMetadata({
fromFlatFieldMetadata,
toFlatFieldMetadata,
});
if (flatFieldMetadataUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
await this.flatFieldValidatorService.validateFlatFieldMetadataUpdate({
dependencyOptimisticFlatEntityMaps,
flatFieldMetadataToValidate: toFlatFieldMetadata,
optimisticFlatFieldMetadataMaps,
workspaceId,
});
await this.flatFieldValidatorService.validateFlatFieldMetadataUpdate(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -201,11 +155,23 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatEntityId,
flatEntityMaps: optimisticFlatEntityMaps,
});
const updateFieldAction: UpdateFieldAction = {
type: 'update_field',
fieldMetadataId: toFlatFieldMetadata.id,
objectMetadataId: toFlatFieldMetadata.objectMetadataId,
updates: flatFieldMetadataUpdatedProperties,
fieldMetadataId: flatEntityId,
objectMetadataId: flatFieldMetadata.objectMetadataId,
updates: flatEntityUpdates,
};
return {
@@ -1,60 +1,39 @@
import { Injectable } from '@nestjs/common';
import { t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
import { compareTwoFlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/utils/compare-two-flat-index-metadata.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { WorkspaceMigrationIndexActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant';
import { FlatEntityMapsExceptionCode } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatIndexValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-index-metadata-validator.service';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
export type IndexRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatFieldMetadataMaps' | 'flatObjectMetadataMaps'
>;
@Injectable()
export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'index',
FlatIndexMetadata,
WorkspaceMigrationIndexActionV2,
IndexRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.index
> {
constructor(
private readonly flatIndexValidatorService: FlatIndexValidatorService,
) {
super('index');
super(ALL_METADATA_NAME.index);
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatIndexToValidate,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
}: FlatEntityValidationArgs<
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationIndexActionV2,
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.index>,
): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.index, 'created'>
> {
const validationResult =
this.flatIndexValidatorService.validateFlatIndexCreation({
dependencyOptimisticFlatEntityMaps,
flatIndexToValidate,
optimisticFlatIndexMaps,
});
this.flatIndexValidatorService.validateFlatIndexCreation(args);
if (validationResult.errors.length > 0) {
return {
@@ -63,6 +42,11 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatIndexToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -94,26 +78,13 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatIndexToValidate,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
}: FlatEntityValidationArgs<
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationIndexActionV2,
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.index>,
): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.index, 'deleted'>
> {
const validationResult =
this.flatIndexValidatorService.validateFlatIndexDeletion({
dependencyOptimisticFlatEntityMaps,
flatIndexToValidate,
optimisticFlatIndexMaps,
});
this.flatIndexValidatorService.validateFlatIndexDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -122,6 +93,11 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatIndexToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -154,34 +130,41 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: { from: fromFlatIndex, to: toFlatIndex },
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
}: FlatEntityUpdateValidationArgs<
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationIndexActionV2,
FlatIndexMetadata,
IndexRelatedFlatEntityMaps
>
| undefined
dependencyOptimisticFlatEntityMaps,
buildOptions,
workspaceId,
}: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.index>): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.index, 'updated'>
> {
const indexUpdatedProperties = compareTwoFlatIndexMetadata({
fromFlatIndexMetadata: fromFlatIndex,
toFlatIndexMetadata: toFlatIndex,
const flatEntity = findFlatEntityByIdInFlatEntityMaps({
flatEntityId,
flatEntityMaps: optimisticFlatIndexMaps,
});
if (indexUpdatedProperties.length === 0) {
return undefined;
if (!isDefined(flatEntity)) {
return {
status: 'fail',
type: 'delete_index',
flatEntityMinimalInformation: {},
errors: [
{
code: FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
message: t`Index to delete not found`,
},
],
};
}
const deletionValidationResult =
this.flatIndexValidatorService.validateFlatIndexDeletion({
buildOptions,
dependencyOptimisticFlatEntityMaps,
flatIndexToValidate: fromFlatIndex,
optimisticFlatIndexMaps,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
workspaceId,
flatEntityToValidate: flatEntity,
remainingFlatEntityMapsToValidate: EMPTY_FLAT_ENTITY_MAPS,
});
if (deletionValidationResult.errors.length > 0) {
@@ -191,14 +174,24 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
const updatedFlatIndex = {
...flatEntity,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const creationValidationResult =
this.flatIndexValidatorService.validateFlatIndexCreation({
buildOptions,
dependencyOptimisticFlatEntityMaps,
flatIndexToValidate: toFlatIndex,
optimisticFlatIndexMaps: deleteFlatEntityFromFlatEntityMapsOrThrow({
entityToDeleteId: fromFlatIndex.id,
workspaceId,
flatEntityToValidate: updatedFlatIndex,
optimisticFlatEntityMaps: deleteFlatEntityFromFlatEntityMapsOrThrow({
entityToDeleteId: flatEntity.id,
flatEntityMaps: optimisticFlatIndexMaps,
}),
remainingFlatEntityMapsToValidate: EMPTY_FLAT_ENTITY_MAPS,
});
if (creationValidationResult.errors.length > 0) {
@@ -213,11 +206,11 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
action: [
{
type: 'delete_index',
flatIndexMetadataId: fromFlatIndex.id,
flatIndexMetadataId: flatEntity.id,
},
{
type: 'create_index',
flatIndexMetadata: toFlatIndex,
flatIndexMetadata: updatedFlatIndex,
},
],
dependencyOptimisticFlatEntityMaps,
@@ -1,7 +1,6 @@
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatObjectMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-properties-to-compare.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateObjectAction = {
type: 'create_object';
@@ -9,19 +8,10 @@ export type CreateObjectAction = {
flatFieldMetadatas: FlatFieldMetadata[];
};
export type FlatObjectPropertiesUpdates = Array<
{
[P in FlatObjectMetadataPropertiesToCompare]: PropertyUpdate<
FlatObjectMetadata,
P
>;
}[FlatObjectMetadataPropertiesToCompare]
>;
export type UpdateObjectAction = {
type: 'update_object';
objectMetadataId: string;
updates: FlatObjectPropertiesUpdates;
updates: FlatEntityPropertiesUpdates<'objectMetadata'>;
};
export type DeleteObjectAction = {
@@ -1,59 +1,35 @@
import { Injectable } from '@nestjs/common';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { compareTwoFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/compare-two-flat-object-metadata.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateObjectAction,
WorkspaceMigrationObjectActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatObjectMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-object-metadata-validator.service';
export type ObjectMetadataRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatFieldMetadataMaps'
>;
@Injectable()
export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'objectMetadata',
FlatObjectMetadata,
WorkspaceMigrationObjectActionV2,
ObjectMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.objectMetadata
> {
constructor(
private readonly flatObjectValidatorService: FlatObjectMetadataValidatorService,
) {
super('objectMetadata');
super(ALL_METADATA_NAME.objectMetadata);
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatObjectMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.objectMetadata>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationObjectActionV2,
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.objectMetadata,
'created'
>
> {
const validationResult =
await this.flatObjectValidatorService.validateFlatObjectMetadataCreation({
buildOptions,
flatObjectMetadataToValidate,
optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
});
await this.flatObjectValidatorService.validateFlatObjectMetadataCreation(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -62,6 +38,11 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEn
};
}
const {
flatEntityToValidate: flatObjectMetadataToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -73,28 +54,16 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEn
};
}
protected async validateFlatEntityDeletion({
buildOptions,
flatEntityToValidate: flatObjectMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.objectMetadata>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationObjectActionV2,
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.objectMetadata,
'deleted'
>
> {
const validationResult =
this.flatObjectValidatorService.validateFlatObjectMetadataDeletion({
buildOptions,
flatObjectMetadataToValidate,
optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
});
this.flatObjectValidatorService.validateFlatObjectMetadataDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -103,6 +72,11 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEn
};
}
const {
flatEntityToValidate: flatObjectMetadataToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -113,42 +87,18 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEn
};
}
protected async validateFlatEntityUpdate({
buildOptions,
flatEntityUpdate: {
from: fromFlatObjectMetadata,
to: toFlatObjectMetadata,
},
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationObjectActionV2,
FlatObjectMetadata,
ObjectMetadataRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.objectMetadata,
'updated'
>
> {
const flatObjectPropertiesUpdates = compareTwoFlatObjectMetadata({
fromFlatObjectMetadata,
toFlatObjectMetadata,
});
if (flatObjectPropertiesUpdates.length === 0) {
return undefined;
}
const validationResult =
this.flatObjectValidatorService.validateFlatObjectMetadataUpdate({
buildOptions,
flatObjectMetadataToValidate: toFlatObjectMetadata,
optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
flatObjectPropertiesUpdates: flatObjectPropertiesUpdates,
});
this.flatObjectValidatorService.validateFlatObjectMetadataUpdate(args);
if (validationResult.errors.length > 0) {
return {
@@ -157,10 +107,16 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService extends WorkspaceEn
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateObjectAction: UpdateObjectAction = {
type: 'update_object',
objectMetadataId: toFlatObjectMetadata.id,
updates: flatObjectPropertiesUpdates,
objectMetadataId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,6 +0,0 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type RouteTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -1,6 +1,5 @@
import { type FlatRouteTriggerPropertiesToCompare } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateRouteTriggerAction = {
type: 'create_route_trigger';
@@ -10,14 +9,7 @@ export type CreateRouteTriggerAction = {
export type UpdateRouteTriggerAction = {
type: 'update_route_trigger';
routeTriggerId: string;
updates: Array<
{
[P in FlatRouteTriggerPropertiesToCompare]: PropertyUpdate<
FlatRouteTrigger,
P
>;
}[FlatRouteTriggerPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'routeTrigger'>;
};
export type DeleteRouteTriggerAction = {
@@ -1,54 +1,34 @@
import { Injectable } from '@nestjs/common';
import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { compareTwoFlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/utils/compare-two-flat-route-trigger.util';
import { RouteTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/route-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateRouteTriggerAction,
WorkspaceMigrationRouteTriggerActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { UpdateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatRouteTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-route-trigger-validator.service';
@Injectable()
export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'routeTrigger',
FlatRouteTrigger,
WorkspaceMigrationRouteTriggerActionV2,
RouteTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.routeTrigger
> {
constructor(
private readonly flatRouteTriggerValidatorService: FlatRouteTriggerValidatorService,
) {
super('routeTrigger');
super(ALL_METADATA_NAME.routeTrigger);
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.routeTrigger>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.routeTrigger,
'created'
>
> {
const validationResult =
await this.flatRouteTriggerValidatorService.validateFlatRouteTriggerCreation(
{
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -58,6 +38,11 @@ export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends Works
};
}
const {
flatEntityToValidate: flatRouteTriggerToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -68,26 +53,18 @@ export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends Works
};
}
protected async validateFlatEntityDeletion({
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.routeTrigger>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.routeTrigger,
'deleted'
>
> {
const validationResult =
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerDeletion({
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerDeletion(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -96,6 +73,11 @@ export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends Works
};
}
const {
flatEntityToValidate: flatRouteTriggerToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -106,36 +88,18 @@ export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends Works
};
}
protected async validateFlatEntityUpdate({
flatEntityUpdate: { from: fromFlatRouteTrigger, to: toFlatRouteTrigger },
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.routeTrigger>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.routeTrigger,
'updated'
>
> {
const routeTriggerUpdatedProperties = compareTwoFlatRouteTrigger({
fromFlatRouteTrigger,
toFlatRouteTrigger,
});
if (routeTriggerUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerUpdate({
flatRouteTriggerToValidate: toFlatRouteTrigger,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerUpdate(
args,
);
if (validationResult.errors.length > 0) {
return {
@@ -144,10 +108,16 @@ export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends Works
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateRouteTriggerAction: UpdateRouteTriggerAction = {
type: 'update_route_trigger',
routeTriggerId: toFlatRouteTrigger.id,
updates: routeTriggerUpdatedProperties,
routeTriggerId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,6 +1,5 @@
import { type FlatServerlessFunctionPropertiesToCompare } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
import { type ServerlessFunctionCode } from 'src/engine/metadata-modules/serverless-function/types/serverless-function-code.type';
export type CreateServerlessFunctionAction = {
@@ -12,14 +11,7 @@ export type UpdateServerlessFunctionAction = {
type: 'update_serverless_function';
serverlessFunctionId: string;
code?: ServerlessFunctionCode;
updates: Array<
{
[P in FlatServerlessFunctionPropertiesToCompare]: PropertyUpdate<
FlatServerlessFunction,
P
>;
}[FlatServerlessFunctionPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'serverlessFunction'>;
};
export type DeleteServerlessFunctionAction = {
@@ -1,48 +1,36 @@
import { Injectable } from '@nestjs/common';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { compareTwoFlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/utils/compare-two-flat-serverless-function.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateServerlessFunctionAction,
WorkspaceMigrationServerlessFunctionActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { UpdateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatServerlessFunctionValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-serverless-function-validator.service';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'serverlessFunction',
FlatServerlessFunction,
WorkspaceMigrationServerlessFunctionActionV2,
undefined
typeof ALL_METADATA_NAME.serverlessFunction
> {
constructor(
private readonly flatServerlessFunctionValidatorService: FlatServerlessFunctionValidatorService,
) {
super('serverlessFunction');
super(ALL_METADATA_NAME.serverlessFunction);
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatServerlessFunction>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.serverlessFunction>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
typeof ALL_METADATA_NAME.serverlessFunction,
'created'
>
> {
const validationResult =
await this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionCreation(
{
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -52,6 +40,11 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
};
}
const {
flatEntityToValidate: flatServerlessFunctionToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -62,22 +55,17 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
};
}
protected async validateFlatEntityDeletion({
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatServerlessFunction>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.serverlessFunction>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
typeof ALL_METADATA_NAME.serverlessFunction,
'deleted'
>
> {
const validationResult =
this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionDeletion(
{
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -87,6 +75,11 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
};
}
const {
flatEntityToValidate: flatServerlessFunctionToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
return {
status: 'success',
action: {
@@ -97,36 +90,19 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
};
}
protected async validateFlatEntityUpdate({
flatEntityUpdate: {
from: fromFlatServerlessFunction,
to: toFlatServerlessFunction,
},
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<FlatServerlessFunction>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.serverlessFunction,
'updated'
>
> {
const serverlessFunctionUpdatedProperties =
compareTwoFlatServerlessFunction({
fromFlatServerlessFunction,
toFlatServerlessFunction,
});
if (serverlessFunctionUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionUpdate(
{
flatServerlessFunctionToValidate: toFlatServerlessFunction,
optimisticFlatServerlessFunctionMaps,
},
args,
);
if (validationResult.errors.length > 0) {
@@ -136,11 +112,29 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps,
} = args;
const existingEntity = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId,
flatEntityMaps: optimisticFlatEntityMaps,
});
const updatedEntity = {
...existingEntity,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const updateServerlessFunctionAction: UpdateServerlessFunctionAction = {
type: 'update_serverless_function',
serverlessFunctionId: toFlatServerlessFunction.id,
updates: serverlessFunctionUpdatedProperties,
code: toFlatServerlessFunction.code,
serverlessFunctionId: flatEntityId,
updates: flatEntityUpdates,
code: updatedEntity.code,
};
return {
@@ -1,6 +1,6 @@
import { type MessageDescriptor } from '@lingui/core';
import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type';
import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type';
import { type WorkspaceMigrationActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
export type FlatEntityValidationError<TCode extends string = string> = {
@@ -1,6 +0,0 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type ViewFieldRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatViewMaps' | 'flatFieldMetadataMaps' | 'flatObjectMetadataMaps'
>;
@@ -1,6 +1,5 @@
import { type FlatViewFieldPropertiesToCompare } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateViewFieldAction = {
type: 'create_view_field';
@@ -10,11 +9,7 @@ export type CreateViewFieldAction = {
export type UpdateViewFieldAction = {
type: 'update_view_field';
viewFieldId: string;
updates: Array<
{
[P in FlatViewFieldPropertiesToCompare]: PropertyUpdate<FlatViewField, P>;
}[FlatViewFieldPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'viewField'>;
};
export type DeleteViewFieldAction = {
@@ -2,57 +2,37 @@ import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { compareTwoFlatViewField } from 'src/engine/metadata-modules/flat-view-field/utils/compare-two-flat-view-field.util';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/view-field-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateViewFieldAction,
WorkspaceMigrationViewFieldActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/workspace-migration-view-field-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service';
@Injectable()
export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'viewField',
FlatViewField,
WorkspaceMigrationViewFieldActionV2,
ViewFieldRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewField
> {
constructor(
private readonly flatViewFieldValidatorService: FlatViewFieldValidatorService,
) {
super('viewField');
super(ALL_METADATA_NAME.viewField);
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewFieldToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
}: FlatEntityValidationArgs<
FlatViewField,
ViewFieldRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.viewField>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewFieldActionV2,
FlatViewField,
ViewFieldRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewField,
'created'
>
> {
const validationResult =
this.flatViewFieldValidatorService.validateFlatViewFieldCreation({
dependencyOptimisticFlatEntityMaps,
flatViewFieldToValidate,
optimisticFlatViewFieldMaps,
});
this.flatViewFieldValidatorService.validateFlatViewFieldCreation(args);
if (validationResult.errors.length > 0) {
return {
@@ -61,6 +41,11 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewFieldToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
@@ -106,26 +91,16 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewFieldToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
}: FlatEntityValidationArgs<
FlatViewField,
ViewFieldRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.viewField>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewFieldActionV2,
FlatViewField,
ViewFieldRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewField,
'deleted'
>
> {
const validationResult =
this.flatViewFieldValidatorService.validateFlatViewFieldDeletion({
dependencyOptimisticFlatEntityMaps,
flatViewFieldToValidate,
optimisticFlatViewFieldMaps,
});
this.flatViewFieldValidatorService.validateFlatViewFieldDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -134,6 +109,11 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewFieldToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
@@ -183,36 +163,16 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: { from: fromFlatViewField, to: toFlatViewField },
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
}: FlatEntityUpdateValidationArgs<
FlatViewField,
ViewFieldRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationViewFieldActionV2,
FlatViewField,
ViewFieldRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.viewField>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.viewField,
'updated'
>
> {
const viewFieldUpdatedProperties = compareTwoFlatViewField({
fromFlatViewField,
toFlatViewField,
});
if (viewFieldUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatViewFieldValidatorService.validateFlatViewFieldUpdate({
dependencyOptimisticFlatEntityMaps,
flatViewFieldToValidate: toFlatViewField,
optimisticFlatViewFieldMaps,
});
this.flatViewFieldValidatorService.validateFlatViewFieldUpdate(args);
if (validationResult.errors.length > 0) {
return {
@@ -221,10 +181,16 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateViewFieldAction: UpdateViewFieldAction = {
type: 'update_view_field',
viewFieldId: toFlatViewField.id,
updates: viewFieldUpdatedProperties,
viewFieldId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,6 +0,0 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type ViewFilterRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatViewMaps' | 'flatFieldMetadataMaps'
>;
@@ -1,6 +1,5 @@
import { type FlatViewFilterPropertiesToCompare } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateViewFilterAction = {
type: 'create_view_filter';
@@ -10,14 +9,7 @@ export type CreateViewFilterAction = {
export type UpdateViewFilterAction = {
type: 'update_view_filter';
viewFilterId: string;
updates: Array<
{
[P in FlatViewFilterPropertiesToCompare]: PropertyUpdate<
FlatViewFilter,
P
>;
}[FlatViewFilterPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'viewFilter'>;
};
export type DeleteViewFilterAction = {
@@ -2,57 +2,37 @@ import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { compareTwoFlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/utils/compare-two-flat-view-filter.util';
import { ViewFilterRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/view-filter-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateViewFilterAction,
WorkspaceMigrationViewFilterActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-filter-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatViewFilterValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-filter-validator.service';
@Injectable()
export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'viewFilter',
FlatViewFilter,
WorkspaceMigrationViewFilterActionV2,
ViewFilterRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewFilter
> {
constructor(
private readonly flatViewFilterValidatorService: FlatViewFilterValidatorService,
) {
super('viewFilter');
super(ALL_METADATA_NAME.viewFilter);
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
}: FlatEntityValidationArgs<
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.viewFilter>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewFilterActionV2,
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewFilter,
'created'
>
> {
const validationResult =
this.flatViewFilterValidatorService.validateFlatViewFilterCreation({
dependencyOptimisticFlatEntityMaps,
flatViewFilterToValidate,
optimisticFlatViewFilterMaps,
});
this.flatViewFilterValidatorService.validateFlatViewFilterCreation(args);
if (validationResult.errors.length > 0) {
return {
@@ -61,6 +41,11 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
const {
flatEntityToValidate: flatViewFilterToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFilterToValidate.viewId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps,
@@ -87,25 +72,16 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
}: FlatEntityValidationArgs<
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
>): Promise<
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.viewFilter>,
): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewFilterActionV2,
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.viewFilter,
'deleted'
>
> {
const validationResult =
this.flatViewFilterValidatorService.validateFlatViewFilterDeletion({
flatViewFilterToValidate,
optimisticFlatViewFilterMaps,
});
this.flatViewFilterValidatorService.validateFlatViewFilterDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -114,6 +90,11 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
const {
flatEntityToValidate: flatViewFilterToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.viewId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps,
@@ -144,36 +125,16 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: { from: fromFlatViewFilter, to: toFlatViewFilter },
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
}: FlatEntityUpdateValidationArgs<
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationViewFilterActionV2,
FlatViewFilter,
ViewFilterRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.viewFilter>,
): Promise<
FlatEntityValidationReturnType<
typeof ALL_METADATA_NAME.viewFilter,
'updated'
>
> {
const viewFilterUpdatedProperties = compareTwoFlatViewFilter({
fromFlatViewFilter,
toFlatViewFilter,
});
if (viewFilterUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatViewFilterValidatorService.validateFlatViewFilterUpdate({
dependencyOptimisticFlatEntityMaps,
flatViewFilterToValidate: toFlatViewFilter,
optimisticFlatViewFilterMaps,
});
this.flatViewFilterValidatorService.validateFlatViewFilterUpdate(args);
if (validationResult.errors.length > 0) {
return {
@@ -182,10 +143,16 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateViewFilterAction: UpdateViewFilterAction = {
type: 'update_view_filter',
viewFilterId: toFlatViewFilter.id,
updates: viewFilterUpdatedProperties,
viewFilterId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -1,12 +1,5 @@
import { type FromTo } from 'twenty-shared/types';
import { type FlatViewPropertiesToCompare } from 'src/engine/metadata-modules/flat-view/types/flat-view-properties-to-compare.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity';
export type FlatViewPropertyUpdate<P extends FlatViewPropertiesToCompare> = {
property: P;
} & FromTo<ViewEntity[P]>;
export type CreateViewAction = {
type: 'create_view';
@@ -16,11 +9,7 @@ export type CreateViewAction = {
export type UpdateViewAction = {
type: 'update_view';
viewId: string;
updates: Array<
{
[P in FlatViewPropertiesToCompare]: FlatViewPropertyUpdate<P>;
}[FlatViewPropertiesToCompare]
>;
updates: FlatEntityPropertiesUpdates<'view'>;
};
export type DeleteViewAction = {
@@ -2,58 +2,34 @@ import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
import { compareTwoFlatView } from 'src/engine/metadata-modules/flat-view/utils/compare-two-flat-view.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateViewAction,
WorkspaceMigrationViewActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/types/workspace-migration-view-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service';
export type ViewRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatObjectMetadataMaps'
>;
@Injectable()
export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'view',
FlatView,
WorkspaceMigrationViewActionV2,
ViewRelatedFlatEntityMaps
typeof ALL_METADATA_NAME.view
> {
constructor(
private readonly flatViewValidatorService: FlatViewValidatorService,
) {
super('view');
super(ALL_METADATA_NAME.view);
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewToValidate,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
}: FlatEntityValidationArgs<FlatView, ViewRelatedFlatEntityMaps>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewActionV2,
FlatView,
ViewRelatedFlatEntityMaps
>
protected async validateFlatEntityCreation(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.view>,
): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.view, 'created'>
> {
const validationResult =
await this.flatViewValidatorService.validateFlatViewCreation({
dependencyOptimisticFlatEntityMaps,
flatViewToValidate,
optimisticFlatViewMaps,
});
await this.flatViewValidatorService.validateFlatViewCreation(args);
if (validationResult.errors.length > 0) {
return {
@@ -61,6 +37,12 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
...validationResult,
};
}
const {
flatEntityToValidate: flatViewToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -87,23 +69,13 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatViewToValidate,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
}: FlatEntityValidationArgs<FlatView, ViewRelatedFlatEntityMaps>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationViewActionV2,
FlatView,
ViewRelatedFlatEntityMaps
>
protected async validateFlatEntityDeletion(
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.view>,
): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.view, 'deleted'>
> {
const validationResult =
this.flatViewValidatorService.validateFlatViewDeletion({
dependencyOptimisticFlatEntityMaps,
flatViewToValidate,
optimisticFlatViewMaps,
});
this.flatViewValidatorService.validateFlatViewDeletion(args);
if (validationResult.errors.length > 0) {
return {
@@ -112,6 +84,11 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
const {
flatEntityToValidate: flatViewToValidate,
dependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewToValidate.objectMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
@@ -142,36 +119,13 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: { from: fromFlatView, to: toFlatView },
optimisticFlatEntityMaps: optimisticFlatViewMaps,
}: FlatEntityUpdateValidationArgs<
FlatView,
ViewRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationViewActionV2,
FlatView,
ViewRelatedFlatEntityMaps
>
| undefined
protected async validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.view>,
): Promise<
FlatEntityValidationReturnType<typeof ALL_METADATA_NAME.view, 'updated'>
> {
const viewUpdatedProperties = compareTwoFlatView({
fromFlatView,
toFlatView,
});
if (viewUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatViewValidatorService.validateFlatViewUpdate({
dependencyOptimisticFlatEntityMaps,
flatViewToValidate: toFlatView,
optimisticFlatViewMaps,
});
this.flatViewValidatorService.validateFlatViewUpdate(args);
if (validationResult.errors.length > 0) {
return {
@@ -180,10 +134,16 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
const {
dependencyOptimisticFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
} = args;
const updateViewAction: UpdateViewAction = {
type: 'update_view',
viewId: toFlatView.id,
updates: viewUpdatedProperties,
viewId: flatEntityId,
updates: flatEntityUpdates,
};
return {
@@ -3,147 +3,41 @@ import { Inject } from '@nestjs/common';
import { type FromTo } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { LoggerService } from 'src/engine/core-modules/logger/logger.service';
import { ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant';
import {
FlatEntityMapsException,
FlatEntityMapsExceptionCode,
} from 'src/engine/core-modules/common/exceptions/flat-entity-maps.exception';
import { AllFlatEntitiesByMetadataEngineName } from 'src/engine/core-modules/common/types/all-flat-entities-by-metadata-engine-name.type';
import { type AllFlatEntities } from 'src/engine/core-modules/common/types/all-flat-entities.type';
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { LoggerService } from 'src/engine/core-modules/logger/logger.service';
import {
type DeletedCreatedUpdatedMatrix,
flatEntityDeletedCreatedUpdatedMatrixDispatcher,
} from 'src/engine/workspace-manager/workspace-migration-v2/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration-v2/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util';
import { getMetadataEmptyWorkspaceMigrationActionRecord } from 'src/engine/workspace-manager/workspace-migration-v2/utils/get-metadata-empty-workspace-migration-action-record.util';
import { FailedFlatEntityValidateAndBuild } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/failed-flat-entity-validate-and-build.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type';
import { SuccessfulFlatEntityValidateAndBuild } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/successful-flat-entity-validate-and-build.type';
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
// TODO extract types in dedicated files
export type CreatedDeletedUpdatedActions<
TActions extends WorkspaceMigrationActionV2,
> = {
created: TActions[];
deleted: TActions[];
updated: TActions[];
};
export type SuccessfulEntityMigrationBuildResult<
TActions extends WorkspaceMigrationActionV2,
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> = {
status: 'success';
actions: CreatedDeletedUpdatedActions<TActions>;
optimisticFlatEntityMaps: FlatEntityMaps<TFlatEntity>;
dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps;
};
export type FailedEntityMigrationBuildResult<
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> = {
status: 'fail';
errors: FailedFlatEntityValidation<TFlatEntity>[];
optimisticFlatEntityMaps: FlatEntityMaps<TFlatEntity>;
dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps;
};
export type ValidateAndBuildArgs<
T extends AllFlatEntities,
TRelatedFlatEntityMaps extends Partial<AllFlatEntityMaps> | undefined,
> = {
export type ValidateAndBuildArgs<T extends AllMetadataName> = {
buildOptions: WorkspaceMigrationBuilderOptions;
dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
workspaceId: string;
} & FromTo<FlatEntityMaps<T>>;
} & FromTo<MetadataFlatEntityMaps<T>>;
export type ValidateAndBuildReturnType<
TActions extends WorkspaceMigrationActionV2,
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> =
| SuccessfulEntityMigrationBuildResult<
TActions,
TFlatEntity,
TRelatedFlatEntityMaps
>
| FailedEntityMigrationBuildResult<TFlatEntity, TRelatedFlatEntityMaps>;
export type ValidateAndBuildReturnType<T extends AllMetadataName> =
| SuccessfulFlatEntityValidateAndBuild<T>
| FailedFlatEntityValidateAndBuild<T>;
export type ValidateAndBuildActionsArgs<
T extends AllFlatEntities,
TRelatedFlatEntityMaps extends Partial<AllFlatEntityMaps>,
> = ValidateAndBuildArgs<T, TRelatedFlatEntityMaps> &
DeletedCreatedUpdatedMatrix<T>;
export type ValidateAndBuilActionsReturnType<
TFlatEntity extends AllFlatEntities,
TActions extends WorkspaceMigrationActionV2,
> = {
failed: FailedFlatEntityValidation<TFlatEntity>[];
} & CreatedDeletedUpdatedActions<TActions>;
export type FlatEntityValidationArgs<
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> = {
flatEntityToValidate: TFlatEntity;
optimisticFlatEntityMaps: FlatEntityMaps<TFlatEntity>;
dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps;
workspaceId: string;
remainingFlatEntityMapsToValidate: FlatEntityMaps<TFlatEntity>;
buildOptions: WorkspaceMigrationBuilderOptions;
};
export type FlatEntityUpdateValidationArgs<
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> = Omit<
FlatEntityValidationArgs<TFlatEntity, TRelatedFlatEntityMaps>,
'flatEntityToValidate' | 'remainingFlatEntityMapsToValidate'
> & {
flatEntityUpdate: FromTo<TFlatEntity>;
remainingFlatEntityMapsToValidate: FromTo<FlatEntityMaps<TFlatEntity>>;
};
export type FlatEntityValidationReturnType<
TActions extends WorkspaceMigrationActionV2,
TFlatEntity extends AllFlatEntities,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
> =
| {
status: 'success';
action: TActions | TActions[];
dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps;
}
| ({
status: 'fail';
} & FailedFlatEntityValidation<TFlatEntity>);
// TODO prastoin refactor the builder to building a selection of flatEntityMaps => simplify
export abstract class WorkspaceEntityMigrationBuilderV2Service<
T extends keyof AllFlatEntitiesByMetadataEngineName, // TODO refactor the whole generic to be inferred from this one only
TFlatEntity extends AllFlatEntities,
TActions extends WorkspaceMigrationActionV2,
TRelatedFlatEntityMaps extends
| Partial<AllFlatEntityMaps>
| undefined = undefined,
T extends AllMetadataName,
> {
@Inject(LoggerService)
protected readonly logger: LoggerService;
@@ -159,9 +53,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
from: fromFlatEntityMaps,
to: toFlatEntityMaps,
workspaceId,
}: ValidateAndBuildArgs<TFlatEntity, TRelatedFlatEntityMaps>): Promise<
ValidateAndBuildReturnType<TActions, TFlatEntity, TRelatedFlatEntityMaps>
> {
}: ValidateAndBuildArgs<T>): Promise<ValidateAndBuildReturnType<T>> {
this.logger.time(`EntityBuilder ${this.metadataName}`, 'validateAndBuild');
this.logger.time(
`EntityBuilder ${this.metadataName}`,
@@ -179,10 +71,18 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
createdFlatEntityMaps,
deletedFlatEntityMaps,
updatedFlatEntityMaps,
} = flatEntityDeletedCreatedUpdatedMatrixDispatcher({
} = flatEntityDeletedCreatedUpdatedMatrixDispatcher<T>({
from: fromFlatEntities,
to: toFlatEntities,
buildOptions,
comparisonOptions: {
propertiesToCompare:
ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[this.metadataName]
.propertiesToCompare,
propertiesToStringify:
ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY[this.metadataName]
.propertiesToStringify,
},
});
this.logger.timeEnd(
@@ -192,16 +92,11 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
this.logger.time(`EntityBuilder ${this.metadataName}`, 'entity processing');
let optimisticFlatEntityMaps = structuredClone(fromFlatEntityMaps);
const validateAndBuildResult: ValidateAndBuilActionsReturnType<
TFlatEntity,
TActions
> = {
failed: [],
created: [],
deleted: [],
updated: [],
};
const actionsResult = getMetadataEmptyWorkspaceMigrationActionRecord(
this.metadataName,
);
const allValidationResult: FailedFlatEntityValidateAndBuild<T>['errors'] =
[];
let remainingFlatEntityMapsToCreate = structuredClone(
createdFlatEntityMaps,
);
@@ -237,7 +132,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
});
if (validationResult.status === 'fail') {
validateAndBuildResult.failed.push(validationResult);
allValidationResult.push(validationResult);
continue;
}
@@ -248,7 +143,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
dependencyOptimisticFlatEntityMaps =
validationResult.dependencyOptimisticFlatEntityMaps;
validateAndBuildResult.created.push(
actionsResult.created.push(
...(Array.isArray(validationResult.action)
? validationResult.action
: [validationResult.action]),
@@ -297,7 +192,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
});
if (validationResult.status === 'fail') {
validateAndBuildResult.failed.push(validationResult);
allValidationResult.push(validationResult);
continue;
}
@@ -308,7 +203,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
dependencyOptimisticFlatEntityMaps =
validationResult.dependencyOptimisticFlatEntityMaps;
validateAndBuildResult.deleted.push(
actionsResult.deleted.push(
...(Array.isArray(validationResult.action)
? validationResult.action
: [validationResult.action]),
@@ -321,66 +216,58 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
);
this.logger.time(`EntityBuilder ${this.metadataName}`, 'update validation');
let remainingFlatEntityMapsToUpdate = structuredClone(
updatedFlatEntityMaps,
);
for (const flatEntityToUpdateId in updatedFlatEntityMaps.byId) {
const flatEntityToUpdate =
updatedFlatEntityMaps.byId[flatEntityToUpdateId];
for (const flatEntityToUpdateId in updatedFlatEntityMaps.to.byId) {
const flatEntityToUpdateFrom =
updatedFlatEntityMaps.from.byId[flatEntityToUpdateId];
const flatEntityToUpdateTo =
updatedFlatEntityMaps.to.byId[flatEntityToUpdateId];
if (
!isDefined(flatEntityToUpdateTo) ||
!isDefined(flatEntityToUpdateFrom)
) {
if (!isDefined(flatEntityToUpdate)) {
throw new FlatEntityMapsException(
'Could not find flat entity to update in maps should never occur',
'Could not find flat entity updates in maps dispatcher should never occur',
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
remainingFlatEntityMapsToUpdate.from =
deleteFlatEntityFromFlatEntityMapsOrThrow({
entityToDeleteId: flatEntityToUpdateId,
flatEntityMaps: remainingFlatEntityMapsToUpdate.from,
});
remainingFlatEntityMapsToUpdate.to =
deleteFlatEntityFromFlatEntityMapsOrThrow({
entityToDeleteId: flatEntityToUpdateId,
flatEntityMaps: remainingFlatEntityMapsToUpdate.to,
});
const validationResult = await this.validateFlatEntityUpdate({
flatEntityUpdates: flatEntityToUpdate.updates,
flatEntityId: flatEntityToUpdateId,
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: {
from: flatEntityToUpdateFrom,
to: flatEntityToUpdateTo,
},
optimisticFlatEntityMaps: optimisticFlatEntityMaps,
workspaceId,
remainingFlatEntityMapsToValidate: remainingFlatEntityMapsToUpdate,
buildOptions,
});
if (validationResult === undefined) {
if (validationResult.status === 'fail') {
allValidationResult.push(validationResult);
continue;
}
if (validationResult.status === 'fail') {
validateAndBuildResult.failed.push(validationResult);
continue;
const existingFlatEntity = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatEntityToUpdateId,
flatEntityMaps: optimisticFlatEntityMaps,
});
if (!isDefined(existingFlatEntity)) {
throw new FlatEntityMapsException(
'Existing flat entity to update post successful validation is not defined, should never occur',
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const updatedFlatEntity = {
...existingFlatEntity,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityToUpdate.updates,
}),
};
optimisticFlatEntityMaps = replaceFlatEntityInFlatEntityMapsOrThrow({
flatEntity: flatEntityToUpdateTo,
flatEntity: updatedFlatEntity,
flatEntityMaps: optimisticFlatEntityMaps,
});
dependencyOptimisticFlatEntityMaps =
validationResult.dependencyOptimisticFlatEntityMaps;
validateAndBuildResult.updated.push(
actionsResult.updated.push(
...(Array.isArray(validationResult.action)
? validationResult.action
: [validationResult.action]),
@@ -396,10 +283,10 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
'entity processing',
);
if (validateAndBuildResult.failed.length > 0) {
if (allValidationResult.length > 0) {
return {
status: 'fail',
errors: validateAndBuildResult.failed,
errors: allValidationResult,
optimisticFlatEntityMaps,
dependencyOptimisticFlatEntityMaps,
};
@@ -412,44 +299,21 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
return {
status: 'success',
actions: {
created: validateAndBuildResult.created,
deleted: validateAndBuildResult.deleted,
updated: validateAndBuildResult.updated,
},
actions: actionsResult,
optimisticFlatEntityMaps,
dependencyOptimisticFlatEntityMaps,
};
}
protected abstract validateFlatEntityCreation(
args: FlatEntityValidationArgs<TFlatEntity, TRelatedFlatEntityMaps>,
): Promise<
FlatEntityValidationReturnType<
TActions,
TFlatEntity,
TRelatedFlatEntityMaps
>
>;
args: FlatEntityValidationArgs<T>,
): Promise<FlatEntityValidationReturnType<T, 'created'>>;
protected abstract validateFlatEntityDeletion(
args: FlatEntityValidationArgs<TFlatEntity, TRelatedFlatEntityMaps>,
): Promise<
FlatEntityValidationReturnType<
TActions,
TFlatEntity,
TRelatedFlatEntityMaps
>
>;
args: FlatEntityValidationArgs<T>,
): Promise<FlatEntityValidationReturnType<T, 'deleted'>>;
protected abstract validateFlatEntityUpdate(
args: FlatEntityUpdateValidationArgs<TFlatEntity, TRelatedFlatEntityMaps>,
): Promise<
| FlatEntityValidationReturnType<
TActions,
TFlatEntity,
TRelatedFlatEntityMaps
>
| undefined
>;
args: FlatEntityUpdateValidationArgs<T>,
): Promise<FlatEntityValidationReturnType<T, 'updated'>>;
}
@@ -0,0 +1,12 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
export type FailedFlatEntityValidateAndBuild<T extends AllMetadataName> = {
status: 'fail';
errors: FailedFlatEntityValidation<MetadataFlatEntity<T>>[];
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
};
@@ -0,0 +1,11 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type';
import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
export type FlatEntityUpdateValidationArgs<T extends AllMetadataName> = Omit<
FlatEntityValidationArgs<T>,
'flatEntityToValidate' | 'remainingFlatEntityMapsToValidate'
> & {
flatEntityId: string;
flatEntityUpdates: FlatEntityPropertiesUpdates<T>;
};
@@ -0,0 +1,14 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
export type FlatEntityValidationArgs<T extends AllMetadataName> = {
flatEntityToValidate: MetadataFlatEntity<T>;
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
workspaceId: string;
remainingFlatEntityMapsToValidate: MetadataFlatEntityMaps<T>;
buildOptions: WorkspaceMigrationBuilderOptions;
};
@@ -0,0 +1,20 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type MetadataWorkspaceMigrationAction } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
export type FlatEntityValidationReturnType<
T extends AllMetadataName,
TOperation extends 'created' | 'deleted' | 'updated',
> =
| {
status: 'success';
action:
| MetadataWorkspaceMigrationAction<T, TOperation>
| MetadataWorkspaceMigrationAction<T, TOperation>[];
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
}
| ({
status: 'fail';
} & FailedFlatEntityValidation<MetadataFlatEntity<T>>);
@@ -0,0 +1,11 @@
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
export type SuccessfulFlatEntityValidateAndBuild<T extends AllMetadataName> = {
status: 'success';
actions: MetadataWorkspaceMigrationActionsRecord<T>;
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
};
@@ -1,3 +0,0 @@
export type ToMerge<T, K extends string> = {
[P in 'toMerge' | 'dest' as `${P}${Capitalize<K>}`]: T;
};
@@ -1,25 +1,9 @@
import { type WorkspaceMigrationCronTriggerActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-cron-trigger-action-v2.type';
import { type WorkspaceMigrationDatabaseEventTriggerActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-database-event-trigger-action-v2.type';
import { type WorkspaceMigrationFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationIndexActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { type WorkspaceMigrationObjectActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationRouteTriggerActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { type WorkspaceMigrationServerlessFunctionActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { type WorkspaceMigrationViewActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { type WorkspaceMigrationViewFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import { type WorkspaceMigrationViewFilterActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-filter-action-v2.type';
import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { type MetadataWorkspaceMigrationAction } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
export type WorkspaceMigrationActionV2 =
| WorkspaceMigrationObjectActionV2
| WorkspaceMigrationFieldActionV2
| WorkspaceMigrationIndexActionV2
| WorkspaceMigrationViewActionV2
| WorkspaceMigrationViewFieldActionV2
| WorkspaceMigrationViewFilterActionV2
| WorkspaceMigrationServerlessFunctionActionV2
| WorkspaceMigrationDatabaseEventTriggerActionV2
| WorkspaceMigrationCronTriggerActionV2
| WorkspaceMigrationRouteTriggerActionV2;
MetadataWorkspaceMigrationAction<AllMetadataName>;
export type WorkspaceMigrationActionTypeV2 = WorkspaceMigrationActionV2['type'];
export type ExtractAction<T extends WorkspaceMigrationActionTypeV2> = Extract<
@@ -1,13 +1,9 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
export type WorkspaceMigrationV2<
TActions extends WorkspaceMigrationActionV2 = WorkspaceMigrationActionV2,
> = {
// formatVersion: 1;
// createdAt: string;
// name: string;
// description?: string;
actions: TActions[];
workspaceId: string;
relatedFlatEntityMapsKeys?: (keyof AllFlatEntityMaps)[];
@@ -1,105 +1,121 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { CronTriggerExceptionCode } from 'src/engine/metadata-modules/cron-trigger/exceptions/cron-trigger.exception';
import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type';
import { CronTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/cron-trigger-related-flat-entity-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
type CronTriggerValidationArgs = {
flatCronTriggerToValidate: FlatCronTrigger;
optimisticFlatCronTriggerMaps: FlatEntityMaps<FlatCronTrigger>;
dependencyOptimisticFlatEntityMaps: CronTriggerRelatedFlatEntityMaps;
};
// TODO: validate settings integrity
@Injectable()
export class FlatCronTriggerValidatorService {
constructor() {}
public validateFlatCronTriggerUpdate({
flatCronTriggerToValidate: updatedFlatCronTrigger,
optimisticFlatCronTriggerMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: CronTriggerValidationArgs): FailedFlatEntityValidation<FlatCronTrigger> {
const errors = [];
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.cronTrigger
>): FailedFlatEntityValidation<FlatCronTrigger> {
const validationResult: FailedFlatEntityValidation<FlatCronTrigger> = {
type: 'update_cron_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatEntityId,
},
};
const existingFlatCronTrigger =
optimisticFlatCronTriggerMaps.byId[updatedFlatCronTrigger.id];
optimisticFlatCronTriggerMaps.byId[flatEntityId];
if (!isDefined(existingFlatCronTrigger)) {
errors.push({
validationResult.errors.push({
code: CronTriggerExceptionCode.CRON_TRIGGER_NOT_FOUND,
message: t`Cron trigger not found`,
userFriendlyMessage: msg`Cron trigger not found`,
});
return validationResult;
}
const updatedFlatCronTrigger = {
...existingFlatCronTrigger,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
updatedFlatCronTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: CronTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'update_cron_trigger',
errors,
flatEntityMinimalInformation: {
id: updatedFlatCronTrigger.id,
},
};
return validationResult;
}
public validateFlatCronTriggerDeletion({
flatCronTriggerToValidate: { id: cronTriggerIdToDelete },
optimisticFlatCronTriggerMaps,
}: CronTriggerValidationArgs): FailedFlatEntityValidation<FlatCronTrigger> {
const errors = [];
flatEntityToValidate: { id: cronTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.cronTrigger
>): FailedFlatEntityValidation<FlatCronTrigger> {
const validationResult: FailedFlatEntityValidation<FlatCronTrigger> = {
type: 'delete_cron_trigger',
errors: [],
flatEntityMinimalInformation: {
id: cronTriggerIdToDelete,
},
};
const existingFlatCronTrigger =
optimisticFlatCronTriggerMaps.byId[cronTriggerIdToDelete];
if (!isDefined(existingFlatCronTrigger)) {
errors.push({
validationResult.errors.push({
code: CronTriggerExceptionCode.CRON_TRIGGER_NOT_FOUND,
message: t`Cron trigger not found`,
userFriendlyMessage: msg`Cron trigger not found`,
});
}
return {
type: 'delete_cron_trigger',
errors,
flatEntityMinimalInformation: {
id: cronTriggerIdToDelete,
},
};
return validationResult;
}
public async validateFlatCronTriggerCreation({
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: CronTriggerValidationArgs): Promise<
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.cronTrigger>): Promise<
FailedFlatEntityValidation<FlatCronTrigger>
> {
const errors = [];
const validationResult: FailedFlatEntityValidation<FlatCronTrigger> = {
type: 'create_cron_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatCronTriggerToValidate.id,
},
};
if (
isDefined(
optimisticFlatCronTriggerMaps.byId[flatCronTriggerToValidate.id],
)
) {
errors.push({
validationResult.errors.push({
code: CronTriggerExceptionCode.CRON_TRIGGER_ALREADY_EXIST,
message: t`Cron trigger with same id already exists`,
userFriendlyMessage: msg`Cron trigger already exists`,
@@ -112,19 +128,13 @@ export class FlatCronTriggerValidatorService {
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: CronTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'create_cron_trigger',
errors,
flatEntityMinimalInformation: {
id: flatCronTriggerToValidate.id,
},
};
return validationResult;
}
}
@@ -1,71 +1,88 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { DatabaseEventTriggerExceptionCode } from 'src/engine/metadata-modules/database-event-trigger/exceptions/database-event-trigger.exception';
import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type';
import { DatabaseEventTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/database-event-trigger-related-flat-entity-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
type DatabaseEventTriggerValidationArgs = {
flatDatabaseEventTriggerToValidate: FlatDatabaseEventTrigger;
optimisticFlatDatabaseEventTriggerMaps: FlatEntityMaps<FlatDatabaseEventTrigger>;
dependencyOptimisticFlatEntityMaps: DatabaseEventTriggerRelatedFlatEntityMaps;
};
// TODO: validate settings integrity
@Injectable()
export class FlatDatabaseEventTriggerValidatorService {
constructor() {}
public validateFlatDatabaseEventTriggerUpdate({
flatDatabaseEventTriggerToValidate: updatedFlatDatabaseEventTrigger,
optimisticFlatDatabaseEventTriggerMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: DatabaseEventTriggerValidationArgs): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
const errors = [];
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
const validationResult: FailedFlatEntityValidation<FlatDatabaseEventTrigger> =
{
type: 'update_database_event_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatEntityId,
},
};
const existingFlatDatabaseEventTrigger =
optimisticFlatDatabaseEventTriggerMaps.byId[
updatedFlatDatabaseEventTrigger.id
];
optimisticFlatDatabaseEventTriggerMaps.byId[flatEntityId];
if (!isDefined(existingFlatDatabaseEventTrigger)) {
errors.push({
validationResult.errors.push({
code: DatabaseEventTriggerExceptionCode.DATABASE_EVENT_TRIGGER_NOT_FOUND,
message: t`Database event trigger not found`,
userFriendlyMessage: msg`Database event trigger not found`,
});
return validationResult;
}
const updatedFlatDatabaseEventTrigger = {
...existingFlatDatabaseEventTrigger,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
updatedFlatDatabaseEventTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: DatabaseEventTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'update_database_event_trigger',
errors,
flatEntityMinimalInformation: {
id: updatedFlatDatabaseEventTrigger.id,
},
};
return validationResult;
}
public validateFlatDatabaseEventTriggerDeletion({
flatDatabaseEventTriggerToValidate: { id: databaseEventTriggerIdToDelete },
optimisticFlatDatabaseEventTriggerMaps,
}: DatabaseEventTriggerValidationArgs): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
const errors = [];
flatEntityToValidate: { id: databaseEventTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
const validationResult: FailedFlatEntityValidation<FlatDatabaseEventTrigger> =
{
type: 'delete_database_event_trigger',
errors: [],
flatEntityMinimalInformation: {
id: databaseEventTriggerIdToDelete,
},
};
const existingFlatDatabaseEventTrigger =
optimisticFlatDatabaseEventTriggerMaps.byId[
@@ -73,30 +90,31 @@ export class FlatDatabaseEventTriggerValidatorService {
];
if (!isDefined(existingFlatDatabaseEventTrigger)) {
errors.push({
validationResult.errors.push({
code: DatabaseEventTriggerExceptionCode.DATABASE_EVENT_TRIGGER_NOT_FOUND,
message: t`Database event trigger not found`,
userFriendlyMessage: msg`Database event trigger not found`,
});
}
return {
type: 'delete_database_event_trigger',
errors,
flatEntityMinimalInformation: {
id: databaseEventTriggerIdToDelete,
},
};
return validationResult;
}
public async validateFlatDatabaseEventTriggerCreation({
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: DatabaseEventTriggerValidationArgs): Promise<
FailedFlatEntityValidation<FlatDatabaseEventTrigger>
> {
const errors = [];
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): Promise<FailedFlatEntityValidation<FlatDatabaseEventTrigger>> {
const validationResult: FailedFlatEntityValidation<FlatDatabaseEventTrigger> =
{
type: 'create_database_event_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatDatabaseEventTriggerToValidate.id,
},
};
if (
isDefined(
@@ -105,7 +123,7 @@ export class FlatDatabaseEventTriggerValidatorService {
],
)
) {
errors.push({
validationResult.errors.push({
code: DatabaseEventTriggerExceptionCode.DATABASE_EVENT_TRIGGER_ALREADY_EXIST,
message: t`Database event trigger with same id already exists`,
userFriendlyMessage: msg`Database event trigger already exists`,
@@ -118,19 +136,13 @@ export class FlatDatabaseEventTriggerValidatorService {
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: DatabaseEventTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'create_database_event_trigger',
errors,
flatEntityMinimalInformation: {
id: flatDatabaseEventTriggerToValidate.id,
},
};
return validationResult;
}
}
@@ -1,36 +1,24 @@
import { Injectable } from '@nestjs/common';
import { msg } from '@lingui/core/macro';
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant';
import { FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant';
import { FlatFieldMetadataTypeValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service';
import { FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-relation-properties-to-compare.type';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
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 { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-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 { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
export type ValidateOneFieldMetadataArgs<
T extends FieldMetadataType = FieldMetadataType,
> = {
dependencyOptimisticFlatEntityMaps: Pick<
AllFlatEntityMaps,
'flatObjectMetadataMaps'
>;
remainingFlatEntityMapsToValidate?: FlatEntityMaps<FlatFieldMetadata>;
flatFieldMetadataToValidate: FlatFieldMetadata<T>;
optimisticFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
workspaceId: string;
};
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class FlatFieldMetadataValidatorService {
@@ -38,25 +26,52 @@ export class FlatFieldMetadataValidatorService {
private readonly flatFieldMetadataTypeValidatorService: FlatFieldMetadataTypeValidatorService,
) {}
async validateFlatFieldMetadataUpdate<T extends FieldMetadataType>({
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
flatFieldMetadataToValidate,
optimisticFlatFieldMetadataMaps,
async validateFlatFieldMetadataUpdate({
flatEntityId,
flatEntityUpdates: updates,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
dependencyOptimisticFlatEntityMaps,
workspaceId,
}: ValidateOneFieldMetadataArgs<T>): Promise<
FailedFlatEntityValidation<FlatFieldMetadata>
> {
buildOptions,
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.fieldMetadata
>): Promise<FailedFlatEntityValidation<FlatFieldMetadata>> {
const validationResult: FailedFlatEntityValidation<FlatFieldMetadata> = {
type: 'update_field',
errors: [],
flatEntityMinimalInformation: {
id: flatFieldMetadataToValidate.id,
name: flatFieldMetadataToValidate.name,
objectMetadataId: flatFieldMetadataToValidate.objectMetadataId,
id: flatEntityId,
},
};
const existingFlatFieldMetadataToUpdate =
optimisticFlatFieldMetadataMaps.byId[flatEntityId];
if (!isDefined(existingFlatFieldMetadataToUpdate)) {
validationResult.errors.push({
code: FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND,
message: 'field metadata to update not found',
userFriendlyMessage: msg`Field to update not found`,
});
return validationResult;
}
const flatFieldMetadataToValidate = {
...existingFlatFieldMetadataToUpdate,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({ updates }),
};
validationResult.flatEntityMinimalInformation = {
id: flatFieldMetadataToValidate.id,
name: flatFieldMetadataToValidate.name,
objectMetadataId: flatFieldMetadataToValidate.objectMetadataId,
};
const flatObjectMetadata =
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToValidate.objectMetadataId
];
if (!isDefined(flatObjectMetadata)) {
validationResult.errors.push({
@@ -76,24 +91,6 @@ export class FlatFieldMetadataValidatorService {
});
}
const existingFlatFieldMetadataToUpdate =
optimisticFlatFieldMetadataMaps.byId[flatFieldMetadataToValidate.id];
if (!isDefined(existingFlatFieldMetadataToUpdate)) {
validationResult.errors.push({
code: FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND,
message: 'field metadata to update not found',
userFriendlyMessage: msg`Field to update not found`,
});
return validationResult;
}
const updates = compareTwoFlatFieldMetadata({
fromFlatFieldMetadata: existingFlatFieldMetadataToUpdate,
toFlatFieldMetadata: flatFieldMetadataToValidate,
});
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToValidate)) {
const relationNonEditableUpdatedProperties = updates.flatMap(
({ property }) =>
@@ -138,9 +135,14 @@ export class FlatFieldMetadataValidatorService {
const fieldMetadataTypeValidationErrors =
await this.flatFieldMetadataTypeValidatorService.validateFlatFieldMetadataTypeSpecificities(
{
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
optimisticFlatFieldMetadataMaps,
flatFieldMetadataToValidate,
dependencyOptimisticFlatEntityMaps: {
flatObjectMetadataMaps:
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
},
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
flatEntityToValidate: flatFieldMetadataToValidate,
buildOptions,
remainingFlatEntityMapsToValidate: EMPTY_FLAT_ENTITY_MAPS,
workspaceId,
},
);
@@ -153,10 +155,12 @@ export class FlatFieldMetadataValidatorService {
}
validateFlatFieldMetadataDeletion({
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
flatFieldMetadataToValidate: { id: flatFieldMetadataToDeleteId },
optimisticFlatFieldMetadataMaps,
}: ValidateOneFieldMetadataArgs): FailedFlatEntityValidation<FlatFieldMetadata> {
flatEntityToValidate: { id: flatFieldMetadataToDeleteId },
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.fieldMetadata
>): FailedFlatEntityValidation<FlatFieldMetadata> {
const validationResult: FailedFlatEntityValidation<FlatFieldMetadata> = {
type: 'delete_field',
errors: [],
@@ -184,7 +188,9 @@ export class FlatFieldMetadataValidatorService {
};
const relatedFlatObjectMetadata =
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId];
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.objectMetadataId
];
if (
isDefined(relatedFlatObjectMetadata) &&
@@ -202,12 +208,14 @@ export class FlatFieldMetadataValidatorService {
const relationTargetObjectMetadataHasBeenDeleted =
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
!isDefined(
flatObjectMetadataMaps.byId[
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.relationTargetObjectMetadataId
],
);
const parentObjectMetadataHasBeenDeleted = !isDefined(
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId],
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.objectMetadataId
],
);
if (
@@ -237,15 +245,14 @@ export class FlatFieldMetadataValidatorService {
return validationResult;
}
async validateFlatFieldMetadataCreation<
T extends FieldMetadataType = FieldMetadataType,
>({
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
flatFieldMetadataToValidate,
optimisticFlatFieldMetadataMaps,
async validateFlatFieldMetadataCreation({
flatEntityToValidate: flatFieldMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
dependencyOptimisticFlatEntityMaps,
workspaceId,
buildOptions,
remainingFlatEntityMapsToValidate,
}: ValidateOneFieldMetadataArgs<T>): Promise<
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.fieldMetadata>): Promise<
FailedFlatEntityValidation<FlatFieldMetadata>
> {
const validationResult: FailedFlatEntityValidation<FlatFieldMetadata> = {
@@ -259,7 +266,9 @@ export class FlatFieldMetadataValidatorService {
};
const parentFlatObjectMetadata =
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToValidate.objectMetadataId
];
if (!isDefined(parentFlatObjectMetadata)) {
validationResult.errors.push({
@@ -317,9 +326,10 @@ export class FlatFieldMetadataValidatorService {
validationResult.errors.push(
...(await this.flatFieldMetadataTypeValidatorService.validateFlatFieldMetadataTypeSpecificities(
{
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
flatFieldMetadataToValidate,
optimisticFlatFieldMetadataMaps,
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatFieldMetadataToValidate,
buildOptions,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
workspaceId,
remainingFlatEntityMapsToValidate,
},
@@ -1,27 +1,24 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMapsExceptionCode } from 'src/engine/core-modules/common/exceptions/flat-entity-maps.exception';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { FlatEntityMapsExceptionCode } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { IndexExceptionCode } from 'src/engine/metadata-modules/flat-index-metadata/exceptions/index-exception-code';
import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
import { IndexRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder.service';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
type IndexValidationArgs = {
flatIndexToValidate: FlatIndexMetadata;
optimisticFlatIndexMaps: FlatEntityMaps<FlatIndexMetadata>;
dependencyOptimisticFlatEntityMaps: IndexRelatedFlatEntityMaps;
};
@Injectable()
export class FlatIndexValidatorService {
public validateFlatIndexDeletion({
optimisticFlatIndexMaps,
flatIndexToValidate: { id: indexIdToDelete },
}: IndexValidationArgs): FailedFlatEntityValidation<FlatIndexMetadata> {
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
flatEntityToValidate: { id: indexIdToDelete },
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.index
>): FailedFlatEntityValidation<FlatIndexMetadata> {
const validationResult: FailedFlatEntityValidation<FlatIndexMetadata> = {
type: 'delete_index',
errors: [],
@@ -46,17 +43,12 @@ export class FlatIndexValidatorService {
}
public validateFlatIndexCreation({
flatIndexToValidate,
optimisticFlatIndexMaps,
dependencyOptimisticFlatEntityMaps: {
flatFieldMetadataMaps,
flatObjectMetadataMaps,
},
}: {
flatIndexToValidate: FlatIndexMetadata;
optimisticFlatIndexMaps: FlatEntityMaps<FlatIndexMetadata>;
dependencyOptimisticFlatEntityMaps: IndexRelatedFlatEntityMaps;
}): FailedFlatEntityValidation<FlatIndexMetadata> {
flatEntityToValidate: flatIndexToValidate,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.index
>): FailedFlatEntityValidation<FlatIndexMetadata> {
const validationResult: FailedFlatEntityValidation<FlatIndexMetadata> = {
type: 'create_index',
errors: [],
@@ -81,7 +73,7 @@ export class FlatIndexValidatorService {
const relatedObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
if (!isDefined(relatedObjectMetadata)) {
@@ -120,7 +112,8 @@ export class FlatIndexValidatorService {
flatIndexToValidate.flatIndexFieldMetadatas.forEach((flatIndexField) => {
const relatedFlatField = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexField.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
flatEntityMaps:
dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
if (!isDefined(relatedFlatField)) {
@@ -1,46 +1,39 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util';
import { validateFlatObjectMetadataNameAndLabels } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util';
import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
import { ObjectMetadataRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/workspace-migration-v2-object-actions-builder.service';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
import { FlatObjectPropertiesUpdates } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
export type ValidateOneObjectMetadataArgs = {
flatObjectMetadataToValidate: FlatObjectMetadata;
optimisticFlatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
buildOptions: WorkspaceMigrationBuilderOptions;
dependencyOptimisticFlatEntityMaps: ObjectMetadataRelatedFlatEntityMaps;
};
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class FlatObjectMetadataValidatorService {
public validateFlatObjectMetadataUpdate({
optimisticFlatObjectMetadataMaps,
flatObjectMetadataToValidate: updatedFlatObjectMetadata,
dependencyOptimisticFlatEntityMaps: { flatFieldMetadataMaps },
flatObjectPropertiesUpdates,
}: ValidateOneObjectMetadataArgs & {
flatObjectPropertiesUpdates: FlatObjectPropertiesUpdates;
}): FailedFlatEntityValidation<FlatObjectMetadata> {
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>): FailedFlatEntityValidation<FlatObjectMetadata> {
const validationResult: FailedFlatEntityValidation<FlatObjectMetadata> = {
type: 'update_object',
errors: [],
flatEntityMinimalInformation: {
id: updatedFlatObjectMetadata.id,
id: flatEntityId,
},
};
const existingFlatObjectMetadata =
optimisticFlatObjectMetadataMaps.byId[updatedFlatObjectMetadata.id];
optimisticFlatObjectMetadataMaps.byId[flatEntityId];
if (!isDefined(existingFlatObjectMetadata)) {
validationResult.errors.push({
@@ -51,6 +44,14 @@ export class FlatObjectMetadataValidatorService {
return validationResult;
}
const updatedFlatObjectMetadata = {
...existingFlatObjectMetadata,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
validationResult.flatEntityMinimalInformation = {
id: existingFlatObjectMetadata.id,
namePlural: existingFlatObjectMetadata.namePlural,
@@ -64,10 +65,9 @@ export class FlatObjectMetadataValidatorService {
}),
);
const labelIdentifierFieldMetadataIdUpdate =
flatObjectPropertiesUpdates.find(
(update) => update.property === 'labelIdentifierFieldMetadataId',
);
const labelIdentifierFieldMetadataIdUpdate = flatEntityUpdates.find(
(update) => update.property === 'labelIdentifierFieldMetadataId',
);
// TODO remove this once we migrated labelIdentifierFieldMetadataId as non nullable
if (isDefined(labelIdentifierFieldMetadataIdUpdate)) {
@@ -82,7 +82,8 @@ export class FlatObjectMetadataValidatorService {
validationResult.errors.push(
...validateFlatObjectMetadataIdentifiers({
flatObjectMetadata: updatedFlatObjectMetadata,
flatFieldMetadataMaps,
flatFieldMetadataMaps:
dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
}),
);
}
@@ -91,10 +92,12 @@ export class FlatObjectMetadataValidatorService {
}
public validateFlatObjectMetadataDeletion({
flatObjectMetadataToValidate: { id: objectMetadataToDeleteId },
optimisticFlatObjectMetadataMaps,
flatEntityToValidate: { id: objectMetadataToDeleteId },
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
buildOptions,
}: ValidateOneObjectMetadataArgs): FailedFlatEntityValidation<FlatObjectMetadata> {
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>): FailedFlatEntityValidation<FlatObjectMetadata> {
const validationResult: FailedFlatEntityValidation<FlatObjectMetadata> = {
type: 'delete_object',
errors: [],
@@ -151,12 +154,12 @@ export class FlatObjectMetadataValidatorService {
}
public async validateFlatObjectMetadataCreation({
optimisticFlatObjectMetadataMaps,
flatObjectMetadataToValidate,
dependencyOptimisticFlatEntityMaps: { flatFieldMetadataMaps },
}: ValidateOneObjectMetadataArgs): Promise<
FailedFlatEntityValidation<FlatObjectMetadata>
> {
flatEntityToValidate: flatObjectMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>): Promise<FailedFlatEntityValidation<FlatObjectMetadata>> {
const objectValidationResult: FailedFlatEntityValidation<FlatObjectMetadata> =
{
type: 'create_object',
@@ -191,7 +194,8 @@ export class FlatObjectMetadataValidatorService {
objectValidationResult.errors.push(
...validateFlatObjectMetadataIdentifiers({
flatObjectMetadata: flatObjectMetadataToValidate,
flatFieldMetadataMaps,
flatFieldMetadataMaps:
dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
}),
);
objectValidationResult.errors.push(
@@ -1,105 +1,121 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { RouteTriggerExceptionCode } from 'src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception';
import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { RouteTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/route-trigger-related-flat-entity-maps.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
type RouteTriggerValidationArgs = {
flatRouteTriggerToValidate: FlatRouteTrigger;
optimisticFlatRouteTriggerMaps: FlatEntityMaps<FlatRouteTrigger>;
dependencyOptimisticFlatEntityMaps: RouteTriggerRelatedFlatEntityMaps;
};
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class FlatRouteTriggerValidatorService {
constructor() {}
public validateFlatRouteTriggerUpdate({
flatRouteTriggerToValidate: updatedFlatRouteTrigger,
optimisticFlatRouteTriggerMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: RouteTriggerValidationArgs): FailedFlatEntityValidation<FlatRouteTrigger> {
const errors = [];
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.routeTrigger
>): FailedFlatEntityValidation<FlatRouteTrigger> {
const validationResult: FailedFlatEntityValidation<FlatRouteTrigger> = {
type: 'update_route_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatEntityId,
},
};
const existingFlatRouteTrigger =
optimisticFlatRouteTriggerMaps.byId[updatedFlatRouteTrigger.id];
optimisticFlatRouteTriggerMaps.byId[flatEntityId];
if (!isDefined(existingFlatRouteTrigger)) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.ROUTE_NOT_FOUND,
message: t`Route not found`,
userFriendlyMessage: msg`Route not found`,
});
return validationResult;
}
const updatedFlatRouteTrigger = {
...existingFlatRouteTrigger,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
updatedFlatRouteTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'update_route_trigger',
errors,
flatEntityMinimalInformation: {
id: updatedFlatRouteTrigger.id,
},
};
return validationResult;
}
public validateFlatRouteTriggerDeletion({
flatRouteTriggerToValidate: { id: routeTriggerIdToDelete },
optimisticFlatRouteTriggerMaps,
}: RouteTriggerValidationArgs): FailedFlatEntityValidation<FlatRouteTrigger> {
const errors = [];
flatEntityToValidate: { id: routeTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.routeTrigger
>): FailedFlatEntityValidation<FlatRouteTrigger> {
const validationResult: FailedFlatEntityValidation<FlatRouteTrigger> = {
type: 'delete_route_trigger',
errors: [],
flatEntityMinimalInformation: {
id: routeTriggerIdToDelete,
},
};
const existingFlatRouteTrigger =
optimisticFlatRouteTriggerMaps.byId[routeTriggerIdToDelete];
if (!isDefined(existingFlatRouteTrigger)) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.ROUTE_NOT_FOUND,
message: t`Route not found`,
userFriendlyMessage: msg`Route not found`,
});
}
return {
type: 'delete_route_trigger',
errors,
flatEntityMinimalInformation: {
id: routeTriggerIdToDelete,
},
};
return validationResult;
}
public async validateFlatRouteTriggerCreation({
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: RouteTriggerValidationArgs): Promise<
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.routeTrigger>): Promise<
FailedFlatEntityValidation<FlatRouteTrigger>
> {
const errors = [];
const validationResult: FailedFlatEntityValidation<FlatRouteTrigger> = {
type: 'create_route_trigger',
errors: [],
flatEntityMinimalInformation: {
id: flatRouteTriggerToValidate.id,
},
};
if (
isDefined(
optimisticFlatRouteTriggerMaps.byId[flatRouteTriggerToValidate.id],
)
) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.ROUTE_ALREADY_EXIST,
message: t`Route with same id already exists`,
userFriendlyMessage: msg`Route already exists`,
@@ -116,7 +132,7 @@ export class FlatRouteTriggerValidatorService {
flatRouteTrigger.path === flatRouteTriggerToValidate.path,
)
) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.ROUTE_PATH_ALREADY_EXIST,
message: t`Route with same path already exists`,
userFriendlyMessage: msg`Route path already exists`,
@@ -129,19 +145,13 @@ export class FlatRouteTriggerValidatorService {
];
if (!isDefined(serverlessFunction)) {
errors.push({
validationResult.errors.push({
code: RouteTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'create_route_trigger',
errors,
flatEntityMinimalInformation: {
id: flatRouteTriggerToValidate.id,
},
};
return validationResult;
}
}
@@ -1,82 +1,91 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { ServerlessFunctionExceptionCode } from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
type ServerlessFunctionValidationArgs = {
flatServerlessFunctionToValidate: FlatServerlessFunction;
optimisticFlatServerlessFunctionMaps: FlatEntityMaps<FlatServerlessFunction>;
};
@Injectable()
export class FlatServerlessFunctionValidatorService {
constructor() {}
public validateFlatServerlessFunctionUpdate({
flatServerlessFunctionToValidate: updatedFlatServerlessFunction,
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): FailedFlatEntityValidation<FlatServerlessFunction> {
const errors = [];
flatEntityId,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): FailedFlatEntityValidation<FlatServerlessFunction> {
const validationResult: FailedFlatEntityValidation<FlatServerlessFunction> =
{
type: 'update_serverless_function',
errors: [],
flatEntityMinimalInformation: {
id: flatEntityId,
},
};
const existingFlatServerlessFunction =
optimisticFlatServerlessFunctionMaps.byId[
updatedFlatServerlessFunction.id
];
optimisticFlatServerlessFunctionMaps.byId[flatEntityId];
if (!isDefined(existingFlatServerlessFunction)) {
errors.push({
validationResult.errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'update_serverless_function',
errors,
flatEntityMinimalInformation: {
id: updatedFlatServerlessFunction.id,
},
};
return validationResult;
}
public validateFlatServerlessFunctionDeletion({
flatServerlessFunctionToValidate: { id: serverlessFunctionIdToDelete },
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): FailedFlatEntityValidation<FlatServerlessFunction> {
const errors = [];
flatEntityToValidate: { id: serverlessFunctionIdToDelete },
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): FailedFlatEntityValidation<FlatServerlessFunction> {
const validationResult: FailedFlatEntityValidation<FlatServerlessFunction> =
{
type: 'delete_serverless_function',
errors: [],
flatEntityMinimalInformation: {
id: serverlessFunctionIdToDelete,
},
};
const existingFlatServerlessFunction =
optimisticFlatServerlessFunctionMaps.byId[serverlessFunctionIdToDelete];
if (!isDefined(existingFlatServerlessFunction)) {
errors.push({
validationResult.errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: msg`Serverless function not found`,
});
}
return {
type: 'delete_serverless_function',
errors,
flatEntityMinimalInformation: {
id: serverlessFunctionIdToDelete,
},
};
return validationResult;
}
public async validateFlatServerlessFunctionCreation({
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): Promise<
FailedFlatEntityValidation<FlatServerlessFunction>
> {
const errors = [];
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): Promise<FailedFlatEntityValidation<FlatServerlessFunction>> {
const validationResult: FailedFlatEntityValidation<FlatServerlessFunction> =
{
type: 'create_serverless_function',
errors: [],
flatEntityMinimalInformation: {
id: flatServerlessFunctionToValidate.id,
},
};
if (
isDefined(
@@ -85,19 +94,13 @@ export class FlatServerlessFunctionValidatorService {
],
)
) {
errors.push({
validationResult.errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_ALREADY_EXIST,
message: t`Serverless function with same id already exists`,
userFriendlyMessage: msg`Serverless function already exists`,
});
}
return {
type: 'create_serverless_function',
errors,
flatEntityMinimalInformation: {
id: flatServerlessFunctionToValidate.id,
},
};
return validationResult;
}
}
@@ -1,45 +1,42 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { isViewFieldInLowestPosition } from 'src/engine/metadata-modules/flat-view-field/utils/is-view-field-in-lowest-position.util';
import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/view-field-related-flat-entity-maps.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { validateLabelIdentifierFieldMetadataIdFlatViewField } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/utils/validate-label-identifier-field-metadata-id-flat-view-field.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
type ViewFieldValidationArgs = {
flatViewFieldToValidate: FlatViewField;
optimisticFlatViewFieldMaps: FlatViewFieldMaps;
dependencyOptimisticFlatEntityMaps: ViewFieldRelatedFlatEntityMaps;
};
@Injectable()
export class FlatViewFieldValidatorService {
constructor() {}
public validateFlatViewFieldUpdate({
flatViewFieldToValidate: updatedFlatViewField,
optimisticFlatViewFieldMaps,
dependencyOptimisticFlatEntityMaps: {
flatViewMaps,
flatObjectMetadataMaps,
},
}: ViewFieldValidationArgs): FailedFlatEntityValidation<FlatViewField> {
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.viewField
>): FailedFlatEntityValidation<FlatViewField> {
const validationResult: FailedFlatEntityValidation<FlatViewField> = {
type: 'update_view_field',
errors: [],
flatEntityMinimalInformation: {
id: updatedFlatViewField.id,
id: flatEntityId,
},
};
const existingFlatViewField =
optimisticFlatViewFieldMaps.byId[updatedFlatViewField.id];
optimisticFlatViewFieldMaps.byId[flatEntityId];
if (!isDefined(existingFlatViewField)) {
validationResult.errors.push({
@@ -51,6 +48,13 @@ export class FlatViewFieldValidatorService {
return validationResult;
}
const updatedFlatViewField = {
...existingFlatViewField,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
validationResult.flatEntityMinimalInformation = {
id: updatedFlatViewField.id,
viewId: updatedFlatViewField.viewId,
@@ -59,7 +63,7 @@ export class FlatViewFieldValidatorService {
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: updatedFlatViewField.viewId,
flatEntityMaps: flatViewMaps,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps,
});
if (!isDefined(flatView)) {
@@ -74,7 +78,7 @@ export class FlatViewFieldValidatorService {
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatView.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
@@ -112,9 +116,11 @@ export class FlatViewFieldValidatorService {
}
public validateFlatViewFieldDeletion({
optimisticFlatViewFieldMaps,
flatViewFieldToValidate: { id: viewFieldIdToDelete },
}: ViewFieldValidationArgs): FailedFlatEntityValidation<FlatViewField> {
flatEntityToValidate: { id: viewFieldIdToDelete },
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewField
>): FailedFlatEntityValidation<FlatViewField> {
const validationResult: FailedFlatEntityValidation<FlatViewField> = {
type: 'delete_view_field',
errors: [],
@@ -146,18 +152,12 @@ export class FlatViewFieldValidatorService {
}
public validateFlatViewFieldCreation({
flatViewFieldToValidate,
optimisticFlatViewFieldMaps,
dependencyOptimisticFlatEntityMaps: {
flatViewMaps,
flatFieldMetadataMaps,
flatObjectMetadataMaps,
},
}: {
flatViewFieldToValidate: FlatViewField;
optimisticFlatViewFieldMaps: FlatViewFieldMaps;
dependencyOptimisticFlatEntityMaps: ViewFieldRelatedFlatEntityMaps;
}): FailedFlatEntityValidation<FlatViewField> {
flatEntityToValidate: flatViewFieldToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewField
>): FailedFlatEntityValidation<FlatViewField> {
const validationResult: FailedFlatEntityValidation<FlatViewField> = {
type: 'create_view_field',
errors: [],
@@ -183,7 +183,7 @@ export class FlatViewFieldValidatorService {
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
if (!isDefined(flatFieldMetadata)) {
@@ -194,7 +194,10 @@ export class FlatViewFieldValidatorService {
});
}
const flatView = flatViewMaps.byId[flatViewFieldToValidate.viewId];
const flatView =
dependencyOptimisticFlatEntityMaps.flatViewMaps.byId[
flatViewFieldToValidate.viewId
];
if (!isDefined(flatView)) {
validationResult.errors.push({
@@ -226,7 +229,7 @@ export class FlatViewFieldValidatorService {
}
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityMaps: flatObjectMetadataMaps,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
flatEntityId: flatView.objectMetadataId,
});
@@ -3,26 +3,26 @@ import { Injectable } from '@nestjs/common';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { ViewFilterExceptionCode } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { ViewFilterRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/view-filter-related-flat-entity-maps.type';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class FlatViewFilterValidatorService {
constructor() {}
validateFlatViewFilterCreation({
flatViewFilterToValidate,
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
dependencyOptimisticFlatEntityMaps,
optimisticFlatViewFilterMaps,
}: {
flatViewFilterToValidate: FlatViewFilter;
dependencyOptimisticFlatEntityMaps: ViewFilterRelatedFlatEntityMaps;
optimisticFlatViewFilterMaps: FlatViewFilterMaps;
}): FailedFlatEntityValidation<FlatViewFilter> {
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
const validationResult: FailedFlatEntityValidation<FlatViewFilter> = {
type: 'create_view_filter',
errors: [],
@@ -74,12 +74,11 @@ export class FlatViewFilterValidatorService {
}
validateFlatViewFilterDeletion({
flatViewFilterToValidate,
optimisticFlatViewFilterMaps,
}: {
flatViewFilterToValidate: FlatViewFilter;
optimisticFlatViewFilterMaps: FlatViewFilterMaps;
}): FailedFlatEntityValidation<FlatViewFilter> {
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
const validationResult: FailedFlatEntityValidation<FlatViewFilter> = {
type: 'delete_view_filter',
errors: [],
@@ -111,26 +110,22 @@ export class FlatViewFilterValidatorService {
}
validateFlatViewFilterUpdate({
flatViewFilterToValidate,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
dependencyOptimisticFlatEntityMaps,
optimisticFlatViewFilterMaps,
}: {
flatViewFilterToValidate: FlatViewFilter;
dependencyOptimisticFlatEntityMaps: ViewFilterRelatedFlatEntityMaps;
optimisticFlatViewFilterMaps: FlatViewFilterMaps;
}): FailedFlatEntityValidation<FlatViewFilter> {
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
const validationResult: FailedFlatEntityValidation<FlatViewFilter> = {
type: 'update_view_filter',
errors: [],
flatEntityMinimalInformation: {
id: flatViewFilterToValidate.id,
id: flatEntityId,
},
};
const existingViewFilter = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.id,
flatEntityMaps: optimisticFlatViewFilterMaps,
});
const existingViewFilter = optimisticFlatViewFilterMaps.byId[flatEntityId];
if (!isDefined(existingViewFilter)) {
validationResult.errors.push({
@@ -138,10 +133,19 @@ export class FlatViewFilterValidatorService {
message: t`View filter not found`,
userFriendlyMessage: msg`View filter not found`,
});
return validationResult;
}
const updatedFlatViewFilter = {
...existingViewFilter,
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({
updates: flatEntityUpdates,
}),
};
const referencedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.fieldMetadataId,
flatEntityId: updatedFlatViewFilter.fieldMetadataId,
flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
@@ -1,65 +1,71 @@
import { Injectable } from '@nestjs/common';
import { t, msg } from '@lingui/core/macro';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type';
import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant';
import { FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { ViewRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
type ViewValidationArgs = {
flatViewToValidate: FlatView;
optimisticFlatViewMaps: FlatViewMaps;
dependencyOptimisticFlatEntityMaps: ViewRelatedFlatEntityMaps;
};
@Injectable()
export class FlatViewValidatorService {
constructor() {}
public validateFlatViewUpdate({
flatViewToValidate: updatedFlatView,
optimisticFlatViewMaps,
}: ViewValidationArgs): FailedFlatEntityValidation<FlatView> {
const errors = [];
flatEntityId,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.view
>): FailedFlatEntityValidation<FlatView> {
const validationResult: FailedFlatEntityValidation<FlatView> = {
type: 'update_view',
errors: [],
flatEntityMinimalInformation: {
id: flatEntityId,
},
};
const existingFlatView = optimisticFlatViewMaps.byId[updatedFlatView.id];
const existingFlatView = optimisticFlatViewMaps.byId[flatEntityId];
if (!isDefined(existingFlatView)) {
errors.push({
validationResult.errors.push({
code: ViewExceptionCode.INVALID_VIEW_DATA,
message: t`View not found`,
userFriendlyMessage: msg`View not found`,
});
}
return {
type: 'update_view',
errors,
flatEntityMinimalInformation: {
id: updatedFlatView.id,
},
};
return validationResult;
}
public validateFlatViewDeletion({
flatViewToValidate: { id: viewIdToDelete },
optimisticFlatViewMaps,
}: ViewValidationArgs): FailedFlatEntityValidation<FlatView> {
const errors = [];
flatEntityToValidate: { id: viewIdToDelete },
optimisticFlatEntityMaps: optimisticFlatViewMaps,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.view
>): FailedFlatEntityValidation<FlatView> {
const validationResult: FailedFlatEntityValidation<FlatView> = {
type: 'delete_view',
errors: [],
flatEntityMinimalInformation: {
id: viewIdToDelete,
},
};
const existingFlatView = optimisticFlatViewMaps.byId[viewIdToDelete];
if (!isDefined(existingFlatView)) {
errors.push({
validationResult.errors.push({
code: ViewExceptionCode.INVALID_VIEW_DATA,
message: t`View not found`,
userFriendlyMessage: msg`View not found`,
});
} else {
if (!isDefined(existingFlatView.deletedAt)) {
errors.push({
validationResult.errors.push({
code: ViewExceptionCode.INVALID_VIEW_DATA,
message: t`View to delete has not been soft deleted`,
userFriendlyMessage: msg`View to delete has not been soft deleted`,
@@ -67,27 +73,31 @@ export class FlatViewValidatorService {
}
}
return {
type: 'delete_view',
errors,
flatEntityMinimalInformation: {
id: viewIdToDelete,
},
};
return validationResult;
}
public async validateFlatViewCreation({
dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps },
flatViewToValidate,
optimisticFlatViewMaps,
}: ViewValidationArgs): Promise<FailedFlatEntityValidation<FlatView>> {
const optimisticFlatObjectMetadata =
flatObjectMetadataMaps.byId[flatViewToValidate.objectMetadataId];
flatEntityToValidate: flatViewToValidate,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.view>): Promise<
FailedFlatEntityValidation<FlatView>
> {
const validationResult: FailedFlatEntityValidation<FlatView> = {
type: 'create_view',
errors: [],
flatEntityMinimalInformation: {
id: flatViewToValidate.id,
},
};
const errors = [];
const optimisticFlatObjectMetadata =
dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatViewToValidate.objectMetadataId
];
if (!isDefined(optimisticFlatObjectMetadata)) {
errors.push({
validationResult.errors.push({
code: ViewExceptionCode.INVALID_VIEW_DATA,
message: t`Object metadata not found`,
userFriendlyMessage: msg`Object metadata not found`,
@@ -95,19 +105,13 @@ export class FlatViewValidatorService {
}
if (isDefined(optimisticFlatViewMaps.byId[flatViewToValidate.id])) {
errors.push({
validationResult.errors.push({
code: ViewExceptionCode.INVALID_VIEW_DATA,
message: t`View with same id is already exists`,
userFriendlyMessage: msg`View already exists`,
});
}
return {
type: 'create_view',
errors,
flatEntityMinimalInformation: {
id: flatViewToValidate.id,
},
};
return validationResult;
}
}
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { CronTrigger } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity';
import { CreateCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-cron-trigger-action-v2.type';
import { CreateCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/workspace-migration-cron-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { CronTrigger } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity';
import { DeleteCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-cron-trigger-action-v2.type';
import { DeleteCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/workspace-migration-cron-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,9 +3,9 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { CronTrigger } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity';
import { UpdateCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-cron-trigger-action-v2.type';
import { UpdateCronTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/workspace-migration-cron-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateCronTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -26,7 +26,7 @@ export class UpdateCronTriggerActionHandlerService extends WorkspaceMigrationRun
await cronTriggerRepository.update(
cronTriggerId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
}
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { DatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity';
import { CreateDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-database-event-trigger-action-v2.type';
import { CreateDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/workspace-migration-database-event-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { DatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity';
import { DeleteDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-database-event-trigger-action-v2.type';
import { DeleteDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/workspace-migration-database-event-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,9 +3,9 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { DatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity';
import { UpdateDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-database-event-trigger-action-v2.type';
import { UpdateDatabaseEventTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/workspace-migration-database-event-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateDatabaseEventTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -28,7 +28,7 @@ export class UpdateDatabaseEventTriggerActionHandlerService extends WorkspaceMig
await databaseEventTriggerRepository.update(
databaseEventTriggerId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
}
@@ -8,15 +8,15 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
@@ -7,12 +7,12 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
@@ -9,15 +9,15 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util';
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
import { FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-properties-to-compare.type';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
@@ -26,15 +26,16 @@ import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-meta
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { isPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/is-property-update.type';
import { PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { serializeDefaultValueV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/serialize-default-value-v2.util';
import {
WorkspaceMigrationRunnerException,
WorkspaceMigrationRunnerExceptionCode,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/exceptions/workspace-migration-runner.exception';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
import {
@@ -44,7 +45,7 @@ import {
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/workspace-schema-enum-operations.util';
type UpdateFieldPropertyUpdateHandlerArgs<
P extends FlatFieldMetadataPropertiesToCompare,
P extends FlatEntityPropertiesToCompare<'fieldMetadata'>,
T extends FieldMetadataType = FieldMetadataType,
> = {
queryRunner: QueryRunner;
@@ -87,7 +88,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
const updatedFlatFieldMetadata = {
...existingFlatFieldMetadata,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
};
const updatedFlatFieldMetadataMaps =
@@ -114,7 +115,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
await fieldMetadataRepository.update(
fieldMetadataId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
@@ -147,7 +148,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
let optimisticFlatFieldMetadata = structuredClone(currentFlatFieldMetadata);
for (const update of updates) {
if (update.property === 'name') {
if (isPropertyUpdate(update, 'name')) {
await this.handleFieldNameUpdate({
queryRunner,
schemaName,
@@ -157,7 +158,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
});
optimisticFlatFieldMetadata.name = update.to;
}
if (update.property === 'defaultValue') {
if (isPropertyUpdate(update, 'defaultValue')) {
await this.handleFieldDefaultValueUpdate({
queryRunner,
schemaName,
@@ -168,7 +169,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
optimisticFlatFieldMetadata.defaultValue = update.to;
}
if (
update.property === 'options' &&
isPropertyUpdate(update, 'options') &&
isEnumFlatFieldMetadata(optimisticFlatFieldMetadata)
) {
await this.handleFieldOptionsUpdate({
@@ -14,15 +14,15 @@ import {
import {
FlatEntityMapsException,
FlatEntityMapsExceptionCode,
} from 'src/engine/core-modules/common/exceptions/flat-entity-maps.exception';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity';
import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { type CreateIndexAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { type CreateIndexAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/types/workspace-migration-index-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
@@ -5,13 +5,13 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
import { type DeleteIndexAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { type DeleteIndexAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/types/workspace-migration-index-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,15 +5,15 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
@@ -5,15 +5,15 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
import {
@@ -1,22 +1,26 @@
import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import {
OptimisticallyApplyActionOnAllFlatEntityMapsArgs,
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
import { type UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { isPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/is-property-update.type';
import { type UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/get-workspace-schema-context-for-migration.util';
import {
collectEnumOperationsForObject,
@@ -49,7 +53,7 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc
const updatedFlatObjectMetadata = {
...existingFlatObjectMetadata,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
};
const updatedFlatObjectMetadataMaps =
@@ -75,7 +79,7 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc
await objectMetadataRepository.update(
action.objectMetadataId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
@@ -101,14 +105,14 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc
flatObjectMetadata: flatObjectMetadata,
});
for (const update of updates) {
if (update.property !== 'nameSingular') {
continue;
}
const nameSingularUpdate = updates.find((update) =>
isPropertyUpdate(update, 'nameSingular'),
);
const updatedObjectMetadata = {
if (isDefined(nameSingularUpdate)) {
const updatedObjectMetadata: FlatObjectMetadata = {
...flatObjectMetadata,
[update.property]: update.to,
nameSingular: nameSingularUpdate.to,
};
const newTableName = computeObjectTargetTable(updatedObjectMetadata);
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { CreateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { CreateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { DeleteRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { DeleteRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -3,9 +3,9 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { UpdateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { UpdateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateRouteTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -26,7 +26,7 @@ export class UpdateRouteTriggerActionHandlerService extends WorkspaceMigrationRu
await routeTriggerRepository.update(
routeTriggerId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
}
@@ -10,7 +10,7 @@ import { FileStorageService } from 'src/engine/core-modules/file-storage/file-st
import { getBaseTypescriptProjectFiles } from 'src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { CreateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { CreateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { DeleteServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { DeleteServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -4,16 +4,16 @@ import { isDefined } from 'twenty-shared/utils';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { ServerlessService } from 'src/engine/core-modules/serverless/serverless.service';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { UpdateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { ServerlessFunctionCode } from 'src/engine/metadata-modules/serverless-function/types/serverless-function-code.type';
import { UpdateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateServerlessFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -39,7 +39,7 @@ export class UpdateServerlessFunctionActionHandlerService extends WorkspaceMigra
await serverlessFunctionRepository.update(
serverlessFunctionId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
const serverlessFunction = findFlatEntityByIdInFlatEntityMapsOrThrow({
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity';
import { CreateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import { CreateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/workspace-migration-view-field-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity';
import { DeleteViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import { DeleteViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/workspace-migration-view-field-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,13 +5,13 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity';
import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/workspace-migration-view-field-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -35,7 +35,7 @@ export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunne
const updatedViewField = {
...existingViewField,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
};
const updatedFlatViewFieldMaps = replaceFlatEntityInFlatEntityMapsOrThrow({
@@ -57,7 +57,7 @@ export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunne
const viewFieldRepository =
queryRunner.manager.getRepository<ViewFieldEntity>(ViewFieldEntity);
const update = fromWorkspaceMigrationUpdateActionToPartialEntity(action);
const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action);
await viewFieldRepository.update(viewFieldId, update);
}
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity';
import { CreateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-filter-action-v2.type';
import { CreateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity';
import { DeleteViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-filter-action-v2.type';
import { DeleteViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,13 +5,13 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity';
import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-filter-action-v2.type';
import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateViewFilterActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -35,7 +35,7 @@ export class UpdateViewFilterActionHandlerService extends WorkspaceMigrationRunn
const updatedViewFilter = {
...existingViewFilter,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
};
const updatedFlatViewFilterMaps = replaceFlatEntityInFlatEntityMapsOrThrow({
@@ -57,7 +57,7 @@ export class UpdateViewFilterActionHandlerService extends WorkspaceMigrationRunn
const viewFilterRepository =
queryRunner.manager.getRepository<ViewFilterEntity>(ViewFilterEntity);
const update = fromWorkspaceMigrationUpdateActionToPartialEntity(action);
const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action);
await viewFilterRepository.update(viewFilterId, update);
}
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity';
import { CreateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { CreateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/types/workspace-migration-view-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,10 +5,10 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity';
import { DeleteViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { DeleteViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/types/workspace-migration-view-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
@@ -5,13 +5,13 @@ import {
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity';
import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/types/workspace-migration-view-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity';
@Injectable()
export class UpdateViewActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -35,7 +35,7 @@ export class UpdateViewActionHandlerService extends WorkspaceMigrationRunnerActi
const updatedView = {
...existingView,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
};
const updatedFlatViewMaps = replaceFlatEntityInFlatEntityMapsOrThrow({
@@ -59,7 +59,7 @@ export class UpdateViewActionHandlerService extends WorkspaceMigrationRunnerActi
await viewRepository.update(
viewId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action),
);
}
@@ -1,7 +1,11 @@
import { Inject, SetMetadata } from '@nestjs/common';
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { LoggerService } from 'src/engine/core-modules/logger/logger.service';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type';
import { MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type';
import { MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key';
import { FromWorkspaceMigrationActionToMetadataName } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
import {
type ExtractAction,
type WorkspaceMigrationActionTypeV2,
@@ -10,29 +14,20 @@ import {
import { WORKSPACE_MIGRATION_ACTION_HANDLER_METADATA_KEY } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/constants/workspace-migration-action-handler-metadata-key.constant';
import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
export interface WorkspaceMigrationRunnerActionHandlerService<
TActionType extends WorkspaceMigrationActionTypeV2,
> {
execute(
context: WorkspaceMigrationActionRunnerArgs<ExtractAction<TActionType>>,
): Promise<Partial<AllFlatEntityMaps>>;
rollback(
context: WorkspaceMigrationActionRunnerArgs<ExtractAction<TActionType>>,
): Promise<void>;
}
// TODO deprecated prastoin
export type OptimisticallyApplyActionOnAllFlatEntityMapsArgs<
TActionType extends WorkspaceMigrationActionV2,
> = Pick<
WorkspaceMigrationActionRunnerArgs<TActionType>,
'allFlatEntityMaps' | 'action'
>;
///
export abstract class BaseWorkspaceMigrationRunnerActionHandlerService<
TActionType extends WorkspaceMigrationActionTypeV2,
> implements WorkspaceMigrationRunnerActionHandlerService<TActionType>
{
TMetadataName extends
AllMetadataName = FromWorkspaceMigrationActionToMetadataName<TActionType>,
> {
public actionType: TActionType;
@Inject(LoggerService)
@@ -54,7 +49,11 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService<
args: OptimisticallyApplyActionOnAllFlatEntityMapsArgs<
ExtractAction<TActionType>
>,
): Partial<AllFlatEntityMaps> {
): Pick<
AllFlatEntityMaps,
| MetadataRelatedFlatEntityMapsKeys<TMetadataName>
| MetadataToFlatEntityMapsKey<TMetadataName>
> {
return args.allFlatEntityMaps;
}
@@ -66,7 +65,13 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService<
async execute(
context: WorkspaceMigrationActionRunnerArgs<ExtractAction<TActionType>>,
): Promise<Partial<AllFlatEntityMaps>> {
): Promise<
Pick<
AllFlatEntityMaps,
| MetadataRelatedFlatEntityMapsKeys<TMetadataName>
| MetadataToFlatEntityMapsKey<TMetadataName>
>
> {
await Promise.all([
this.asyncMethodPerformanceMetricWrapper({
label: 'executeForMetadata',
@@ -3,9 +3,9 @@ import { DiscoveryService } from '@nestjs/core';
import { isDefined } from 'twenty-shared/utils';
import { type WorkspaceMigrationRunnerActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { BaseWorkspaceMigrationRunnerActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import {
type WorkspaceMigrationActionTypeV2,
type WorkspaceMigrationActionV2,
@@ -24,7 +24,7 @@ export class WorkspaceMigrationRunnerActionHandlerRegistryService
{
private readonly actionHandlers = new Map<
WorkspaceMigrationActionTypeV2,
WorkspaceMigrationRunnerActionHandlerService<WorkspaceMigrationActionTypeV2>
InstanceType<typeof BaseWorkspaceMigrationRunnerActionHandlerService>
>();
constructor(private readonly discoveryService: DiscoveryService) {}
@@ -7,9 +7,9 @@ import {
WorkspaceQueryRunnerException,
WorkspaceQueryRunnerExceptionCode,
} from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.exception';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { LoggerService } from 'src/engine/core-modules/logger/logger.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service';
import { WorkspacePermissionsCacheService } from 'src/engine/metadata-modules/workspace-permissions-cache/workspace-permissions-cache.service';
import { WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2';
@@ -1,6 +1,6 @@
import { type QueryRunner } from 'typeorm';
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2';
export type WorkspaceMigrationActionRunnerArgs<
@@ -1,4 +1,4 @@
export const fromWorkspaceMigrationUpdateActionToPartialEntity = <
export const fromFlatEntityPropertiesUpdatesToPartialFlatEntity = <
T extends { updates: Array<{ property: string; to: unknown }> },
>(
action: T,
@@ -2,9 +2,9 @@ import { Module } from '@nestjs/common';
import { DiscoveryModule } from '@nestjs/core';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { WorkspaceMetadataCacheModule } from 'src/engine/metadata-modules/workspace-metadata-cache/workspace-metadata-cache.module';
import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module';
import { WorkspacePermissionsCacheModule } from 'src/engine/metadata-modules/workspace-permissions-cache/workspace-permissions-cache.module';
@@ -1,13 +1,13 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { AgentRoleModule } from 'src/engine/metadata-modules/agent-role/agent-role.module';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module';
import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
@@ -5,7 +5,7 @@ import { DataSource, QueryFailedError } from 'typeorm';
import { type WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service';
import {
WorkspaceMigrationEntity,