From 38785cd4e92905ca4c194710639b2bda16bcde24 Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Thu, 18 Dec 2025 17:08:55 +0100 Subject: [PATCH] Refactor seed to use twenty-standard application (#16598) # Introduction In this pull-request we introduce a service dedicated to the twenty-standard app installation, we will later be able to re-use existing logic to be more generic and allow any app installation. For the moment sticking to this usage https://github.com/twentyhq/core-team-issues/issues/1995 ## Encountered issues - We decided not to migrate deprecated fields ( also they will become custom field for any existing workspace having them in the future ) - duplicate criteria - wrong search index declaration - forgotten isSearchable - Attachement seed - Restored standardId ## Note For the moment we're still searching through standardId for code that run on both existing and new workspaces. For code running on new workspace exclusively we're searching using universalIdentifier We will standardize universalIdentifier usage later when we've migratred all the existing workspaces ## Workspace creation Will handle workspace creation the same way in another PR Related https://github.com/twentyhq/twenty/pull/15065 ## TODO - [ ] Double all frontend hardcoded queries to not refer to deprecated fields especially attachments --- .../activities/files/types/Attachment.ts | 2 - .../hooks/__mocks__/useFindManyRecords.ts | 2 - .../application/application-sync.service.ts | 42 ++--- .../ai/ai-agent-role/ai-agent-role.service.ts | 27 ---- ...d-flat-entities-by-application-id.util.ts} | 17 +- ...at-entity-by-universal-identifier.util.ts} | 18 ++- ...ty-maps-by-application-id-or-throw.util.ts | 24 +++ .../metadata-modules/role/role.service.ts | 8 +- .../dev-seeder-permissions.service.ts | 58 ++++--- .../attachment-data-seeds.constant.ts | 40 +---- .../dev-seeder/dev-seeder.module.ts | 6 +- .../services/dev-seeder-metadata.service.ts | 47 ------ .../dev-seeder/services/dev-seeder.service.ts | 36 ++--- .../constants/standard-object.constant.ts | 18 +-- ...nty-standard-all-metadata-name.constant.ts | 13 ++ .../twenty-standard-application.service.ts | 153 ++++++++++++++++++ .../twenty-standard-application.module.ts | 20 +++ ...enty-standard-all-flat-entity-maps.type.ts | 14 +- ...reate-standard-agent-flat-metadata.util.ts | 2 +- ...-standard-flat-field-metadata-maps.util.ts | 9 +- ...hment-standard-flat-field-metadata.util.ts | 60 ++----- ...klist-standard-flat-field-metadata.util.ts | 15 +- ...ation-standard-flat-field-metadata.util.ts | 9 +- ...annel-standard-flat-field-metadata.util.ts | 12 +- ...ipant-standard-flat-field-metadata.util.ts | 9 +- ...event-standard-flat-field-metadata.util.ts | 20 ++- ...mpany-standard-flat-field-metadata.util.ts | 45 +++--- ...count-standard-flat-field-metadata.util.ts | 12 +- ...board-standard-flat-field-metadata.util.ts | 33 +++- ...older-standard-flat-field-metadata.util.ts | 17 +- ...orite-standard-flat-field-metadata.util.ts | 19 +-- ...ation-standard-flat-field-metadata.util.ts | 12 +- ...annel-standard-flat-field-metadata.util.ts | 12 +- ...older-standard-flat-field-metadata.util.ts | 15 +- ...ipant-standard-flat-field-metadata.util.ts | 12 +- ...ssage-standard-flat-field-metadata.util.ts | 15 +- ...hread-standard-flat-field-metadata.util.ts | 20 ++- ...-note-standard-flat-field-metadata.util.ts | 43 ++--- ...arget-standard-flat-field-metadata.util.ts | 15 +- ...unity-standard-flat-field-metadata.util.ts | 28 +++- ...erson-standard-flat-field-metadata.util.ts | 60 +++---- ...-task-standard-flat-field-metadata.util.ts | 38 +++-- ...arget-standard-flat-field-metadata.util.ts | 15 +- ...ivity-standard-flat-field-metadata.util.ts | 12 +- ...igger-standard-flat-field-metadata.util.ts | 9 +- ...w-run-standard-flat-field-metadata.util.ts | 28 +++- ...kflow-standard-flat-field-metadata.util.ts | 33 +++- ...rsion-standard-flat-field-metadata.util.ts | 20 ++- ...ember-standard-flat-field-metadata.util.ts | 47 +++--- ...reate-standard-field-flat-metadata.util.ts | 25 +-- ...ndard-relation-field-flat-metadata.util.ts | 2 +- ...hment-standard-flat-index-metadata.util.ts | 12 -- ...ation-standard-flat-index-metadata.util.ts | 1 + ...eate-standard-flat-object-metadata.util.ts | 19 ++- ...eate-standard-object-flat-metadata.util.ts | 6 +- ...create-standard-role-flat-metadata.util.ts | 2 +- ...tandard-calendar-event-view-fields.util.ts | 2 +- ...mpute-standard-company-view-fields.util.ts | 2 +- ...ute-standard-dashboard-view-fields.util.ts | 2 +- ...tandard-message-thread-view-fields.util.ts | 2 +- ...mpute-standard-message-view-fields.util.ts | 2 +- ...-standard-workflow-run-view-fields.util.ts | 2 +- ...pute-standard-workflow-view-fields.util.ts | 2 +- ...igration-validate-build-and-run-service.ts | 66 ++++---- .../workspace-migration-orchestrator.type.ts | 8 +- .../attachment.workspace-entity.ts | 5 +- .../attachments.integration-spec.ts | 3 - ...ested-relation-queries.integration-spec.ts | 12 +- .../search-resolver.integration-spec.ts | 46 +++--- ...r-settings-permissions.integration-spec.ts | 3 +- .../utils/create-many-operation.util.ts | 66 ++++++++ .../perform-create-many-operation.utils.ts | 25 --- ...tandard-field-metadata.integration-spec.ts | 57 ++++--- .../integration/utils/delete-all-records.ts | 10 +- 74 files changed, 897 insertions(+), 726 deletions(-) rename packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/{get-flat-entities-by-application-id.util.ts => find-flat-entities-by-application-id.util.ts} (64%) rename packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/{get-flat-entities-by-universal-identifier.util.ts => find-flat-entity-by-universal-identifier.util.ts} (51%) create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module.ts create mode 100644 packages/twenty-server/test/integration/graphql/utils/create-many-operation.util.ts delete mode 100644 packages/twenty-server/test/integration/graphql/utils/perform-create-many-operation.utils.ts diff --git a/packages/twenty-front/src/modules/activities/files/types/Attachment.ts b/packages/twenty-front/src/modules/activities/files/types/Attachment.ts index 8cd9a1353a3..d947e857326 100644 --- a/packages/twenty-front/src/modules/activities/files/types/Attachment.ts +++ b/packages/twenty-front/src/modules/activities/files/types/Attachment.ts @@ -9,8 +9,6 @@ export type Attachment = { fileCategory: AttachmentFileCategory; companyId: string; personId: string; - // Deprecated: Use createdBy instead - authorId?: string; createdBy?: { source: string; workspaceMemberId: string | null; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts index cf2eb485362..18766f6bfff 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts @@ -125,8 +125,6 @@ export const query = gql` personId companyId id - authorId - type fullPath } } diff --git a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts index 5d389fa32b2..883b0f0c440 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts @@ -2,8 +2,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { parse } from 'path'; -import { isDefined } from 'twenty-shared/utils'; -import { HTTPMethod, Sources } from 'twenty-shared/types'; import { ApplicationManifest, FieldManifest, @@ -12,6 +10,8 @@ import { ServerlessFunctionManifest, ServerlessFunctionTriggerManifest, } from 'twenty-shared/application'; +import { HTTPMethod, Sources } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; import { @@ -29,9 +29,14 @@ import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-e import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { getFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util'; +import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; +import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service'; +import { ObjectPermissionService } from 'src/engine/metadata-modules/object-permission/object-permission.service'; +import { PermissionFlagService } from 'src/engine/metadata-modules/permission-flag/permission-flag.service'; +import { RoleService } from 'src/engine/metadata-modules/role/role.service'; import { RouteTriggerV2Service } from 'src/engine/metadata-modules/route-trigger/services/route-trigger-v2.service'; import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type'; import { ServerlessFunctionLayerService } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.service'; @@ -39,11 +44,6 @@ import { ServerlessFunctionV2Service } from 'src/engine/metadata-modules/serverl import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type'; import { computeMetadataNameFromLabelOrThrow } from 'src/engine/metadata-modules/utils/compute-metadata-name-from-label-or-throw.util'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; -import { RoleService } from 'src/engine/metadata-modules/role/role.service'; -import { ObjectPermissionService } from 'src/engine/metadata-modules/object-permission/object-permission.service'; -import { PermissionFlagService } from 'src/engine/metadata-modules/permission-flag/permission-flag.service'; -import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util'; -import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service'; @Injectable() export class ApplicationSyncService { @@ -1172,20 +1172,22 @@ export class ApplicationSyncService { } const flatObjectMetadataMapsByApplicationId = - getFlatEntitiesByApplicationId( - existingFlatObjectMetadataMaps, - application.id, - ); + findFlatEntitiesByApplicationId({ + flatEntityMaps: existingFlatObjectMetadataMaps, + applicationId: application.id, + }); - const flatIndexMetadataMapsByApplicationId = getFlatEntitiesByApplicationId( - existingFlatIndexMetadataMaps, - application.id, - ); + const flatIndexMetadataMapsByApplicationId = + findFlatEntitiesByApplicationId({ + flatEntityMaps: existingFlatIndexMetadataMaps, + applicationId: application.id, + }); - const flatFieldMetadataMapsByApplicationId = getFlatEntitiesByApplicationId( - existingFlatFieldMetadataMaps, - application.id, - ); + const flatFieldMetadataMapsByApplicationId = + findFlatEntitiesByApplicationId({ + flatEntityMaps: existingFlatFieldMetadataMaps, + applicationId: application.id, + }); await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-role/ai-agent-role.service.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-role/ai-agent-role.service.ts index 3243262f7c1..f49cc3705c3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-role/ai-agent-role.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-role/ai-agent-role.service.ts @@ -54,33 +54,6 @@ export class AiAgentRoleService { }); } - public async assignStandardRoleToAgent({ - workspaceId, - agentId, - standardRoleId, - }: { - workspaceId: string; - agentId: string; - standardRoleId: string; - }) { - const role = await this.roleRepository.findOne({ - where: { standardId: standardRoleId, workspaceId }, - }); - - if (!isDefined(role)) { - throw new AgentException( - `Standard role with standard ID ${standardRoleId} not found in workspace`, - AgentExceptionCode.ROLE_NOT_FOUND, - ); - } - - await this.assignRoleToAgent({ - workspaceId, - agentId, - roleId: role.id, - }); - } - public async removeRoleFromAgent({ workspaceId, agentId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util.ts similarity index 64% rename from packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts rename to packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util.ts index 6fe6c2b8379..939d37c5fce 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util.ts @@ -3,12 +3,15 @@ import { isDefined } from 'twenty-shared/utils'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const getFlatEntitiesByApplicationId = ( - maps: FlatEntityMaps, - applicationId: string, -): T[] => { +export const findFlatEntitiesByApplicationId = ({ + applicationId, + flatEntityMaps, +}: { + flatEntityMaps: FlatEntityMaps; + applicationId: string; +}): T[] => { const universalIdentifiers = - maps.universalIdentifiersByApplicationId[applicationId]; + flatEntityMaps.universalIdentifiersByApplicationId[applicationId]; if (!isDefined(universalIdentifiers)) { return []; @@ -16,13 +19,13 @@ export const getFlatEntitiesByApplicationId = ( return universalIdentifiers .map((universalId) => { - const id = maps.idByUniversalIdentifier[universalId]; + const id = flatEntityMaps.idByUniversalIdentifier[universalId]; if (!isDefined(id)) { return undefined; } - const entity = maps.byId[id]; + const entity = flatEntityMaps.byId[id]; if (!isDefined(entity)) { return undefined; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts similarity index 51% rename from packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts rename to packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts index 1add97c55ba..68b1b429afe 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts @@ -3,17 +3,21 @@ import { isDefined } from 'twenty-shared/utils'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const getFlatEntityByUniversalIdentifier = < +export const findFlatEntityByUniversalIdentifier = < T extends SyncableFlatEntity, ->( - maps: FlatEntityMaps, - universalIdentifier: string, -): T | undefined => { - const flatEntityId = maps.idByUniversalIdentifier[universalIdentifier]; +>({ + flatEntityMaps, + universalIdentifier, +}: { + flatEntityMaps: FlatEntityMaps; + universalIdentifier: string; +}): T | undefined => { + const flatEntityId = + flatEntityMaps.idByUniversalIdentifier[universalIdentifier]; if (!isDefined(flatEntityId)) { return; } - return maps.byId[flatEntityId]; + return flatEntityMaps.byId[flatEntityId]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util.ts new file mode 100644 index 00000000000..f58b0ba469a --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util.ts @@ -0,0 +1,24 @@ +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util'; +import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util'; + +export const getSubFlatEntityMapsByApplicationIdOrThrow = < + T extends SyncableFlatEntity, +>({ + applicationId, + flatEntityMaps, +}: { + applicationId: string; + flatEntityMaps: FlatEntityMaps; +}) => { + const allApplicationFlatEntity = findFlatEntitiesByApplicationId({ + applicationId, + flatEntityMaps, + }); + + return getSubFlatEntityMapsOrThrow({ + flatEntityIds: allApplicationFlatEntity.map((flatEntity) => flatEntity.id), + flatEntityMaps, + }); +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts index 78deec93c68..6c3fa3aa7c0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts @@ -8,7 +8,7 @@ import { Repository } from 'typeorm'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { getFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { fromCreateRoleInputToFlatRoleToCreate } from 'src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util'; import { fromDeleteRoleInputToFlatRoleOrThrow } from 'src/engine/metadata-modules/flat-role/utils/from-delete-role-input-to-flat-role-or-throw.util'; import { fromUpdateRoleInputToFlatRoleToUpdateOrThrow } from 'src/engine/metadata-modules/flat-role/utils/from-update-role-input-to-flat-role-to-update-or-throw.util'; @@ -86,10 +86,10 @@ export class RoleService { }, ); - const flatRoleEntity = getFlatEntityByUniversalIdentifier( - flatRoleMaps, + const flatRoleEntity = findFlatEntityByUniversalIdentifier({ + flatEntityMaps: flatRoleMaps, universalIdentifier, - ); + }); return isDefined(flatRoleEntity) ? fromFlatRoleToRoleDto(flatRoleEntity) diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts index 97b8092463b..9fab2822c4a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts @@ -4,7 +4,7 @@ import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { DataSource, Repository } from 'typeorm'; -import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; +import { FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service'; @@ -13,7 +13,6 @@ import { RoleTargetService } from 'src/engine/metadata-modules/role-target/servi import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; import { RoleService } from 'src/engine/metadata-modules/role/role.service'; import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role.service'; -import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { SEED_APPLE_WORKSPACE_ID, SEED_YCOMBINATOR_WORKSPACE_ID, @@ -23,7 +22,7 @@ import { USER_WORKSPACE_DATA_SEED_IDS, } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-user-workspaces.util'; import { API_KEY_DATA_SEED_IDS } from 'src/engine/workspace-manager/dev-seeder/data/constants/api-key-data-seeds.constant'; -import { ADMIN_ROLE } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/admin-role'; +import { STANDARD_ROLE } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant'; @Injectable() export class DevSeederPermissionsService { @@ -37,7 +36,6 @@ export class DevSeederPermissionsService { private readonly objectMetadataRepository: Repository, @InjectRepository(RoleEntity) private readonly roleRepository: Repository, - private readonly workspaceCacheService: WorkspaceCacheService, private readonly fieldPermissionService: FieldPermissionService, private readonly roleTargetService: RoleTargetService, @InjectDataSource() @@ -45,15 +43,15 @@ export class DevSeederPermissionsService { ) {} public async initPermissions({ - twentyStandardApplication, + twentyStandardFlatApplication, workspaceId, }: { workspaceId: string; - twentyStandardApplication: ApplicationEntity; + twentyStandardFlatApplication: FlatApplication; }) { const adminRole = await this.roleRepository.findOne({ where: { - standardId: ADMIN_ROLE.standardId, + universalIdentifier: STANDARD_ROLE.admin.universalIdentifier, workspaceId, }, }); @@ -64,21 +62,15 @@ export class DevSeederPermissionsService { ); } - try { - await this.roleTargetService.create({ - createRoleTargetInput: { - roleId: adminRole.id, - targetId: API_KEY_DATA_SEED_IDS.ID_1, - targetMetadataForeignKey: 'apiKeyId', - applicationId: twentyStandardApplication.id, - }, - workspaceId, - }); - } catch (error) { - this.logger.error( - `Could not assign role to test API key: ${error.message}`, - ); - } + await this.roleTargetService.create({ + createRoleTargetInput: { + roleId: adminRole.id, + targetId: API_KEY_DATA_SEED_IDS.ID_1, + targetMetadataForeignKey: 'apiKeyId', + applicationId: twentyStandardFlatApplication.id, + }, + workspaceId, + }); let adminUserWorkspaceId: string | undefined; let memberUserWorkspaceIds: string[] = []; @@ -96,7 +88,7 @@ export class DevSeederPermissionsService { const guestRole = await this.roleService.createGuestRole({ workspaceId, - applicationId: twentyStandardApplication.id, + applicationId: twentyStandardFlatApplication.id, }); await this.userRoleService.assignRoleToManyUserWorkspace({ @@ -107,7 +99,7 @@ export class DevSeederPermissionsService { const limitedRole = await this.createLimitedRoleForSeedWorkspace({ workspaceId, - applicationId: twentyStandardApplication.id, + applicationId: twentyStandardFlatApplication.id, }); await this.userRoleService.assignRoleToManyUserWorkspace({ @@ -124,17 +116,21 @@ export class DevSeederPermissionsService { ]; } - if (adminUserWorkspaceId) { - await this.userRoleService.assignRoleToManyUserWorkspace({ - workspaceId, - userWorkspaceIds: [adminUserWorkspaceId], - roleId: adminRole.id, - }); + if (!adminUserWorkspaceId) { + throw new Error( + 'Should never occur, no eligible user workspace for admin has been found', + ); } + await this.userRoleService.assignRoleToManyUserWorkspace({ + workspaceId, + userWorkspaceIds: [adminUserWorkspaceId], + roleId: adminRole.id, + }); + const memberRole = await this.roleService.createMemberRole({ workspaceId, - applicationId: twentyStandardApplication.id, + applicationId: twentyStandardFlatApplication.id, }); await this.coreDataSource diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/attachment-data-seeds.constant.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/attachment-data-seeds.constant.ts index 7b596fa4830..f64625a37d8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/attachment-data-seeds.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/attachment-data-seeds.constant.ts @@ -11,10 +11,7 @@ type AttachmentDataSeed = { id: string; name: string; fullPath: string; - type: string; - fileCategory?: string; - // Deprecated: Use createdBy instead - authorId: string | null; + fileCategory: string; createdBySource: string; createdByWorkspaceMemberId: string; createdByName: string; @@ -29,9 +26,7 @@ export const ATTACHMENT_DATA_SEED_COLUMNS: (keyof AttachmentDataSeed)[] = [ 'id', 'name', 'fullPath', - 'type', 'fileCategory', - 'authorId', // Deprecated: kept for backward compatibility during migration 'createdBySource', 'createdByWorkspaceMemberId', 'createdByName', @@ -71,152 +66,128 @@ const FILE_NAME_VARIATIONS = [ // Documents { name: 'Service Agreement.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'NDA Document.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'Project Proposal.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'Invoice Q1 2024.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'Meeting Notes.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'Report Final.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, { name: 'Contract Signed.pdf', - type: 'TextDocument', fileCategory: 'TEXT_DOCUMENT', pathIndex: 0, }, // Spreadsheets { name: 'Financial Forecast.xlsx', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, { name: 'Sales Report Q4.xlsx', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, { name: 'Team Roster.xlsx', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, { name: 'Expense Report.xlsx', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, { name: 'Inventory List.xlsx', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, { name: 'Data Export.csv', - type: 'Spreadsheet', fileCategory: 'SPREADSHEET', pathIndex: 1, }, // Presentations { name: 'Pitch Deck.pptx', - type: 'Presentation', fileCategory: 'PRESENTATION', pathIndex: 2, }, { name: 'Q4 Results.pptx', - type: 'Presentation', fileCategory: 'PRESENTATION', pathIndex: 2, }, { name: 'Roadmap 2024.pptx', - type: 'Presentation', fileCategory: 'PRESENTATION', pathIndex: 2, }, { name: 'Company Overview.pptx', - type: 'Presentation', fileCategory: 'PRESENTATION', pathIndex: 2, }, { name: 'Training Materials.pptx', - type: 'Presentation', fileCategory: 'PRESENTATION', pathIndex: 2, }, // Images { name: 'Company Logo.png', - type: 'Image', fileCategory: 'IMAGE', pathIndex: 3, }, { name: 'Product Photo.jpg', - type: 'Image', fileCategory: 'IMAGE', pathIndex: 3, }, - { name: 'Diagram.png', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 }, - { name: 'Wireframe.png', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 }, + { name: 'Diagram.png', fileCategory: 'IMAGE', pathIndex: 3 }, + { name: 'Wireframe.png', fileCategory: 'IMAGE', pathIndex: 3 }, { name: 'Mockup Design.png', - type: 'Image', fileCategory: 'IMAGE', pathIndex: 3, }, - { name: 'Headshot.jpg', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 }, + { name: 'Headshot.jpg', fileCategory: 'IMAGE', pathIndex: 3 }, // Archives { name: 'Project Files.zip', - type: 'Archive', fileCategory: 'ARCHIVE', pathIndex: 4, }, { name: 'Backup Data.zip', - type: 'Archive', fileCategory: 'ARCHIVE', pathIndex: 4, }, { name: 'Source Code.zip', - type: 'Archive', fileCategory: 'ARCHIVE', pathIndex: 4, }, @@ -276,10 +247,7 @@ const GENERATE_ATTACHMENT_SEEDS = (): AttachmentDataSeed[] => { id: ATTACHMENT_DATA_SEED_IDS[`ID_${INDEX}`], name: NAME_VARIATION.name, fullPath: FILE_PATH, - type: NAME_VARIATION.type, fileCategory: NAME_VARIATION.fileCategory, - // Deprecated: Use createdBy fields instead - authorId: WORKSPACE_MEMBER_DATA_SEED_IDS.TIM, createdBySource: FieldActorSource.MANUAL, createdByWorkspaceMemberId: WORKSPACE_MEMBER_DATA_SEED_IDS.TIM, createdByName: 'Tim A', diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/dev-seeder.module.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/dev-seeder.module.ts index af3fe6a4793..0a06b6b4da3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/dev-seeder.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/dev-seeder.module.ts @@ -24,7 +24,8 @@ import { DevSeederDataService } from 'src/engine/workspace-manager/dev-seeder/da import { TimelineActivitySeederService } from 'src/engine/workspace-manager/dev-seeder/data/services/timeline-activity-seeder.service'; import { DevSeederMetadataService } from 'src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service'; import { DevSeederService } from 'src/engine/workspace-manager/dev-seeder/services/dev-seeder.service'; -import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.module'; +import { TwentyStandardApplicationModule } from 'src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module'; +import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module'; @Module({ imports: [ @@ -41,11 +42,12 @@ import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/worksp ApplicationModule, FeatureFlagModule, FileStorageModule, - WorkspaceSyncMetadataModule, TypeOrmModule.forFeature([WorkspaceEntity, ObjectMetadataEntity]), ObjectPermissionModule, WorkspaceManyOrAllFlatEntityMapsCacheModule, WorkspaceCacheModule, + WorkspaceMigrationV2Module, + TwentyStandardApplicationModule, ], exports: [DevSeederService], providers: [ diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service.ts index 5bff6ac8b0d..afacd5c53c1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service.ts @@ -1,10 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { InjectDataSource } from '@nestjs/typeorm'; import { isDefined } from 'twenty-shared/utils'; -import { DataSource } from 'typeorm'; -import { FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service'; @@ -25,7 +22,6 @@ import { ROCKET_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seed import { SURVEY_RESULT_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seeder/metadata/custom-objects/constants/survey-results-object-seed.constant'; import { type FieldMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/field-metadata-seed.type'; import { type ObjectMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/object-metadata-seed.type'; -import { prefillCoreViews } from 'src/engine/workspace-manager/standard-objects-prefill-data/prefill-core-views'; @Injectable() export class DevSeederMetadataService { @@ -33,8 +29,6 @@ export class DevSeederMetadataService { private readonly objectMetadataService: ObjectMetadataService, private readonly fieldMetadataService: FieldMetadataService, private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, - @InjectDataSource() - private readonly coreDataSource: DataSource, ) {} private readonly workspaceConfigs: Record< @@ -85,13 +79,9 @@ export class DevSeederMetadataService { public async seed({ dataSourceMetadata, workspaceId, - featureFlags, - twentyStandardFlatApplication, }: { dataSourceMetadata: DataSourceEntity; workspaceId: string; - twentyStandardFlatApplication: FlatApplication; - featureFlags?: Record; }) { const config = this.workspaceConfigs[workspaceId]; @@ -125,13 +115,6 @@ export class DevSeederMetadataService { fieldMetadataSeeds: fieldConfig.seeds, }); } - - await this.seedCoreViews({ - workspaceId, - dataSourceMetadata, - featureFlags, - twentyStandardFlatApplication, - }); } private async seedCustomObject({ @@ -182,36 +165,6 @@ export class DevSeederMetadataService { }); } - private async seedCoreViews({ - workspaceId, - dataSourceMetadata, - featureFlags, - twentyStandardFlatApplication, - }: { - workspaceId: string; - dataSourceMetadata: DataSourceEntity; - featureFlags?: Record; - twentyStandardFlatApplication: FlatApplication; - }): Promise { - const { flatObjectMetadataMaps, flatFieldMetadataMaps } = - await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( - { - workspaceId, - flatMapsKeys: ['flatObjectMetadataMaps', 'flatFieldMetadataMaps'], - }, - ); - - await prefillCoreViews({ - coreDataSource: this.coreDataSource, - workspaceId, - flatObjectMetadataMaps, - flatFieldMetadataMaps, - workspaceSchemaName: dataSourceMetadata.schema, - featureFlags, - twentyStandardFlatApplication, - }); - } - public async seedRelations({ workspaceId }: { workspaceId: string }) { const config = this.workspaceConfigs[workspaceId]; diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/services/dev-seeder.service.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/services/dev-seeder.service.ts index 48014739bc6..d5c8b6abdba 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/services/dev-seeder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/services/dev-seeder.service.ts @@ -1,12 +1,10 @@ import { Injectable } from '@nestjs/common'; import { InjectDataSource } from '@nestjs/typeorm'; -import { isDefined } from 'twenty-shared/utils'; import { DataSource } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; -import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -21,8 +19,7 @@ import { seedPageLayoutWidgets } from 'src/engine/workspace-manager/dev-seeder/c import { seedPageLayouts } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-page-layouts.util'; import { DevSeederDataService } from 'src/engine/workspace-manager/dev-seeder/data/services/dev-seeder-data.service'; import { DevSeederMetadataService } from 'src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service'; -import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; -import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service'; +import { TwentyStandardApplicationService } from 'src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service'; @Injectable() export class DevSeederService { @@ -31,8 +28,7 @@ export class DevSeederService { private readonly twentyConfigService: TwentyConfigService, private readonly workspaceDataSourceService: WorkspaceDataSourceService, private readonly dataSourceService: DataSourceService, - private readonly featureFlagService: FeatureFlagService, - private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService, + private readonly twentyStandardApplicationService: TwentyStandardApplicationService, private readonly devSeederMetadataService: DevSeederMetadataService, private readonly devSeederPermissionsService: DevSeederPermissionsService, private readonly devSeederDataService: DevSeederDataService, @@ -70,36 +66,22 @@ export class DevSeederService { schemaName, ); - const twentyStandardApplication = - await this.applicationService.findByUniversalIdentifier({ - workspaceId, - universalIdentifier: TWENTY_STANDARD_APPLICATION.universalIdentifier, - }); - - if (!isDefined(twentyStandardApplication)) { - throw new Error( - 'Seeder failed to find twenty standard application, should never occur', - ); - } - - const { twentyStandardFlatApplication, workspaceCustomFlatApplication } = + const { workspaceCustomFlatApplication, twentyStandardFlatApplication } = await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( { workspaceId, }, ); - await this.workspaceSyncMetadataService.synchronize({ - workspaceId: workspaceId, - dataSourceId: dataSourceMetadata.id, - featureFlags: featureFlagsMap, - }); + await this.twentyStandardApplicationService.synchronizeTwentyStandardApplicationOrThrow( + { + workspaceId, + }, + ); await this.devSeederMetadataService.seed({ dataSourceMetadata, workspaceId, - featureFlags: featureFlagsMap, - twentyStandardFlatApplication, }); await this.devSeederMetadataService.seedRelations({ @@ -108,7 +90,7 @@ export class DevSeederService { await this.devSeederPermissionsService.initPermissions({ workspaceId, - twentyStandardApplication, + twentyStandardFlatApplication, }); await seedPageLayouts( diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant.ts index e4066607365..f6d879830ef 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant.ts @@ -48,14 +48,12 @@ export const STANDARD_OBJECTS = { }, name: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.name }, fullPath: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.fullPath }, - type: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.type }, fileCategory: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.fileCategory, }, createdBy: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.createdBy, }, - author: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.author }, task: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.task }, note: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.note }, person: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.person }, @@ -69,9 +67,6 @@ export const STANDARD_OBJECTS = { workflow: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.workflow }, }, indexes: { - authorIdIndex: { - universalIdentifier: 'a7c3e8f2-9b14-4d6a-8e5f-1c2d3b4a5e6f', - }, taskIdIndex: { universalIdentifier: 'b8d4f9a3-0c25-4e7b-9f6a-2d3e4c5b6f70', }, @@ -389,9 +384,6 @@ export const STANDARD_OBJECTS = { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.domainName, }, address: { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.address }, - addressOld: { - universalIdentifier: COMPANY_STANDARD_FIELD_IDS.address_deprecated, - }, employees: { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.employees }, linkedinLink: { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.linkedinLink, @@ -626,7 +618,7 @@ export const STANDARD_OBJECTS = { }, task: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.task }, note: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.note }, - view: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.view }, + viewId: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.view }, favoriteFolder: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.favoriteFolder, }, @@ -1035,7 +1027,6 @@ export const STANDARD_OBJECTS = { }, position: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.position }, title: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.title }, - body: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.body }, bodyV2: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.bodyV2 }, createdBy: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.createdBy }, noteTargets: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.noteTargets }, @@ -1253,14 +1244,12 @@ export const STANDARD_OBJECTS = { universalIdentifier: '20202020-e01d-4144-9d44-789abcdefabc', }, name: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.name }, - email: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.email }, emails: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.emails }, linkedinLink: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.linkedinLink, }, xLink: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.xLink }, jobTitle: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.jobTitle }, - phone: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.phone }, phones: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.phones }, city: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.city }, avatarUrl: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.avatarUrl }, @@ -1359,7 +1348,6 @@ export const STANDARD_OBJECTS = { }, position: { universalIdentifier: TASK_STANDARD_FIELD_IDS.position }, title: { universalIdentifier: TASK_STANDARD_FIELD_IDS.title }, - body: { universalIdentifier: TASK_STANDARD_FIELD_IDS.body }, bodyV2: { universalIdentifier: TASK_STANDARD_FIELD_IDS.bodyV2 }, dueAt: { universalIdentifier: TASK_STANDARD_FIELD_IDS.dueAt }, status: { universalIdentifier: TASK_STANDARD_FIELD_IDS.status }, @@ -1946,10 +1934,6 @@ export const STANDARD_OBJECTS = { universalIdentifier: WORKSPACE_MEMBER_STANDARD_FIELD_IDS.accountOwnerForCompanies, }, - authoredAttachments: { - universalIdentifier: - WORKSPACE_MEMBER_STANDARD_FIELD_IDS.authoredAttachments, - }, connectedAccounts: { universalIdentifier: WORKSPACE_MEMBER_STANDARD_FIELD_IDS.connectedAccounts, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant.ts new file mode 100644 index 00000000000..2fe2ebfea5d --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant.ts @@ -0,0 +1,13 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +export const TWENTY_STANDARD_ALL_METADATA_NAME = [ + 'index', + 'objectMetadata', + 'fieldMetadata', + 'viewField', + 'viewFilter', + 'viewGroup', + 'view', + 'role', + 'agent', +] as const satisfies AllMetadataName[]; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts new file mode 100644 index 00000000000..09ef82daf97 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts @@ -0,0 +1,153 @@ +import { Injectable } from '@nestjs/common'; + +import { isDefined } from 'twenty-shared/utils'; + +import { ApplicationService } from 'src/engine/core-modules/application/application.service'; +import { MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { getSubFlatEntityMapsByApplicationIdOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util'; +import { FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; +import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util'; +import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; +import { STANDARD_OBJECTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant'; +import { TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant'; +import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; +import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; +import { FromToAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; +import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/favorite.workspace-entity'; + +@Injectable() +export class TwentyStandardApplicationService { + constructor( + private readonly applicationService: ApplicationService, + private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, + private readonly workspaceCacheService: WorkspaceCacheService, + private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, + ) {} + + // Note: To remove and handle natively in validateBuildAndRun after favorite migration to metadata + private async createManyFavorite({ + flatViews, + workspaceId, + }: { + flatViews: FlatView[]; + workspaceId: string; + }) { + const authContext = buildSystemAuthContext(workspaceId); + + await this.globalWorkspaceOrmManager.executeInWorkspaceContext( + authContext, + async () => { + const favoriteRepository = + await this.globalWorkspaceOrmManager.getRepository( + workspaceId, + 'favorite', + ); + + const favoriteCount = await favoriteRepository.count(); + const favoriteToCreate = flatViews.map((flatView, index) => ({ + viewId: flatView.id, + position: favoriteCount + index, + })); + + await favoriteRepository.insert(favoriteToCreate); + }, + ); + } + + async synchronizeTwentyStandardApplicationOrThrow({ + workspaceId, + }: { + workspaceId: string; + }) { + const { twentyStandardFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { featureFlagsMap, ...fromTwentyStandardAllFlatEntityMaps } = + await this.workspaceCacheService.getOrRecompute(workspaceId, [ + ...TWENTY_STANDARD_ALL_METADATA_NAME.map(getMetadataFlatEntityMapsKey), + 'featureFlagsMap', + ]); + const toTwentyStandardAllFlatEntityMaps = + computeTwentyStandardApplicationAllFlatEntityMaps({ + now: new Date().toISOString(), + workspaceId, + twentyStandardApplicationId: twentyStandardFlatApplication.id, + }); + + const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {}; + + for (const metadataName of TWENTY_STANDARD_ALL_METADATA_NAME) { + const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); + const fromFlatEntityMaps = + fromTwentyStandardAllFlatEntityMaps[flatEntityMapsKey]; + const fromTo = { + from: getSubFlatEntityMapsByApplicationIdOrThrow< + MetadataFlatEntity + >({ + applicationId: twentyStandardFlatApplication.id, + flatEntityMaps: fromFlatEntityMaps, + }), + to: toTwentyStandardAllFlatEntityMaps[flatEntityMapsKey], + }; + + // @ts-expect-error Metadata flat entity maps cache key and metadataName colliding + fromToAllFlatEntityMaps[flatEntityMapsKey] = fromTo; + } + + const validateAndBuildResult = + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigrationFromTo( + { + buildOptions: { + isSystemBuild: true, + inferDeletionFromMissingEntities: true, + }, + fromToAllFlatEntityMaps, + workspaceId, + additionalCacheDataMaps: { + featureFlagsMap, + }, + }, + ); + + if (isDefined(validateAndBuildResult)) { + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while synchronizing twenty-standard application', + ); + } + + const { flatViewMaps } = await this.workspaceCacheService.getOrRecompute( + workspaceId, + ['flatViewMaps'], + ); + + const flatViews = [ + STANDARD_OBJECTS.company.views.allCompanies.universalIdentifier, + STANDARD_OBJECTS.dashboard.views.allDashboards.universalIdentifier, + STANDARD_OBJECTS.note.views.allNotes.universalIdentifier, + STANDARD_OBJECTS.opportunity.views.allOpportunities.universalIdentifier, + STANDARD_OBJECTS.person.views.allPeople.universalIdentifier, + STANDARD_OBJECTS.task.views.allTasks.universalIdentifier, + STANDARD_OBJECTS.workflow.views.allWorkflows.universalIdentifier, + ] + .map((universalIdentifier) => + findFlatEntityByUniversalIdentifier({ + flatEntityMaps: flatViewMaps, + universalIdentifier, + }), + ) + .filter(isDefined); + + await this.createManyFavorite({ + flatViews, + workspaceId, + }); + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module.ts new file mode 100644 index 00000000000..be1aa403c18 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module.ts @@ -0,0 +1,20 @@ +import { Module } from '@nestjs/common'; + +import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; +import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; +import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module'; +import { GlobalWorkspaceDataSourceModule } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-datasource.module'; + +import { TwentyStandardApplicationService } from './services/twenty-standard-application.service'; + +@Module({ + providers: [TwentyStandardApplicationService], + imports: [ + ApplicationModule, + WorkspaceCacheModule, + WorkspaceMigrationV2Module, + GlobalWorkspaceDataSourceModule, + ], + exports: [TwentyStandardApplicationService], +}) +export class TwentyStandardApplicationModule {} diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type.ts index f210180210e..ed40a9050e9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type.ts @@ -1,14 +1,10 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; +import { type TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant'; export type TwentyStandardAllFlatEntityMaps = Pick< AllFlatEntityMaps, - | 'flatIndexMaps' - | 'flatObjectMetadataMaps' - | 'flatFieldMetadataMaps' - | 'flatViewFieldMaps' - | 'flatViewFilterMaps' - | 'flatViewGroupMaps' - | 'flatViewMaps' - | 'flatRoleMaps' - | 'flatAgentMaps' + MetadataToFlatEntityMapsKey< + (typeof TWENTY_STANDARD_ALL_METADATA_NAME)[number] + > >; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util.ts index ae059aa6a89..9394a13a9c0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util.ts @@ -49,7 +49,7 @@ export const createStandardAgentFlatMetadata = ({ return { id: v4(), universalIdentifier, - standardId: null, + standardId: universalIdentifier, name, label, icon, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util.ts index 35a2119f8ba..afd85b67f90 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util.ts @@ -1,3 +1,5 @@ +import { type FieldMetadataType } from 'twenty-shared/types'; + import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; @@ -35,7 +37,7 @@ import { buildWorkspaceMemberStandardFlatFieldMetadatas } from 'src/engine/works import { type CreateStandardFieldArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; type StandardFieldBuilder

= ( - args: Omit, 'context'>, + args: Omit, 'context'>, ) => Record; const STANDARD_FLAT_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = { @@ -77,7 +79,10 @@ const STANDARD_FLAT_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = { }; export const buildStandardFlatFieldMetadataMaps = ( - args: Omit, + args: Omit< + CreateStandardFieldArgs, + 'context' | 'objectName' + >, ): FlatEntityMaps => { const allFieldMetadatas: FlatFieldMetadata[] = ( Object.keys( diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-attachment-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-attachment-standard-flat-field-metadata.util.ts index 02c7a76b661..f497a6d450a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-attachment-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-attachment-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'attachment'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'attachment', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +57,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +78,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +98,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -139,22 +140,6 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - type: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'type', - type: FieldMetadataType.TEXT, - label: 'Type (deprecated)', - description: 'Attachment type (deprecated - use fileCategory)', - icon: 'IconList', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), fileCategory: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -208,6 +193,11 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -216,30 +206,6 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ }), // Relation fields - author: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - type: FieldMetadataType.RELATION, - morphId: null, - fieldName: 'author', - label: 'Author', - description: 'Attachment author (deprecated - use createdBy)', - icon: 'IconCircleUser', - isNullable: true, - targetObjectName: 'workspaceMember', - targetFieldName: 'authoredAttachments', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.SET_NULL, - joinColumnName: 'authorId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), task: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-blocklist-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-blocklist-standard-flat-field-metadata.util.ts index 23a8b76c60a..046201c73d6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-blocklist-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-blocklist-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'blocklist'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'blocklist', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +57,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +78,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +98,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-event-association-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-event-association-standard-flat-field-metadata.util.ts index 7639b61baf0..8773532b7ed 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-event-association-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-event-association-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -20,7 +21,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ dependencyFlatEntityMaps, twentyStandardApplicationId, }: Omit< - CreateStandardFieldArgs<'calendarChannelEventAssociation'>, + CreateStandardFieldArgs<'calendarChannelEventAssociation', FieldMetadataType>, 'context' >): Record< AllStandardObjectFieldName<'calendarChannelEventAssociation'>, @@ -57,7 +58,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -76,7 +77,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -94,7 +95,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-standard-flat-field-metadata.util.ts index 70031759935..d2c2d80becc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-channel-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,7 +20,10 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'calendarChannel', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'calendarChannel'>, FlatFieldMetadata > => ({ @@ -54,7 +58,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +77,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +95,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts index 5f48874993e..9b305d079f7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -20,7 +21,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ dependencyFlatEntityMaps, twentyStandardApplicationId, }: Omit< - CreateStandardFieldArgs<'calendarEventParticipant'>, + CreateStandardFieldArgs<'calendarEventParticipant', FieldMetadataType>, 'context' >): Record< AllStandardObjectFieldName<'calendarEventParticipant'>, @@ -57,7 +58,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -76,7 +77,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -94,7 +95,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts index 6468addb3cd..df488b7b500 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -15,10 +19,10 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'calendarEvent'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'calendarEvent', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -50,7 +54,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -69,7 +73,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -87,7 +91,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts index c0272582f48..139f6182cd6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_COMPANY } from 'src/modules/company/standard-objects/company.workspace-entity'; export const buildCompanyStandardFlatFieldMetadatas = ({ now, @@ -19,10 +22,10 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'company'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'company', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +59,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +80,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +100,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -160,23 +163,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - addressOld: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'addressOld', - type: FieldMetadataType.TEXT, - label: 'Address (deprecated)', - description: - 'Address of the company - deprecated in favor of new address field', - icon: 'IconMap', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), employees: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -289,6 +275,11 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -306,6 +297,12 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_COMPANY, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-connected-account-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-connected-account-standard-flat-field-metadata.util.ts index cb763ae9d68..3f09e6ec768 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-connected-account-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-connected-account-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,7 +20,10 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'connectedAccount', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'connectedAccount'>, FlatFieldMetadata > => ({ @@ -54,7 +58,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +77,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +95,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts index 8a004dd9483..4dc7a2bebfb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -7,6 +11,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_DASHBOARD } from 'src/modules/dashboard/standard-objects/dashboard.workspace-entity'; export const buildDashboardStandardFlatFieldMetadatas = ({ now, @@ -15,10 +21,10 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'dashboard'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'dashboard', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -51,7 +57,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -70,7 +76,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -88,7 +94,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -159,6 +165,11 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -176,6 +187,12 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_DASHBOARD, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-folder-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-folder-standard-flat-field-metadata.util.ts index a757f4a3e2e..8ec1990ca16 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-folder-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-folder-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -15,7 +19,10 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'favoriteFolder', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'favoriteFolder'>, FlatFieldMetadata > => ({ @@ -51,7 +58,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -70,7 +77,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -88,7 +95,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-standard-flat-field-metadata.util.ts index 085a4b4897a..47b610130ca 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-favorite-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'favorite'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'favorite', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -55,7 +56,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -74,7 +75,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -92,7 +93,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -119,11 +120,11 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - view: createStandardFieldFlatMetadata({ + viewId: createStandardFieldFlatMetadata({ objectName, workspaceId, context: { - fieldName: 'view', + fieldName: 'viewId', type: FieldMetadataType.UUID, label: 'ViewId', description: 'ViewId', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-standard-flat-field-metadata.util.ts index 07a0d6b3364..1750b19eced 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -22,7 +23,10 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = dependencyFlatEntityMaps, twentyStandardApplicationId, }: Omit< - CreateStandardFieldArgs<'messageChannelMessageAssociation'>, + CreateStandardFieldArgs< + 'messageChannelMessageAssociation', + FieldMetadataType + >, 'context' >): Record< AllStandardObjectFieldName<'messageChannelMessageAssociation'>, @@ -59,7 +63,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -78,7 +82,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -96,7 +100,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-standard-flat-field-metadata.util.ts index 8cefdf21293..842e3f1f613 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -20,7 +21,10 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'messageChannel', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'messageChannel'>, FlatFieldMetadata > => ({ @@ -55,7 +59,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -74,7 +78,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -92,7 +96,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-folder-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-folder-standard-flat-field-metadata.util.ts index c697c359a6f..42cd96bf42e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-folder-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-folder-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'messageFolder'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'messageFolder', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -54,7 +55,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +74,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +92,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts index a3d0703a1dc..6939554f8b0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, MessageParticipantRole, RelationOnDeleteAction, @@ -20,7 +21,10 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'messageParticipant', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'messageParticipant'>, FlatFieldMetadata > => ({ @@ -55,7 +59,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -74,7 +78,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -92,7 +96,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts index a5edc99e00d..a9a041ed8bb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildMessageStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'message'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'message', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -54,7 +55,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +74,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +92,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts index 487c998ff71..77f92889056 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -15,10 +19,10 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'messageThread'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'messageThread', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -50,7 +54,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -69,7 +73,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -87,7 +91,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts index 05283d3183f..de35a36163f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -7,6 +11,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_NOTES } from 'src/modules/note/standard-objects/note.workspace-entity'; export const buildNoteStandardFlatFieldMetadatas = ({ now, @@ -15,7 +21,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit, 'context'>): Record< AllStandardObjectFieldName<'note'>, FlatFieldMetadata > => ({ @@ -52,7 +58,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -73,7 +79,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -93,7 +99,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -137,22 +143,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - body: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'body', - type: FieldMetadataType.TEXT, - label: 'Body (deprecated)', - description: 'Note body (deprecated - use bodyV2)', - icon: 'IconFilePencil', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), bodyV2: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -180,6 +170,11 @@ export const buildNoteStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -197,6 +192,12 @@ export const buildNoteStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_NOTES, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts index 101f9901798..7a94f3c02e8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'noteTarget'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'noteTarget', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +57,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +78,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +98,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-opportunity-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-opportunity-standard-flat-field-metadata.util.ts index 0a4428c3dd8..67bf781789a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-opportunity-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-opportunity-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_OPPORTUNITY } from 'src/modules/opportunity/standard-objects/opportunity.workspace-entity'; export const buildOpportunityStandardFlatFieldMetadatas = ({ now, @@ -19,10 +22,10 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'opportunity'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'opportunity', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +59,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +80,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +100,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -218,6 +221,11 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -235,6 +243,12 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_OPPORTUNITY, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts index 73dd5a568e5..d583566d83e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_PERSON } from 'src/modules/person/standard-objects/person.workspace-entity'; export const buildPersonStandardFlatFieldMetadatas = ({ now, @@ -19,10 +22,10 @@ export const buildPersonStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'person'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'person', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +59,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +80,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +100,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -123,22 +126,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - email: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'email', - type: FieldMetadataType.TEXT, - label: 'Email', - description: "Contact's Email (deprecated)", - icon: 'IconMail', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), emails: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -207,22 +194,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - phone: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'phone', - type: FieldMetadataType.TEXT, - label: 'Phone', - description: "Contact's phone number (deprecated)", - icon: 'IconPhone', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), phones: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -304,6 +275,11 @@ export const buildPersonStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -531,6 +507,12 @@ export const buildPersonStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_PERSON, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts index 0492173f408..6e9f27d8bb8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_TASKS } from 'src/modules/task/standard-objects/task.workspace-entity'; export const buildTaskStandardFlatFieldMetadatas = ({ now, @@ -19,7 +22,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit, 'context'>): Record< AllStandardObjectFieldName<'task'>, FlatFieldMetadata > => ({ @@ -56,7 +59,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +80,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +100,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -141,22 +144,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - body: createStandardFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'body', - type: FieldMetadataType.TEXT, - label: 'Body (deprecated)', - description: 'Task body (deprecated - use bodyV2)', - icon: 'IconFilePencil', - isNullable: true, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), bodyV2: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -227,6 +214,11 @@ export const buildTaskStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -244,6 +236,12 @@ export const buildTaskStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_TASKS, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts index 63578cc9061..0e51740b3e5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -19,10 +20,10 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'taskTarget'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'taskTarget', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ // Base fields from BaseWorkspaceEntity id: createStandardFieldFlatMetadata({ objectName, @@ -56,7 +57,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -77,7 +78,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ isUIReadOnly: true, defaultValue: 'now', settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, @@ -97,7 +98,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ isNullable: true, isUIReadOnly: true, settings: { - displayFormat: 'RELATIVE', + displayFormat: DateDisplayFormat.RELATIVE, }, }, standardObjectMetadataRelatedEntityIds, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-timeline-activity-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-timeline-activity-standard-flat-field-metadata.util.ts index 71594702b89..4f31c566292 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-timeline-activity-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-timeline-activity-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -20,7 +21,10 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'timelineActivity', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'timelineActivity'>, FlatFieldMetadata > => ({ @@ -56,7 +60,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -75,7 +79,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -93,7 +97,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts index a466d979c67..772d730fb1b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -20,7 +21,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ dependencyFlatEntityMaps, twentyStandardApplicationId, }: Omit< - CreateStandardFieldArgs<'workflowAutomatedTrigger'>, + CreateStandardFieldArgs<'workflowAutomatedTrigger', FieldMetadataType>, 'context' >): Record< AllStandardObjectFieldName<'workflowAutomatedTrigger'>, @@ -57,7 +58,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -76,7 +77,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -94,7 +95,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts index fd13e917843..989f8a2912b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_WORKFLOW_RUNS } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; export const buildWorkflowRunStandardFlatFieldMetadatas = ({ now, @@ -19,10 +22,10 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'workflowRun'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'workflowRun', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -54,7 +57,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +76,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +94,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -203,6 +206,11 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ description: 'The executor of the workflow', icon: 'IconCreativeCommonsSa', isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -286,6 +294,12 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_WORKFLOW_RUNS, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts index 2d733e13d94..591203b1413 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + DateDisplayFormat, + FieldMetadataType, + RelationType, +} from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; @@ -7,6 +11,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_WORKFLOWS } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity'; export const buildWorkflowStandardFlatFieldMetadatas = ({ now, @@ -15,10 +21,10 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< - AllStandardObjectFieldName<'workflow'>, - FlatFieldMetadata -> => ({ +}: Omit< + CreateStandardFieldArgs<'workflow', FieldMetadataType>, + 'context' +>): Record, FlatFieldMetadata> => ({ id: createStandardFieldFlatMetadata({ objectName, workspaceId, @@ -50,7 +56,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -69,7 +75,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -87,7 +93,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -183,6 +189,11 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ icon: 'IconCreativeCommonsSa', isUIReadOnly: true, isNullable: false, + defaultValue: { + source: "'MANUAL'", + name: "'System'", + workspaceMemberId: null, + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -200,6 +211,12 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_WORKFLOWS, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts index 9673dd7fd08..1010f5d0ad1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, RelationOnDeleteAction, RelationType, @@ -11,6 +12,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ now, @@ -19,7 +22,10 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'workflowVersion', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'workflowVersion'>, FlatFieldMetadata > => ({ @@ -54,7 +60,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -73,7 +79,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -91,7 +97,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -203,6 +209,12 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts index d0f534386b8..b62679d886f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts @@ -1,4 +1,5 @@ import { + DateDisplayFormat, FieldMetadataType, NumberDataType, RelationType, @@ -11,7 +12,11 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { WorkspaceMemberNumberFormatEnum } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; +import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; +import { + SEARCH_FIELDS_FOR_WORKSPACE_MEMBER, + WorkspaceMemberNumberFormatEnum, +} from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ now, @@ -20,7 +25,10 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, twentyStandardApplicationId, -}: Omit, 'context'>): Record< +}: Omit< + CreateStandardFieldArgs<'workspaceMember', FieldMetadataType>, + 'context' +>): Record< AllStandardObjectFieldName<'workspaceMember'>, FlatFieldMetadata > => ({ @@ -55,7 +63,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -74,7 +82,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ isNullable: false, isUIReadOnly: true, defaultValue: 'now', - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -92,7 +100,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ icon: 'IconCalendarMinus', isNullable: true, isUIReadOnly: true, - settings: { displayFormat: 'RELATIVE' }, + settings: { displayFormat: DateDisplayFormat.RELATIVE }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -378,6 +386,12 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, + settings: { + generatedType: 'STORED', + asExpression: getTsVectorColumnExpressionFromFields( + SEARCH_FIELDS_FOR_WORKSPACE_MEMBER, + ), + }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, @@ -450,29 +464,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - authoredAttachments: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - type: FieldMetadataType.RELATION, - morphId: null, - fieldName: 'authoredAttachments', - label: 'Authored attachments', - description: 'Attachments created by the workspace member', - icon: 'IconFileImport', - isSystem: true, - isNullable: false, - targetObjectName: 'attachment', - targetFieldName: 'author', - settings: { - relationType: RelationType.ONE_TO_MANY, - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), connectedAccounts: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts index f924f597bae..192b3d280c5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts @@ -1,7 +1,8 @@ import { + type FieldMetadataDefaultValue, + type FieldMetadataSettings, type FieldMetadataComplexOption, type FieldMetadataDefaultOption, - type FieldMetadataDefaultValueForAnyType, type FieldMetadataType, } from 'twenty-shared/types'; import { v4 } from 'uuid'; @@ -13,12 +14,13 @@ import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty- import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; export type CreateStandardFieldArgs< - O extends AllStandardObjectName = AllStandardObjectName, + O extends AllStandardObjectName, + T extends FieldMetadataType, > = StandardBuilderArgs<'fieldMetadata'> & { objectName: O; context: { fieldName: AllStandardObjectFieldName; - type: Exclude; + type: T; label: string; description: string; icon: string; @@ -26,8 +28,8 @@ export type CreateStandardFieldArgs< isNullable?: boolean; isUnique?: boolean; isUIReadOnly?: boolean; - defaultValue?: FieldMetadataDefaultValueForAnyType; - settings?: Record | null; + defaultValue?: FieldMetadataDefaultValue; + settings?: FieldMetadataSettings; options?: | FieldMetadataDefaultOption[] | FieldMetadataComplexOption[] @@ -37,6 +39,7 @@ export type CreateStandardFieldArgs< export const createStandardFieldFlatMetadata = < O extends AllStandardObjectName, + T extends FieldMetadataType, >({ objectName, workspaceId, @@ -50,14 +53,14 @@ export const createStandardFieldFlatMetadata = < isNullable = true, isUnique = false, isUIReadOnly = false, - defaultValue = null, - settings = null, + defaultValue, + settings, options: fieldOptions = null, }, standardObjectMetadataRelatedEntityIds, twentyStandardApplicationId, now, -}: CreateStandardFieldArgs): FlatFieldMetadata => { +}: CreateStandardFieldArgs): FlatFieldMetadata => { const objectFields = STANDARD_OBJECTS[objectName].fields; const fieldDefinition = objectFields[fieldName as keyof typeof objectFields]; const fieldIds = standardObjectMetadataRelatedEntityIds[objectName].fields; @@ -67,7 +70,7 @@ export const createStandardFieldFlatMetadata = < return { id: fieldIds[fieldName].id, universalIdentifier: fieldDefinition.universalIdentifier, - standardId: null, + standardId: fieldDefinition.universalIdentifier, applicationId: twentyStandardApplicationId, workspaceId, objectMetadataId: standardObjectMetadataRelatedEntityIds[objectName].id, @@ -84,8 +87,8 @@ export const createStandardFieldFlatMetadata = < isUIReadOnly, isLabelSyncedWithName: false, standardOverrides: null, - defaultValue, - settings, + defaultValue: defaultValue ?? null, + settings: settings ?? null, options: fieldOptions?.map((option) => ({ ...option, id: v4() })) ?? null, relationTargetFieldMetadataId: null, relationTargetObjectMetadataId: null, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts index 8457308f543..251cf34ca30 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts @@ -85,7 +85,7 @@ export const createStandardRelationFieldFlatMetadata = < return { id: fieldIds[fieldName as keyof typeof fieldIds].id, universalIdentifier: fieldDefinition.universalIdentifier, - standardId: null, + standardId: fieldDefinition.universalIdentifier, applicationId: twentyStandardApplicationId, workspaceId, objectMetadataId: standardObjectMetadataRelatedEntityIds[objectName].id, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-attachment-standard-flat-index-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-attachment-standard-flat-index-metadata.util.ts index 33ac210125e..503186457f7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-attachment-standard-flat-index-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-attachment-standard-flat-index-metadata.util.ts @@ -16,18 +16,6 @@ export const buildAttachmentStandardFlatIndexMetadatas = ({ AllStandardObjectIndexName<'attachment'>, FlatIndexMetadata > => ({ - authorIdIndex: createStandardIndexFlatMetadata({ - objectName, - workspaceId, - context: { - indexName: 'authorIdIndex', - relatedFieldNames: ['author'], - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), taskIdIndex: createStandardIndexFlatMetadata({ objectName, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-message-channel-message-association-standard-flat-index-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-message-channel-message-association-standard-flat-index-metadata.util.ts index 173e91f0ec1..3eff55568c3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-message-channel-message-association-standard-flat-index-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/compute-message-channel-message-association-standard-flat-index-metadata.util.ts @@ -51,6 +51,7 @@ export const buildMessageChannelMessageAssociationStandardFlatIndexMetadatas = indexName: 'messageChannelIdMessageIdUniqueIndex', relatedFieldNames: ['messageChannel', 'message'], isUnique: true, + indexWhereClause: '"deletedAt" IS NULL', }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-flat-object-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-flat-object-metadata.util.ts index cb6fd6d29e7..f3845053c22 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-flat-object-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-flat-object-metadata.util.ts @@ -203,6 +203,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { icon: 'IconBuildingSkyscraper', isSearchable: true, shortcut: 'C', + duplicateCriteria: [['name'], ['domainNamePrimaryLinkUrl']], labelIdentifierFieldMetadataName: 'name', }, workspaceId, @@ -233,7 +234,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { description: 'A connected account', icon: 'IconAt', isSystem: true, - isAuditLogged: false, labelIdentifierFieldMetadataName: 'handle', }, workspaceId, @@ -470,7 +470,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { icon: 'IconMessage', isSystem: true, isAuditLogged: false, - isUIReadOnly: true, labelIdentifierFieldMetadataName: 'id', }, workspaceId, @@ -498,7 +497,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { icon: 'IconMessage', isSystem: true, isAuditLogged: false, - isUIReadOnly: true, labelIdentifierFieldMetadataName: 'subject', }, workspaceId, @@ -606,6 +604,11 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { icon: 'IconUser', isSearchable: true, shortcut: 'P', + duplicateCriteria: [ + ['nameFirstName', 'nameLastName'], + ['linkedinLinkPrimaryLinkUrl'], + ['emailsPrimaryEmail'], + ], labelIdentifierFieldMetadataName: 'name', }, workspaceId, @@ -690,6 +693,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { 'Aggregated / filtered event to be displayed on the timeline', icon: 'IconTimelineEvent', isSystem: true, + isAuditLogged: false, labelIdentifierFieldMetadataName: 'name', }, workspaceId, @@ -715,7 +719,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { labelPlural: 'Workflows', description: 'A workflow', icon: 'IconSettingsAutomation', - isSearchable: true, shortcut: 'W', labelIdentifierFieldMetadataName: 'name', }, @@ -772,7 +775,9 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { labelPlural: 'Workflow Runs', description: 'A workflow run', icon: 'IconHistoryToggle', - isSearchable: true, + isSystem: true, + isAuditLogged: false, + isUIReadOnly: true, labelIdentifierFieldMetadataName: 'name', }, workspaceId, @@ -802,7 +807,8 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { labelPlural: 'Workflow Versions', description: 'A workflow version', icon: 'IconVersions', - isSearchable: true, + isSystem: true, + isUIReadOnly: true, labelIdentifierFieldMetadataName: 'name', }, workspaceId, @@ -833,6 +839,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { description: 'A workspace member', icon: 'IconUserCircle', isSystem: true, + isSearchable: true, labelIdentifierFieldMetadataName: 'name', }, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts index 0d8fa8fc0ed..05e957fc6dc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts @@ -16,6 +16,7 @@ export type CreateStandardObjectContext = { isAuditLogged?: boolean; isUIReadOnly?: boolean; shortcut?: string | null; + duplicateCriteria?: string[][] | null; labelIdentifierFieldMetadataName: AllStandardObjectFieldName; }; @@ -42,6 +43,7 @@ export const createStandardObjectFlatMetadata = < isAuditLogged = true, isUIReadOnly = false, shortcut = null, + duplicateCriteria = null, labelIdentifierFieldMetadataName, }, workspaceId, @@ -50,7 +52,7 @@ export const createStandardObjectFlatMetadata = < now, }: CreateStandardObjectArgs): FlatObjectMetadata => ({ universalIdentifier, - standardId: null, + standardId: universalIdentifier, applicationId: twentyStandardApplicationId, workspaceId, nameSingular, @@ -68,7 +70,7 @@ export const createStandardObjectFlatMetadata = < isUIReadOnly, isLabelSyncedWithName: false, standardOverrides: null, - duplicateCriteria: null, + duplicateCriteria, shortcut, labelIdentifierFieldMetadataId: standardObjectMetadataRelatedEntityIds[nameSingular].fields[ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util.ts index fd64a58d283..4a3796100fe 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util.ts @@ -54,7 +54,7 @@ export const createStandardRoleFlatMetadata = ({ return { id: v4(), universalIdentifier, - standardId: null, + standardId: universalIdentifier, label, description, icon, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-calendar-event-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-calendar-event-view-fields.util.ts index 2e664c92f9a..016158d9291 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-calendar-event-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-calendar-event-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardCalendarEventViewFields = ( fieldName: 'title', position: 0, isVisible: true, - size: 150, + size: 180, }, }), allCalendarEventsStartsAt: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-company-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-company-view-fields.util.ts index fa9e788984c..fc1aef098db 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-company-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-company-view-fields.util.ts @@ -18,7 +18,7 @@ export const computeStandardCompanyViewFields = ( fieldName: 'name', position: 0, isVisible: true, - size: 150, + size: 180, }, }), allCompaniesDomainName: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-dashboard-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-dashboard-view-fields.util.ts index 518fde46a34..464317f5c88 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-dashboard-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-dashboard-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardDashboardViewFields = ( fieldName: 'title', position: 0, isVisible: true, - size: 210, + size: 200, }, }), allDashboardsCreatedBy: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-thread-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-thread-view-fields.util.ts index 97fabbbe395..42d4b297114 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-thread-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-thread-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardMessageThreadViewFields = ( fieldName: 'messages', position: 0, isVisible: true, - size: 150, + size: 180, }, }), allMessageThreadsCreatedAt: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-view-fields.util.ts index 91dba9a0629..690110e8c69 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-message-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardMessageViewFields = ( fieldName: 'subject', position: 0, isVisible: true, - size: 150, + size: 180, }, }), allMessagesMessageThread: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-run-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-run-view-fields.util.ts index ef712fd6e06..d0918e42a54 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-run-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-run-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardWorkflowRunViewFields = ( fieldName: 'name', position: 0, isVisible: true, - size: 210, + size: 150, }, }), allWorkflowRunsWorkflow: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-view-fields.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-view-fields.util.ts index 5dd294efda3..78be955e239 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-view-fields.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-view-fields.util.ts @@ -17,7 +17,7 @@ export const computeStandardWorkflowViewFields = ( fieldName: 'name', position: 0, isVisible: true, - size: 210, + size: 150, }, }), allWorkflowsStatuses: createStandardViewFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts index 42357d6f67e..d25b0997fee 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts @@ -17,6 +17,7 @@ import { WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY } from 'src/engine/w import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service'; import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type'; import { + FromToAllFlatEntityMaps, WorkspaceMigrationOrchestratorBuildArgs, WorkspaceMigrationOrchestratorFailedResult, } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; @@ -116,7 +117,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { allFlatEntityOperationByMetadataName, workspaceId, }: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<{ - fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps']; + fromToAllFlatEntityMaps: FromToAllFlatEntityMaps; inferDeletionFromMissingEntities: InferDeletionFromMissingEntities; dependencyAllFlatEntityMaps: Partial; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; @@ -130,8 +131,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { workspaceId, }); - const fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps'] = - {}; + const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {}; const inferDeletionFromMissingEntities: InferDeletionFromMissingEntities = {}; const allMetadataNameToCompare = Object.keys( @@ -171,35 +171,12 @@ export class WorkspaceMigrationValidateBuildAndRunService { }; } - public async validateBuildAndRunWorkspaceMigration({ - allFlatEntityOperationByMetadataName: allFlatEntities, - workspaceId, - isSystemBuild = false, - }: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise< - WorkspaceMigrationOrchestratorFailedResult | undefined - > { - const { - fromToAllFlatEntityMaps, - inferDeletionFromMissingEntities, - dependencyAllFlatEntityMaps, - additionalCacheDataMaps, - } = await this.computeFromToAllFlatEntityMapsAndBuildOptions({ - allFlatEntityOperationByMetadataName: allFlatEntities, - workspaceId, - }); - + public async validateBuildAndRunWorkspaceMigrationFromTo( + args: WorkspaceMigrationOrchestratorBuildArgs, + ) { const validateAndBuildResult = await this.workspaceMigrationBuildOrchestratorService - .buildWorkspaceMigration({ - buildOptions: { - isSystemBuild, - inferDeletionFromMissingEntities, - }, - fromToAllFlatEntityMaps, - workspaceId, - dependencyAllFlatEntityMaps, - additionalCacheDataMaps, - }) + .buildWorkspaceMigration(args) .catch((error) => { this.logger.error(error); throw new WorkspaceMigrationV2Exception( @@ -229,4 +206,33 @@ export class WorkspaceMigrationValidateBuildAndRunService { ); }); } + + public async validateBuildAndRunWorkspaceMigration({ + allFlatEntityOperationByMetadataName: allFlatEntities, + workspaceId, + isSystemBuild = false, + }: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise< + WorkspaceMigrationOrchestratorFailedResult | undefined + > { + const { + fromToAllFlatEntityMaps, + inferDeletionFromMissingEntities, + dependencyAllFlatEntityMaps, + additionalCacheDataMaps, + } = await this.computeFromToAllFlatEntityMapsAndBuildOptions({ + allFlatEntityOperationByMetadataName: allFlatEntities, + workspaceId, + }); + + return await this.validateBuildAndRunWorkspaceMigrationFromTo({ + buildOptions: { + isSystemBuild, + inferDeletionFromMissingEntities, + }, + fromToAllFlatEntityMaps, + workspaceId, + dependencyAllFlatEntityMaps, + additionalCacheDataMaps, + }); + } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts index 9150a167ea5..f786c473ded 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts @@ -9,12 +9,14 @@ import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/wo import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type'; import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; +export type FromToAllFlatEntityMaps = { + [P in keyof AllFlatEntityMaps]?: FromTo; +}; + export type WorkspaceMigrationOrchestratorBuildArgs = { workspaceId: string; buildOptions: WorkspaceMigrationBuilderOptions; - fromToAllFlatEntityMaps: { - [P in keyof AllFlatEntityMaps]?: FromTo; - }; + fromToAllFlatEntityMaps: FromToAllFlatEntityMaps; dependencyAllFlatEntityMaps?: Partial; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; }; diff --git a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts index d52f3dc4a01..510543ce1cc 100644 --- a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts +++ b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts @@ -14,6 +14,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; +import { WorkspaceIsDeprecated } from 'src/engine/twenty-orm/decorators/workspace-is-deprecated.decorator'; import { WorkspaceIsFieldUIReadOnly } from 'src/engine/twenty-orm/decorators/workspace-is-field-ui-readonly.decorator'; import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator'; import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator'; @@ -62,7 +63,6 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceIsNullable() fullPath: string | null; - // Deprecated: Use fileCategory instead @WorkspaceField({ standardId: ATTACHMENT_STANDARD_FIELD_IDS.type, type: FieldMetadataType.TEXT, @@ -71,6 +71,7 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { icon: 'IconList', }) @WorkspaceIsNullable() + @WorkspaceIsDeprecated() type: string | null; @WorkspaceField({ @@ -143,7 +144,6 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceIsFieldUIReadOnly() createdBy: ActorMetadata; - // Deprecated: Use createdBy composite field instead @WorkspaceRelation({ standardId: ATTACHMENT_STANDARD_FIELD_IDS.author, type: RelationType.MANY_TO_ONE, @@ -155,6 +155,7 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { onDelete: RelationOnDeleteAction.SET_NULL, }) @WorkspaceIsNullable() + @WorkspaceIsDeprecated() author: Relation | null; @WorkspaceJoinColumn('author') diff --git a/packages/twenty-server/test/integration/graphql/suites/object-generated/attachments.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/object-generated/attachments.integration-spec.ts index 137afc8e70e..6a1c1a99efc 100644 --- a/packages/twenty-server/test/integration/graphql/suites/object-generated/attachments.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/object-generated/attachments.integration-spec.ts @@ -12,12 +12,10 @@ describe('attachmentsResolver (e2e)', () => { node { name fullPath - type id createdAt updatedAt deletedAt - authorId taskId noteId personId @@ -54,7 +52,6 @@ describe('attachmentsResolver (e2e)', () => { expect(attachments).toHaveProperty('name'); expect(attachments).toHaveProperty('fullPath'); - expect(attachments).toHaveProperty('type'); expect(attachments).toHaveProperty('id'); expect(attachments).toHaveProperty('createdAt'); expect(attachments).toHaveProperty('updatedAt'); diff --git a/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts index fe2ff14f8c5..4075dc6ed05 100644 --- a/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts @@ -17,7 +17,7 @@ import { createManyOperationFactory } from 'test/integration/graphql/utils/creat import { createOneOperationFactory } from 'test/integration/graphql/utils/create-one-operation-factory.util'; import { destroyManyOperationFactory } from 'test/integration/graphql/utils/destroy-many-operation-factory.util'; import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; -import { performCreateManyOperation } from 'test/integration/graphql/utils/perform-create-many-operation.utils'; +import { createManyOperation } from 'test/integration/graphql/utils/create-many-operation.util'; import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util'; import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util'; import { type ObjectRecord } from 'twenty-shared/types'; @@ -67,10 +67,12 @@ describe('relation connect in workspace createOne/createMany resolvers (e2e)', }), ); - await performCreateManyOperation('company', 'companies', `id`, [ - company1, - company2, - ]); + await createManyOperation({ + objectMetadataSingularName: 'company', + objectMetadataPluralName: 'companies', + gqlFields: 'id', + data: [company1, company2], + }); }); beforeEach(async () => { diff --git a/packages/twenty-server/test/integration/graphql/suites/search/search-resolver.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/search/search-resolver.integration-spec.ts index 5e8bff8a7bb..38ccd3ce486 100644 --- a/packages/twenty-server/test/integration/graphql/suites/search/search-resolver.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/search/search-resolver.integration-spec.ts @@ -20,7 +20,7 @@ import { TEST_PET_ID_3, TEST_PET_ID_4, } from 'test/integration/constants/test-pet-ids.constants'; -import { performCreateManyOperation } from 'test/integration/graphql/utils/perform-create-many-operation.utils'; +import { createManyOperation } from 'test/integration/graphql/utils/create-many-operation.util'; import { search } from 'test/integration/graphql/utils/search.util'; import { deleteAllRecords } from 'test/integration/utils/delete-all-records'; import { @@ -113,6 +113,7 @@ describe('SearchResolver', () => { const [searchInput1Pet, searchInput2Pet, cafePet, naivePet] = pets; beforeAll(async () => { + // TODO refactor not a good practice, or should at least restore afterwards await deleteAllRecords('person'); await deleteAllRecords('company'); await deleteAllRecords('opportunity'); @@ -124,33 +125,28 @@ describe('SearchResolver', () => { await deleteAllRecords('_pet'); await deleteAllRecords('_surveyResult'); await deleteAllRecords('_rocket'); + /// - try { - await performCreateManyOperation( - 'pet', - 'pets', - OBJECT_MODEL_COMMON_FIELDS, - pets, - ); + await createManyOperation({ + objectMetadataSingularName: 'pet', + objectMetadataPluralName: 'pets', + gqlFields: OBJECT_MODEL_COMMON_FIELDS, + data: pets, + }); - await performCreateManyOperation( - 'person', - 'people', - PERSON_GQL_FIELDS, - persons, - ); + await createManyOperation({ + objectMetadataSingularName: 'person', + objectMetadataPluralName: 'people', + gqlFields: PERSON_GQL_FIELDS, + data: persons, + }); - await performCreateManyOperation( - 'company', - 'companies', - COMPANY_GQL_FIELDS, - companies, - ); - } catch (error) { - // eslint-disable-next-line no-console - console.log(error); - throw new Error('beforeAll failed'); - } + await createManyOperation({ + objectMetadataSingularName: 'company', + objectMetadataPluralName: 'companies', + gqlFields: COMPANY_GQL_FIELDS, + data: companies, + }); }); const testsUseCases: EachTestingContext<{ diff --git a/packages/twenty-server/test/integration/graphql/suites/settings-permissions/granular-settings-permissions.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/settings-permissions/granular-settings-permissions.integration-spec.ts index 396f17f2a22..c5ea8050b9c 100644 --- a/packages/twenty-server/test/integration/graphql/suites/settings-permissions/granular-settings-permissions.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/settings-permissions/granular-settings-permissions.integration-spec.ts @@ -28,6 +28,7 @@ describe('Granular settings permissions', () => { originalMemberRoleId = memberRole.id; // Create a custom role with canUpdateAllSettings = false + // canUpdateAllObjectRecords must be true to allow creating records like workflows const createRoleQuery = { query: ` mutation CreateOneRole { @@ -36,7 +37,7 @@ describe('Granular settings permissions', () => { description: "Role for testing specific setting permissions" canUpdateAllSettings: false canReadAllObjectRecords: true - canUpdateAllObjectRecords: false + canUpdateAllObjectRecords: true canSoftDeleteAllObjectRecords: false canDestroyAllObjectRecords: false }) { diff --git a/packages/twenty-server/test/integration/graphql/utils/create-many-operation.util.ts b/packages/twenty-server/test/integration/graphql/utils/create-many-operation.util.ts new file mode 100644 index 00000000000..1a01313db01 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/utils/create-many-operation.util.ts @@ -0,0 +1,66 @@ +import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util'; +import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; +import { type ObjectRecord } from 'twenty-shared/types'; +import { capitalize } from 'twenty-shared/utils'; +import { v4 } from 'uuid'; + +type CreateManyOperationInput = { + objectMetadataSingularName: string; + objectMetadataPluralName: string; + gqlFields?: string; + data: object[]; + upsert?: boolean; + expectToFail?: boolean; + token?: string; +}; + +export const createManyOperation = async ({ + objectMetadataSingularName, + objectMetadataPluralName, + gqlFields = 'id', + data, + upsert = false, + expectToFail = false, + token, +}: CreateManyOperationInput): CommonResponseBody<{ + createdRecords: ObjectRecord[]; +}> => { + const graphqlOperation = createManyOperationFactory({ + objectMetadataSingularName, + objectMetadataPluralName, + gqlFields, + data: data.map((item) => ({ + id: v4(), + ...item, + })), + upsert, + }); + + const response = await makeGraphqlAPIRequest(graphqlOperation, token); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'Create many operation should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'Create many operation failed but should not have', + }); + } + + return { + data: { + createdRecords: + response.body.data?.[`create${capitalize(objectMetadataPluralName)}`] ?? + [], + }, + errors: response.body.errors, + }; +}; diff --git a/packages/twenty-server/test/integration/graphql/utils/perform-create-many-operation.utils.ts b/packages/twenty-server/test/integration/graphql/utils/perform-create-many-operation.utils.ts deleted file mode 100644 index 625ad036130..00000000000 --- a/packages/twenty-server/test/integration/graphql/utils/perform-create-many-operation.utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util'; -import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; -import { capitalize } from 'twenty-shared/utils'; -import { v4 } from 'uuid'; - -export const performCreateManyOperation = async ( - objectMetadataSingularName: string, - objectMetadataPluralName: string, - gqlFields: string, - data: object[], -) => { - const response = await makeGraphqlAPIRequest( - createManyOperationFactory({ - objectMetadataSingularName, - objectMetadataPluralName, - gqlFields, - data: data.map((item) => ({ - id: v4(), - ...item, - })), - }), - ); - - return response.body.data[`create${capitalize(objectMetadataPluralName)}`]; -}; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/successful-update-one-standard-field-metadata.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/successful-update-one-standard-field-metadata.integration-spec.ts index e0871497d51..7eca2ec2711 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/successful-update-one-standard-field-metadata.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/successful-update-one-standard-field-metadata.integration-spec.ts @@ -190,25 +190,23 @@ describe('Standard field metadata update should succeed', () => { ); }); - it.failing( - 'Should deactivate and reactivate standard field successfully', - async () => { - const deletedAtField = opportunityObjectFields.find( - (field) => field.name === 'deletedAt', - ); + it('Should deactivate and reactivate standard field successfully', async () => { + const deletedAtField = opportunityObjectFields.find( + (field) => field.name === 'deletedAt', + ); - jestExpectToBeDefined(deletedAtField); - expect(deletedAtField.isActive).toBe(true); + jestExpectToBeDefined(deletedAtField); + expect(deletedAtField.isActive).toBe(true); - const { data: firstUpdateData } = await updateOneFieldMetadata({ - input: { - idToUpdate: deletedAtField.id, - updatePayload: { - isActive: false, - }, + const { data: firstUpdateData } = await updateOneFieldMetadata({ + input: { + idToUpdate: deletedAtField.id, + updatePayload: { + isActive: false, }, - expectToFail: false, - gqlFields: ` + }, + expectToFail: false, + gqlFields: ` id name label @@ -224,19 +222,19 @@ describe('Standard field metadata update should succeed', () => { icon } `, - }); + }); - expect(firstUpdateData.updateOneField.isActive).toBe(false); + expect(firstUpdateData.updateOneField.isActive).toBe(false); - const { data: secondUpdateData } = await updateOneFieldMetadata({ - input: { - idToUpdate: deletedAtField.id, - updatePayload: { - isActive: true, - }, + const { data: secondUpdateData } = await updateOneFieldMetadata({ + input: { + idToUpdate: deletedAtField.id, + updatePayload: { + isActive: true, }, - expectToFail: false, - gqlFields: ` + }, + expectToFail: false, + gqlFields: ` id name label @@ -252,11 +250,10 @@ describe('Standard field metadata update should succeed', () => { icon } `, - }); + }); - expect(secondUpdateData.updateOneField.isActive).toBe(true); - }, - ); + expect(secondUpdateData.updateOneField.isActive).toBe(true); + }); }); describe('Standard field isUnique update should succeed', () => { diff --git a/packages/twenty-server/test/integration/utils/delete-all-records.ts b/packages/twenty-server/test/integration/utils/delete-all-records.ts index f03a1670e38..c0dc1588696 100644 --- a/packages/twenty-server/test/integration/utils/delete-all-records.ts +++ b/packages/twenty-server/test/integration/utils/delete-all-records.ts @@ -1,11 +1,7 @@ const TEST_SCHEMA_NAME = 'workspace_1wgvd1injqtife6y4rvfbu3h5'; export const deleteAllRecords = async (objectNameSingular: string) => { - try { - await global.testDataSource.query( - `DELETE from "${TEST_SCHEMA_NAME}"."${objectNameSingular}"`, - ); - } catch { - /* empty */ - } + await global.testDataSource.query( + `DELETE from "${TEST_SCHEMA_NAME}"."${objectNameSingular}"`, + ); };