Skip to content

Commit 2f223f3

Browse files
authored
Fix 'name' column wrongly added in standard objects (#7428)
## Context Name shouldn't be added to all tables, especially standard objects because they already have their own labelIdentifierFieldMetadata specified in the workspace-entity schema. This PR removes this column from the "base" list of columns to add when creating a new object/table and moves it to the object-metadata service that is, as of today, only used for custom objects. Also had to modify the migration-runner to handle column creation in a table creation migration (this was available in the migration definition already but was not doing anything) This also fixes an issue in standard objects that already have a "name" field defined with a different field type, this is even more important when the said field is a composite field. For example people already has a FULL_NAME name field which clashes with the default TEXT name field meaning it was only creating 1 field metadata for 'name' but 3 columns were created: `name, nameFirstName, nameLastName`. This inconsistency with metadata (which is our source of truth everywhere) brought some issues (lately, converting back typeorm response to gql (including composition) was broken).
1 parent ebe28de commit 2f223f3

File tree

10 files changed

+74
-72
lines changed

10 files changed

+74
-72
lines changed

packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ export class GraphqlQueryUpdateManyResolverService
6666
const data = formatData(args.data, objectMetadataMapItem);
6767

6868
const result = await withFilterQueryBuilder
69-
.update()
70-
.set(data)
69+
.update(data)
7170
.returning('*')
7271
.execute();
7372

packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,11 @@ export class GraphqlQueryUpdateOneResolverService
6161
objectMetadataMapItem.nameSingular,
6262
);
6363

64-
const withFilterQueryBuilder = queryBuilder.where({ id: args.id });
65-
6664
const data = formatData(args.data, objectMetadataMapItem);
6765

68-
const result = await withFilterQueryBuilder
69-
.update()
70-
.set(data)
66+
const result = await queryBuilder
67+
.update(data)
68+
.where({ id: args.id })
7169
.returning('*')
7270
.execute();
7371

packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts

+37-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ import { generateMigrationName } from 'src/engine/metadata-modules/workspace-mig
4949
import {
5050
WorkspaceMigrationColumnActionType,
5151
WorkspaceMigrationColumnDrop,
52+
WorkspaceMigrationTableAction,
5253
WorkspaceMigrationTableActionType,
5354
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
55+
import { WorkspaceMigrationFactory } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.factory';
5456
import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service';
5557
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
5658
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
@@ -103,6 +105,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
103105
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
104106
private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService,
105107
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
108+
private readonly workspaceMigrationFactory: WorkspaceMigrationFactory,
106109
) {
107110
super(objectMetadataRepository);
108111
}
@@ -563,9 +566,39 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
563566
objectMetadataInput.primaryKeyFieldMetadataSettings,
564567
);
565568

566-
return this.workspaceMigrationService.createCustomMigration(
569+
await this.workspaceMigrationService.createCustomMigration(
567570
generateMigrationName(`create-${createdObjectMetadata.nameSingular}`),
568571
createdObjectMetadata.workspaceId,
572+
[
573+
{
574+
name: computeObjectTargetTable(createdObjectMetadata),
575+
action: WorkspaceMigrationTableActionType.CREATE,
576+
} satisfies WorkspaceMigrationTableAction,
577+
],
578+
);
579+
580+
for (const fieldMetadata of createdObjectMetadata.fields) {
581+
await this.workspaceMigrationService.createCustomMigration(
582+
generateMigrationName(`create-${fieldMetadata.name}`),
583+
createdObjectMetadata.workspaceId,
584+
[
585+
{
586+
name: computeObjectTargetTable(createdObjectMetadata),
587+
action: WorkspaceMigrationTableActionType.ALTER,
588+
columns: this.workspaceMigrationFactory.createColumnActions(
589+
WorkspaceMigrationColumnActionType.CREATE,
590+
fieldMetadata,
591+
),
592+
},
593+
] satisfies WorkspaceMigrationTableAction[],
594+
);
595+
}
596+
597+
await this.workspaceMigrationService.createCustomMigration(
598+
generateMigrationName(
599+
`create-${createdObjectMetadata.nameSingular}-relations`,
600+
),
601+
createdObjectMetadata.workspaceId,
569602
buildMigrationsForCustomObjectRelations(
570603
createdObjectMetadata,
571604
activityTargetObjectMetadata,
@@ -611,7 +644,9 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
611644
}
612645

613646
this.workspaceMigrationService.createCustomMigration(
614-
generateMigrationName(`create-${createdObjectMetadata.nameSingular}`),
647+
generateMigrationName(
648+
`update-${createdObjectMetadata.nameSingular}-add-searchVector`,
649+
),
615650
createdObjectMetadata.workspaceId,
616651
[
617652
{

packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util.ts

-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ export const buildMigrationsForCustomObjectRelations = (
1818
noteTargetObjectMetadata: ObjectMetadataEntity,
1919
taskTargetObjectMetadata: ObjectMetadataEntity,
2020
): WorkspaceMigrationTableAction[] => [
21-
{
22-
name: computeObjectTargetTable(createdObjectMetadata),
23-
action: WorkspaceMigrationTableActionType.CREATE,
24-
} satisfies WorkspaceMigrationTableAction,
2521
// Add activity target relation
2622
{
2723
name: computeObjectTargetTable(activityTargetObjectMetadata),

packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,5 @@ export abstract class BaseWorkspaceEntity {
5555
},
5656
})
5757
@WorkspaceIsNullable()
58-
deletedAt?: string | null;
58+
deletedAt: string | null;
5959
}

packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/custom-table-default-column.util.ts

-55
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { TableColumnOptions } from 'typeorm';
2+
3+
export const tableDefaultColumns = (): TableColumnOptions[] => [
4+
{
5+
name: 'id',
6+
type: 'uuid',
7+
isPrimary: true,
8+
default: 'public.uuid_generate_v4()',
9+
},
10+
];

packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts

+18-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace
2626
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
2727
import { WorkspaceMigrationEnumService } from 'src/engine/workspace-manager/workspace-migration-runner/services/workspace-migration-enum.service';
2828
import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util';
29+
import { tableDefaultColumns } from 'src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util';
2930
import { isDefined } from 'src/utils/is-defined';
3031

3132
import { WorkspaceMigrationTypeService } from './services/workspace-migration-type.service';
32-
import { customTableDefaultColumns } from './utils/custom-table-default-column.util';
3333

3434
@Injectable()
3535
export class WorkspaceMigrationRunnerService {
@@ -121,7 +121,12 @@ export class WorkspaceMigrationRunnerService {
121121
) {
122122
switch (tableMigration.action) {
123123
case WorkspaceMigrationTableActionType.CREATE:
124-
await this.createTable(queryRunner, schemaName, tableMigration.name);
124+
await this.createTable(
125+
queryRunner,
126+
schemaName,
127+
tableMigration.name,
128+
tableMigration.columns,
129+
);
125130
break;
126131
case WorkspaceMigrationTableActionType.ALTER: {
127132
if (tableMigration.newName) {
@@ -244,16 +249,26 @@ export class WorkspaceMigrationRunnerService {
244249
queryRunner: QueryRunner,
245250
schemaName: string,
246251
tableName: string,
252+
columns?: WorkspaceMigrationColumnAction[],
247253
) {
248254
await queryRunner.createTable(
249255
new Table({
250256
name: tableName,
251257
schema: schemaName,
252-
columns: customTableDefaultColumns(tableName),
258+
columns: tableDefaultColumns(),
253259
}),
254260
true,
255261
);
256262

263+
if (columns && columns.length > 0) {
264+
await this.handleColumnChanges(
265+
queryRunner,
266+
schemaName,
267+
tableName,
268+
columns,
269+
);
270+
}
271+
257272
// Enable totalCount for the table
258273
await queryRunner.query(`
259274
COMMENT ON TABLE "${schemaName}"."${tableName}" IS '@graphql({"totalCount": {"enabled": true}})';

packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export type CalendarEvent = Omit<
55
CalendarEventWorkspaceEntity,
66
| 'createdAt'
77
| 'updatedAt'
8+
| 'deletedAt'
89
| 'calendarChannelEventAssociations'
910
| 'calendarEventParticipants'
1011
| 'conferenceLink'
@@ -19,6 +20,7 @@ export type CalendarEventParticipant = Omit<
1920
| 'id'
2021
| 'createdAt'
2122
| 'updatedAt'
23+
| 'deletedAt'
2224
| 'personId'
2325
| 'workspaceMemberId'
2426
| 'person'

packages/twenty-server/src/modules/messaging/message-import-manager/types/message.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export type Message = Omit<
66
MessageWorkspaceEntity,
77
| 'createdAt'
88
| 'updatedAt'
9+
| 'deletedAt'
910
| 'messageChannelMessageAssociations'
1011
| 'messageParticipants'
1112
| 'messageThread'
@@ -25,6 +26,7 @@ export type MessageParticipant = Omit<
2526
| 'id'
2627
| 'createdAt'
2728
| 'updatedAt'
29+
| 'deletedAt'
2830
| 'personId'
2931
| 'workspaceMemberId'
3032
| 'person'

0 commit comments

Comments
 (0)