Remote objects: Fix comment override - id typing - label (#4784)

Several fixes for remote objects:
- labels are now displayed in title case. Added an util for this.
- Ids are often integers but the foreign keys on the relations were
uuid. Sending the id type to the object metadata service so it can
creates the foreign key accordingly
- Graphql comments are override when several remote objects are
imported. Building a function that fetch the existing comment and update
it

---------

Co-authored-by: Thomas Trompette <thomast@twenty.com>
This commit is contained in:
Thomas Trompette
2024-04-04 15:35:49 +02:00
committed by GitHub
parent f8ec40dbfb
commit 41960f3593
6 changed files with 102 additions and 43 deletions

View File

@ -1,3 +1,5 @@
import { DataSource } from 'typeorm';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import {
WorkspaceMigrationTableAction,
@ -7,21 +9,53 @@ import {
import { computeCustomName } from 'src/engine/utils/compute-custom-name.util';
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
const buildCommentForRemoteObjectForeignKey = (
const buildCommentForRemoteObjectForeignKey = async (
localObjectMetadataName: string,
remoteObjectMetadataName: string,
schema: string,
): string =>
`@graphql({"totalCount":{"enabled": true},"foreign_keys":[{"local_name":"${localObjectMetadataName}Collection","local_columns":["${remoteObjectMetadataName}Id"],"foreign_name":"${remoteObjectMetadataName}","foreign_schema":"${schema}","foreign_table":"${remoteObjectMetadataName}","foreign_columns":["id"]}]})`;
workspaceDataSource: DataSource | undefined,
): Promise<string> => {
const existingComment = await workspaceDataSource?.query(
`SELECT col_description('${schema}."${localObjectMetadataName}"'::regclass, 0)`,
);
export const buildWorkspaceMigrationsForRemoteObject = (
if (!existingComment[0]?.col_description) {
return `@graphql({"totalCount":{"enabled": true},"foreign_keys":[{"local_name":"${localObjectMetadataName}Collection","local_columns":["${remoteObjectMetadataName}Id"],"foreign_name":"${remoteObjectMetadataName}","foreign_schema":"${schema}","foreign_table":"${remoteObjectMetadataName}","foreign_columns":["id"]}]})`;
}
const commentWithoutGraphQL = existingComment[0].col_description
.replace('@graphql(', '')
.replace(')', '');
const parsedComment = JSON.parse(commentWithoutGraphQL);
const foreignKey = {
local_name: `${localObjectMetadataName}Collection`,
local_columns: [`${remoteObjectMetadataName}Id`],
foreign_name: `${remoteObjectMetadataName}`,
foreign_schema: schema,
foreign_table: remoteObjectMetadataName,
foreign_columns: ['id'],
};
if (parsedComment.foreign_keys) {
parsedComment.foreign_keys.push(foreignKey);
} else {
parsedComment.foreign_keys = [foreignKey];
}
return `@graphql(${JSON.stringify(parsedComment)})`;
};
export const buildWorkspaceMigrationsForRemoteObject = async (
createdObjectMetadata: ObjectMetadataEntity,
activityTargetObjectMetadata: ObjectMetadataEntity,
attachmentObjectMetadata: ObjectMetadataEntity,
eventObjectMetadata: ObjectMetadataEntity,
favoriteObjectMetadata: ObjectMetadataEntity,
schema: string,
): WorkspaceMigrationTableAction[] => {
remoteTablePrimaryKeyColumnType: string,
workspaceDataSource: DataSource | undefined,
): Promise<WorkspaceMigrationTableAction[]> => {
const createdObjectName = createdObjectMetadata.nameSingular;
return [
@ -35,7 +69,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
isNullable: true,
} satisfies WorkspaceMigrationColumnCreate,
],
@ -50,7 +84,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
},
],
},
@ -60,10 +94,11 @@ export const buildWorkspaceMigrationsForRemoteObject = (
columns: [
{
action: WorkspaceMigrationColumnActionType.CREATE_COMMENT,
comment: buildCommentForRemoteObjectForeignKey(
comment: await buildCommentForRemoteObjectForeignKey(
activityTargetObjectMetadata.nameSingular,
createdObjectName,
schema,
workspaceDataSource,
),
},
],
@ -79,7 +114,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
isNullable: true,
} satisfies WorkspaceMigrationColumnCreate,
],
@ -94,7 +129,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
},
],
},
@ -104,10 +139,11 @@ export const buildWorkspaceMigrationsForRemoteObject = (
columns: [
{
action: WorkspaceMigrationColumnActionType.CREATE_COMMENT,
comment: buildCommentForRemoteObjectForeignKey(
comment: await buildCommentForRemoteObjectForeignKey(
attachmentObjectMetadata.nameSingular,
createdObjectName,
schema,
workspaceDataSource,
),
},
],
@ -123,7 +159,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
isNullable: true,
} satisfies WorkspaceMigrationColumnCreate,
],
@ -138,7 +174,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
},
],
},
@ -148,10 +184,11 @@ export const buildWorkspaceMigrationsForRemoteObject = (
columns: [
{
action: WorkspaceMigrationColumnActionType.CREATE_COMMENT,
comment: buildCommentForRemoteObjectForeignKey(
comment: await buildCommentForRemoteObjectForeignKey(
eventObjectMetadata.nameSingular,
createdObjectName,
schema,
workspaceDataSource,
),
},
],
@ -167,7 +204,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
isNullable: true,
} satisfies WorkspaceMigrationColumnCreate,
],
@ -182,7 +219,7 @@ export const buildWorkspaceMigrationsForRemoteObject = (
createdObjectMetadata.nameSingular,
false,
)}Id`,
columnType: 'uuid',
columnType: remoteTablePrimaryKeyColumnType,
},
],
},
@ -192,10 +229,11 @@ export const buildWorkspaceMigrationsForRemoteObject = (
columns: [
{
action: WorkspaceMigrationColumnActionType.CREATE_COMMENT,
comment: buildCommentForRemoteObjectForeignKey(
comment: await buildCommentForRemoteObjectForeignKey(
favoriteObjectMetadata.nameSingular,
createdObjectName,
schema,
workspaceDataSource,
),
},
],