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 8cd9a1353a..d947e85732 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 cf2eb48536..18766f6bff 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 5d389fa32b..883b0f0c44 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 3243262f7c..f49cc3705c 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 6fe6c2b837..939d37c5fc 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 1add97c55b..68b1b429af 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 0000000000..f58b0ba469 --- /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 78deec93c6..6c3fa3aa7c 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 97b8092463..9fab2822c4 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 7b596fa483..f64625a37d 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 af3fe6a479..0a06b6b4da 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 5bff6ac8b0..afacd5c53c 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 48014739bc..d5c8b6abdb 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 e406660736..f6d879830e 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 0000000000..2fe2ebfea5 --- /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 0000000000..09ef82daf9 --- /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 0000000000..be1aa403c1 --- /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 f210180210..ed40a9050e 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 ae059aa6a8..9394a13a9c 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 35a2119f8b..afd85b67f9 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 02c7a76b66..f497a6d450 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 23a8b76c60..046201c73d 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 7639b61baf..8773532b7e 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 7003175993..d2c2d80bec 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 5f48874993..9b305d079f 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 6468addb3c..df488b7b50 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 c0272582f4..139f6182cd 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 cb763ae9d6..3f09e6ec76 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 8a004dd948..4dc7a2bebf 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 a757f4a3e2..8ec1990ca1 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 085a4b4897..47b610130c 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 07a0d6b336..1750b19ece 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 8cefdf2129..842e3f1f61 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 c697c359a6..42cd96bf42 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 a3d0703a1d..6939554f8b 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 a5edc99e00..a9a041ed8b 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 487c998ff7..77f9288905 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 05283d3183..de35a36163 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 101f990179..7a94f3c02e 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 0a4428c3dd..67bf781789 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 73dd5a568e..d583566d83 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 0492173f40..6e9f27d8bb 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 63578cc906..0e51740b3e 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 71594702b8..4f31c56629 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 a466d979c6..772d730fb1 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 fd13e91784..989f8a2912 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 2d733e13d9..591203b141 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 9673dd7fd0..1010f5d0ad 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 d0f534386b..b62679d886 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 f924f597ba..192b3d280c 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 8457308f54..251cf34ca3 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 33ac210125..503186457f 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 173e91f0ec..3eff55568c 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 cb6fd6d29e..f3845053c2 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 0d8fa8fc0e..05e957fc6d 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 fd64a58d28..4a3796100f 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 2e664c92f9..016158d929 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 fa9e788984..fc1aef098d 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 518fde46a3..464317f5c8 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 97fabbbe39..42d4b29711 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 91dba9a062..690110e8c6 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 ef712fd6e0..d0918e42a5 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 5dd294efda..78be955e23 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 42357d6f67..d25b0997fe 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 9150a167ea..f786c473de 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 d52f3dc4a0..510543ce1c 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 137afc8e70..6a1c1a99ef 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 fe2ff14f8c..4075dc6ed0 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 5e8bff8a7b..38ccd3ce48 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 396f17f2a2..c5ea8050b9 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 0000000000..1a01313db0 --- /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 625ad03613..0000000000 --- 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 e0871497d5..7eca2ec271 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 f03a1670e3..c0dc158869 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}"`, + ); };