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

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