[OBJECT_MANIFEST_BREAKING_CHANGE] Sync returns workspace migration (#17918)
# Introduction In this PR we start returning a workspace migration post sync so it can committed and provided within the tarball ## Universal aggregators utils Created two utils ### deleteUniversalFlatEntityForeignKeyAggregators Used when building a universal create action, a newly created actions should not contain any aggregated foreign key so they won't be codegen in the workspace migration but also they are overriden at uninversal to flat transpilation anw ### resetUniversalFlatEntityForeignKeyAggregators Used before validating a new flat entity creation, some validator will consume the fk aggregator in order to validate integrity, but of optimstically provided it can result to errors. To avoid caller responsability we override them here ## create-field-action refactor Refactored the universal and flat field create action to be following the base actions in order to ease typing Also it was tailored to handle unlimited amount of flat field metadata in the same actions whereas in the reality we were always only sending at max 2 ( for relation fields ) Note: relation field has to be provided at the same as if not optimistic would fail to retrieve circular universal identifiers ## ObjectManifest Now always expect a `labelIdentifierFieldMetadataUniversalIdentifier` ## Integration test Created an integration test that creates an app, sync a first manifest and a second implying update workspace migration action generation
This commit is contained in:
+16
-9
@@ -1,20 +1,19 @@
|
||||
import { type AllMetadataName } from 'twenty-shared/metadata';
|
||||
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action';
|
||||
import { type UniversalCreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action';
|
||||
import { type UniversalCreatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type';
|
||||
import { type WorkspaceMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration';
|
||||
import { type WorkspaceMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration.type';
|
||||
|
||||
export type IdByUniversalIdentifierByMetadataName = {
|
||||
[P in AllMetadataName]?: Record<string, string>;
|
||||
};
|
||||
|
||||
const buildFieldIdByUniversalIdentifier = ({
|
||||
const buildFieldIdByUniversalIdentifierForObjectAction = ({
|
||||
action,
|
||||
fieldMetadataIdByUniversalIdentifier,
|
||||
}: {
|
||||
action: UniversalCreateObjectAction | UniversalCreateFieldAction;
|
||||
action: UniversalCreateObjectAction;
|
||||
fieldMetadataIdByUniversalIdentifier: Record<string, string>;
|
||||
}): Record<string, string> | undefined => {
|
||||
const fieldIdByUniversalIdentifier = {
|
||||
@@ -96,7 +95,7 @@ export const enrichCreateWorkspaceMigrationActionsWithIds = ({
|
||||
const fieldIdByUniversalIdentifier = isDefined(
|
||||
fieldMetadataIdByUniversalIdentifier,
|
||||
)
|
||||
? buildFieldIdByUniversalIdentifier({
|
||||
? buildFieldIdByUniversalIdentifierForObjectAction({
|
||||
action,
|
||||
fieldMetadataIdByUniversalIdentifier,
|
||||
})
|
||||
@@ -113,12 +112,20 @@ export const enrichCreateWorkspaceMigrationActionsWithIds = ({
|
||||
return action;
|
||||
}
|
||||
|
||||
const relatedFieldId = isDefined(
|
||||
action.relatedUniversalFlatFieldMetadata,
|
||||
)
|
||||
? fieldMetadataIdByUniversalIdentifier[
|
||||
action.relatedUniversalFlatFieldMetadata.universalIdentifier
|
||||
]
|
||||
: undefined;
|
||||
|
||||
return {
|
||||
...action,
|
||||
fieldIdByUniversalIdentifier: buildFieldIdByUniversalIdentifier({
|
||||
action,
|
||||
fieldMetadataIdByUniversalIdentifier,
|
||||
}),
|
||||
id: fieldMetadataIdByUniversalIdentifier[
|
||||
action.flatEntity.universalIdentifier
|
||||
],
|
||||
relatedFieldId,
|
||||
};
|
||||
}
|
||||
case 'pageLayout': {
|
||||
|
||||
+1
-2
@@ -30,8 +30,8 @@ import { WorkspaceMigrationRoleActionsBuilderService } from 'src/engine/workspac
|
||||
import { WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service';
|
||||
import { WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service';
|
||||
import { WorkspaceMigrationSkillActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service';
|
||||
import { WorkspaceMigrationViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service';
|
||||
import { WorkspaceMigrationViewFieldGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field-group/workspace-migration-view-field-group-actions-builder.service';
|
||||
import { WorkspaceMigrationViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service';
|
||||
import { WorkspaceMigrationViewFilterGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service';
|
||||
import { WorkspaceMigrationViewFilterActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service';
|
||||
import { WorkspaceMigrationViewGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service';
|
||||
@@ -1138,7 +1138,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
...aggregatedOrchestratorActionsReport.webhook.update,
|
||||
///
|
||||
],
|
||||
workspaceId,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
+24
-12
@@ -27,6 +27,7 @@ import {
|
||||
FromToAllUniversalFlatEntityMaps,
|
||||
WorkspaceMigrationOrchestratorBuildArgs,
|
||||
WorkspaceMigrationOrchestratorFailedResult,
|
||||
WorkspaceMigrationOrchestratorSuccessfulResult,
|
||||
} from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type';
|
||||
import { computeUniversalFlatEntityMapsFromTo } from 'src/engine/workspace-manager/workspace-migration/utils/compute-universal-flat-entity-maps-from-to.util';
|
||||
import { InferDeletionFromMissingEntities } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/infer-deletion-from-missing-entities.type';
|
||||
@@ -217,7 +218,10 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
args: WorkspaceMigrationOrchestratorBuildArgs & {
|
||||
idByUniversalIdentifierByMetadataName?: IdByUniversalIdentifierByMetadataName;
|
||||
},
|
||||
) {
|
||||
): Promise<
|
||||
| WorkspaceMigrationOrchestratorFailedResult
|
||||
| WorkspaceMigrationOrchestratorSuccessfulResult
|
||||
> {
|
||||
const { idByUniversalIdentifierByMetadataName, ...buildArgs } = args;
|
||||
|
||||
const validateAndBuildResult =
|
||||
@@ -239,10 +243,6 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
return validateAndBuildResult;
|
||||
}
|
||||
|
||||
if (validateAndBuildResult.workspaceMigration.actions.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const workspaceMigration = isDefined(idByUniversalIdentifierByMetadataName)
|
||||
? enrichCreateWorkspaceMigrationActionsWithIds({
|
||||
idByUniversalIdentifierByMetadataName,
|
||||
@@ -250,13 +250,24 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
})
|
||||
: validateAndBuildResult.workspaceMigration;
|
||||
|
||||
const { metadataEvents } =
|
||||
await this.workspaceMigrationRunnerService.run(workspaceMigration);
|
||||
if (workspaceMigration.actions.length > 0) {
|
||||
const { metadataEvents } = await this.workspaceMigrationRunnerService.run(
|
||||
{
|
||||
workspaceId: args.workspaceId,
|
||||
workspaceMigration,
|
||||
},
|
||||
);
|
||||
|
||||
this.metadataEventEmitter.emitMetadataEvents({
|
||||
metadataEvents,
|
||||
workspaceId: args.workspaceId,
|
||||
});
|
||||
this.metadataEventEmitter.emitMetadataEvents({
|
||||
metadataEvents,
|
||||
workspaceId: args.workspaceId,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
status: 'success',
|
||||
workspaceMigration,
|
||||
};
|
||||
}
|
||||
|
||||
public async validateBuildAndRunWorkspaceMigration({
|
||||
@@ -265,7 +276,8 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
isSystemBuild = false,
|
||||
applicationUniversalIdentifier,
|
||||
}: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<
|
||||
WorkspaceMigrationOrchestratorFailedResult | undefined
|
||||
| WorkspaceMigrationOrchestratorFailedResult
|
||||
| WorkspaceMigrationOrchestratorSuccessfulResult
|
||||
> {
|
||||
const {
|
||||
fromToAllFlatEntityMaps,
|
||||
|
||||
Reference in New Issue
Block a user