Skip to content

Commit d040756

Browse files
authored
remove direction from messages (#20026)
This was a leftover column removed in #6743 but was accidentally added again when we migrated to `buildMessageStandardFlatFieldMetadatas` from workspace decorator /closes #20011
1 parent e50adaf commit d040756

6 files changed

Lines changed: 578 additions & 551 deletions

File tree

packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21432,47 +21432,6 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery =
2143221432
"relation": null,
2143321433
"morphRelations": null
2143421434
},
21435-
{
21436-
"__typename": "Field",
21437-
"id": "5b775671-2f37-4513-9485-c4b76c746156",
21438-
"universalIdentifier": "20202020-0203-4118-8e2a-05b9bdae6dab",
21439-
"type": "SELECT",
21440-
"name": "direction",
21441-
"label": "Direction",
21442-
"description": "Message Direction",
21443-
"icon": "IconDirection",
21444-
"isCustom": false,
21445-
"isActive": true,
21446-
"isSystem": false,
21447-
"isUIReadOnly": true,
21448-
"isNullable": false,
21449-
"isUnique": false,
21450-
"createdAt": "2026-04-10T08:55:56.200Z",
21451-
"updatedAt": "2026-04-10T08:55:56.200Z",
21452-
"defaultValue": "'INCOMING'",
21453-
"options": [
21454-
{
21455-
"id": "20202020-7b52-47d2-abd8-e96a4295f9a6",
21456-
"color": "green",
21457-
"label": "Incoming",
21458-
"value": "INCOMING",
21459-
"position": 0
21460-
},
21461-
{
21462-
"id": "20202020-11cb-42be-8df7-709ad53f90f9",
21463-
"color": "blue",
21464-
"label": "Outgoing",
21465-
"value": "OUTGOING",
21466-
"position": 1
21467-
}
21468-
],
21469-
"settings": null,
21470-
"isLabelSyncedWithName": false,
21471-
"morphId": null,
21472-
"applicationId": "dd6a5463-023d-4a10-855f-a4abaf32c1ec",
21473-
"relation": null,
21474-
"morphRelations": null
21475-
},
2147621435
{
2147721436
"__typename": "Field",
2147821437
"id": "d87675ee-1d19-4658-8037-daec3e00b718",

packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-upgrade-version-command.module.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Module } from '@nestjs/common';
22

33
import { WorkspaceIteratorModule } from 'src/database/commands/command-runners/workspace-iterator.module';
4+
import { DropMessageDirectionFieldCommand } from 'src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777400000000-drop-message-direction-field.command';
45
import { BackfillImageIdentifierFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777920000000-backfill-image-identifier-field-metadata-id.command';
56
import { ApplicationModule } from 'src/engine/core-modules/application/application.module';
67
import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module';
@@ -13,6 +14,9 @@ import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace
1314
WorkspaceIteratorModule,
1415
WorkspaceMigrationModule,
1516
],
16-
providers: [BackfillImageIdentifierFieldMetadataIdCommand],
17+
providers: [
18+
DropMessageDirectionFieldCommand,
19+
BackfillImageIdentifierFieldMetadataIdCommand,
20+
],
1721
})
1822
export class V2_3_UpgradeVersionCommandModule {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import { Command } from 'nest-commander';
2+
3+
import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner';
4+
import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service';
5+
import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner';
6+
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
7+
import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator';
8+
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
9+
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
10+
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
11+
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service';
12+
13+
const MESSAGE_DIRECTION_FIELD_UNIVERSAL_IDENTIFIER =
14+
'20202020-0203-4118-8e2a-05b9bdae6dab';
15+
16+
@RegisteredWorkspaceCommand('2.3.0', 1777400000000)
17+
@Command({
18+
name: 'upgrade:2-3:drop-message-direction-field',
19+
description:
20+
'Drop the leftover message.direction field metadata and its workspace column',
21+
})
22+
export class DropMessageDirectionFieldCommand extends ActiveOrSuspendedWorkspaceCommandRunner {
23+
constructor(
24+
protected readonly workspaceIteratorService: WorkspaceIteratorService,
25+
private readonly applicationService: ApplicationService,
26+
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
27+
private readonly workspaceCacheService: WorkspaceCacheService,
28+
) {
29+
super(workspaceIteratorService);
30+
}
31+
32+
override async runOnWorkspace({
33+
workspaceId,
34+
options,
35+
}: RunOnWorkspaceArgs): Promise<void> {
36+
const isDryRun = options.dryRun ?? false;
37+
38+
this.logger.log(
39+
`${isDryRun ? '[DRY RUN] ' : ''}Starting message.direction field removal for workspace ${workspaceId}`,
40+
);
41+
42+
const { flatFieldMetadataMaps } =
43+
await this.workspaceCacheService.getOrRecompute(workspaceId, [
44+
'flatFieldMetadataMaps',
45+
]);
46+
47+
const directionFieldMetadata =
48+
findFlatEntityByUniversalIdentifier<FlatFieldMetadata>({
49+
flatEntityMaps: flatFieldMetadataMaps,
50+
universalIdentifier: MESSAGE_DIRECTION_FIELD_UNIVERSAL_IDENTIFIER,
51+
});
52+
53+
if (!directionFieldMetadata) {
54+
this.logger.log(
55+
`message.direction field already absent for workspace ${workspaceId}`,
56+
);
57+
58+
return;
59+
}
60+
61+
if (isDryRun) {
62+
this.logger.log(
63+
`[DRY RUN] Would delete message.direction field for workspace ${workspaceId}`,
64+
);
65+
66+
return;
67+
}
68+
69+
const { twentyStandardFlatApplication } =
70+
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
71+
{ workspaceId },
72+
);
73+
74+
const validateAndBuildResult =
75+
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
76+
{
77+
allFlatEntityOperationByMetadataName: {
78+
fieldMetadata: {
79+
flatEntityToCreate: [],
80+
flatEntityToDelete: [directionFieldMetadata],
81+
flatEntityToUpdate: [],
82+
},
83+
},
84+
workspaceId,
85+
applicationUniversalIdentifier:
86+
twentyStandardFlatApplication.universalIdentifier,
87+
},
88+
);
89+
90+
if (validateAndBuildResult.status === 'fail') {
91+
this.logger.error(
92+
`Failed to delete message.direction field:\n${JSON.stringify(validateAndBuildResult, null, 2)}`,
93+
);
94+
95+
throw new Error(
96+
`Failed to delete message.direction field for workspace ${workspaceId}`,
97+
);
98+
}
99+
100+
this.logger.log(
101+
`Deleted message.direction field for workspace ${workspaceId}`,
102+
);
103+
}
104+
}

0 commit comments

Comments
 (0)