From e787215e154e08f16b757603e87aa20b6c358db6 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Sun, 4 Aug 2024 13:12:24 +0200 Subject: [PATCH] Add createdBy field on custom object creation (#6529) In this PR, I'm: - adding createdBy field (type ACTOR) on custom objects when created - moving `name` and `position` default column to the set of columns automatically creation on object creation - fixing a bug on mutations (update / create), if the targetted object has a 'data' custom field, it was conflicting with the payload ==> I feel we need to refactor this part of the code but we can keep this for a bit later as we plan to move out of pg_graphql image --- .../utils/generateEmptyFieldValue.ts | 1 + .../factories/create-many-query.factory.ts | 11 ++++--- .../factories/find-many-query.factory.ts | 2 +- .../factories/update-many-query.factory.ts | 10 +++--- .../factories/update-one-query.factory.ts | 13 ++++---- .../object-metadata.service.ts | 14 ++++++++ ...ations-for-custom-object-relations.util.ts | 27 ---------------- .../utils/custom-table-default-column.util.ts | 32 ++++++++++++++++++- .../workspace-migration-runner.service.ts | 2 +- 9 files changed, 66 insertions(+), 46 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts index d7dc1f935..95747a055 100644 --- a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts +++ b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts @@ -90,6 +90,7 @@ export const generateEmptyFieldValue = ( case FieldMetadataType.Actor: { return { source: 'MANUAL', + workspaceMemberId: null, name: '', }; } diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/create-many-query.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/create-many-query.factory.ts index f44d1fbcb..d1a160be0 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/create-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/create-many-query.factory.ts @@ -2,15 +2,15 @@ import { Injectable, Logger } from '@nestjs/common'; import { v4 as uuidv4 } from 'uuid'; -import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { Record as IRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { FieldsStringFactory } from './fields-string.factory'; import { ArgsAliasFactory } from './args-alias.factory'; +import { FieldsStringFactory } from './fields-string.factory'; @Injectable() export class CreateManyQueryFactory { @@ -30,8 +30,9 @@ export class CreateManyQueryFactory { options.fieldMetadataCollection, options.objectMetadataCollection, ); - const computedArgs = this.argsAliasFactory.create( - args, + + const computedArgsData = this.argsAliasFactory.create( + args.data, options.fieldMetadataCollection, ); @@ -40,7 +41,7 @@ export class CreateManyQueryFactory { insertInto${computeObjectTargetTable( options.objectMetadataItem, )}Collection(objects: ${stringifyWithoutKeyQuote( - computedArgs.data.map((datum) => ({ + computedArgsData.map((datum) => ({ id: uuidv4(), ...datum, })), diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts index ec8420abb..476695f3c 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts @@ -1,10 +1,10 @@ import { Injectable, Logger } from '@nestjs/common'; -import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { RecordFilter, RecordOrderBy, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { FindManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-many-query.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-many-query.factory.ts index f55e512ba..b9e6bf5d4 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-many-query.factory.ts @@ -7,9 +7,9 @@ import { import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { UpdateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util'; -import { FieldsStringFactory } from 'src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory'; import { ArgsAliasFactory } from 'src/engine/api/graphql/workspace-query-builder/factories/args-alias.factory'; +import { FieldsStringFactory } from 'src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory'; +import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; export interface UpdateManyQueryFactoryOptions @@ -37,13 +37,13 @@ export class UpdateManyQueryFactory { options.objectMetadataCollection, ); - const computedArgs = this.argsAliasFactory.create( - args, + const computedArgsData = this.argsAliasFactory.create( + args.data, options.fieldMetadataCollection, ); const argsData = { - ...computedArgs.data, + ...computedArgsData, updatedAt: new Date().toISOString(), }; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-one-query.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-one-query.factory.ts index 57df907d9..c9e863513 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-one-query.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/update-one-query.factory.ts @@ -1,14 +1,14 @@ import { Injectable, Logger } from '@nestjs/common'; -import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { Record as IRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/engine/api/graphql/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { UpdateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { FieldsStringFactory } from './fields-string.factory'; import { ArgsAliasFactory } from './args-alias.factory'; +import { FieldsStringFactory } from './fields-string.factory'; @Injectable() export class UpdateOneQueryFactory { @@ -28,13 +28,14 @@ export class UpdateOneQueryFactory { options.fieldMetadataCollection, options.objectMetadataCollection, ); - const computedArgs = this.argsAliasFactory.create( - args, + + const computedArgsData = this.argsAliasFactory.create( + args.data, options.fieldMetadataCollection, ); const argsData = { - ...computedArgs.data, + ...computedArgsData, id: undefined, // do not allow updating an existing object's id updatedAt: new Date().toISOString(), }; @@ -45,7 +46,7 @@ export class UpdateOneQueryFactory { options.objectMetadataItem, )}Collection(set: ${stringifyWithoutKeyQuote( argsData, - )}, filter: { id: { eq: "${computedArgs.id}" } }) { + )}, filter: { id: { eq: "${args.id}" } }) { affectedCount records { ${fieldsString} diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 66a879a74..7cc2e4ea1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -265,6 +265,20 @@ export class ObjectMetadataService extends TypeOrmQueryService [ { name: 'id', type: 'uuid', @@ -22,4 +26,30 @@ export const customTableDefaultColumns: TableColumnOptions[] = [ type: 'timestamptz', isNullable: true, }, + { + name: 'position', + type: 'float', + isNullable: true, + }, + { + name: 'name', + type: 'text', + isNullable: false, + default: "'Untitled'", + }, + { + name: 'createdBySource', + type: 'enum', + enumName: `${tableName}_createdBySource_enum`, + enum: Object.values(FieldActorSource), + isNullable: false, + default: `'${FieldActorSource.MANUAL}'`, + }, + { name: 'createdByWorkspaceMemberId', type: 'uuid', isNullable: true }, + { + name: 'createdByName', + type: 'text', + isNullable: false, + default: "''", + }, ]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts index 00727eaba..e09a41d3a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts @@ -227,7 +227,7 @@ export class WorkspaceMigrationRunnerService { new Table({ name: tableName, schema: schemaName, - columns: customTableDefaultColumns, + columns: customTableDefaultColumns(tableName), }), true, );