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:
@ -67,4 +67,8 @@ export class CreateObjectInput {
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
isRemote?: boolean;
|
||||
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
remoteTablePrimaryKeyColumnType?: string;
|
||||
}
|
||||
|
||||
@ -45,8 +45,8 @@ import {
|
||||
createForeignKeyDeterministicUuid,
|
||||
createRelationDeterministicUuid,
|
||||
} from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
|
||||
import { buildWorkspaceMigrationsForCustomObject } from 'src/engine/metadata-modules/object-metadata/utils/build-workspace-migrations-for-custom-object';
|
||||
import { buildWorkspaceMigrationsForRemoteObject } from 'src/engine/metadata-modules/object-metadata/utils/build-workspace-migrations-for-remote-object';
|
||||
import { buildWorkspaceMigrationsForCustomObject } from 'src/engine/metadata-modules/object-metadata/utils/build-workspace-migrations-for-custom-object.util';
|
||||
import { buildWorkspaceMigrationsForRemoteObject } from 'src/engine/metadata-modules/object-metadata/utils/build-workspace-migrations-for-remote-object.util';
|
||||
|
||||
import { ObjectMetadataEntity } from './object-metadata.entity';
|
||||
|
||||
@ -356,6 +356,14 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
||||
createdObjectMetadata,
|
||||
);
|
||||
|
||||
const dataSourceMetadata =
|
||||
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
|
||||
createdObjectMetadata.workspaceId,
|
||||
);
|
||||
|
||||
const workspaceDataSource =
|
||||
await this.typeORMService.connectToDataSource(dataSourceMetadata);
|
||||
|
||||
await this.workspaceMigrationService.createCustomMigration(
|
||||
generateMigrationName(`create-${createdObjectMetadata.nameSingular}`),
|
||||
createdObjectMetadata.workspaceId,
|
||||
@ -367,13 +375,15 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
||||
eventObjectMetadata,
|
||||
favoriteObjectMetadata,
|
||||
)
|
||||
: buildWorkspaceMigrationsForRemoteObject(
|
||||
: await buildWorkspaceMigrationsForRemoteObject(
|
||||
createdObjectMetadata,
|
||||
activityTargetObjectMetadata,
|
||||
attachmentObjectMetadata,
|
||||
eventObjectMetadata,
|
||||
favoriteObjectMetadata,
|
||||
lastDataSourceMetadata.schema,
|
||||
objectMetadataInput.remoteTablePrimaryKeyColumnType ?? 'uuid',
|
||||
workspaceDataSource,
|
||||
),
|
||||
);
|
||||
|
||||
@ -381,14 +391,6 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
||||
createdObjectMetadata.workspaceId,
|
||||
);
|
||||
|
||||
const dataSourceMetadata =
|
||||
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
|
||||
createdObjectMetadata.workspaceId,
|
||||
);
|
||||
|
||||
const workspaceDataSource =
|
||||
await this.typeORMService.connectToDataSource(dataSourceMetadata);
|
||||
|
||||
const view = await workspaceDataSource?.query(
|
||||
`INSERT INTO ${dataSourceMetadata.schema}."view"
|
||||
("objectMetadataId", "type", "name", "key", "icon")
|
||||
|
||||
@ -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,
|
||||
),
|
||||
},
|
||||
],
|
||||
Reference in New Issue
Block a user