diff --git a/.github/workflows/ci-server.yaml b/.github/workflows/ci-server.yaml index dd4e088be4c..bd62bb0dc53 100644 --- a/.github/workflows/ci-server.yaml +++ b/.github/workflows/ci-server.yaml @@ -171,7 +171,7 @@ jobs: strategy: fail-fast: false matrix: - shard: [1, 2, 3, 4, 5] + shard: [1, 2, 3, 4, 5, 6] services: postgres: image: twentycrm/twenty-postgres-spilo @@ -209,7 +209,7 @@ jobs: ANALYTICS_ENABLED: true CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty" CLICKHOUSE_PASSWORD: clickhousePassword - SHARD_COUNTER: 5 + SHARD_COUNTER: 6 steps: - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 diff --git a/packages/twenty-server/project.json b/packages/twenty-server/project.json index 3ccf96bc992..84eb0a48057 100644 --- a/packages/twenty-server/project.json +++ b/packages/twenty-server/project.json @@ -19,7 +19,7 @@ "options": { "cwd": "packages/twenty-server", "commands": [ - "NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" nx jest --config ./jest-integration.config.ts" + "NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=12288\" nx jest --config ./jest-integration.config.ts" ] }, "parallel": false, @@ -27,7 +27,7 @@ "with-db-reset": { "cwd": "packages/twenty-server", "commands": [ - "NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" nx database:reset > reset-logs.log && NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" nx jest --config ./jest-integration.config.ts" + "NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=12288\" nx database:reset > reset-logs.log && NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=12288\" nx jest --config ./jest-integration.config.ts" ] } } diff --git a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts b/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts index 345173f64e2..30ea6d367c9 100644 --- a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts +++ b/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts @@ -78,6 +78,14 @@ export class ComputeTwentyStandardWorkspaceMigrationCommand extends CommandRunne from: createEmptyFlatEntityMaps(), to: twentyStandardAllFlatEntityMaps.flatViewMaps, }, + flatAgentMaps: { + from: createEmptyFlatEntityMaps(), + to: twentyStandardAllFlatEntityMaps.flatAgentMaps, + }, + flatRoleMaps: { + from: createEmptyFlatEntityMaps(), + to: twentyStandardAllFlatEntityMaps.flatRoleMaps, + }, }, workspaceId, }) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-delete-removed-agents.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-delete-removed-agents.command.ts new file mode 100644 index 00000000000..6d0a8053356 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-delete-removed-agents.command.ts @@ -0,0 +1,141 @@ +import { InjectRepository } from '@nestjs/typeorm'; + +import { Command } from 'nest-commander'; +import { isDefined } from 'twenty-shared/utils'; +import { type Repository } from 'typeorm'; + +import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; +import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; +import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { AgentService } from 'src/engine/metadata-modules/ai/ai-agent/agent.service'; +import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; +import { FlatAgentMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-agent-maps.type'; +import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; +import { RoleService } from 'src/engine/metadata-modules/role/role.service'; +import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; +import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; + +const REMOVED_AGENT_STANDARD_IDS = [ + '20202020-0002-0001-0001-000000000006', // dashboard-builder + '20202020-0002-0001-0001-000000000003', // data-manipulator + '20202020-0002-0001-0001-000000000007', // metadata-builder + '20202020-0002-0001-0001-000000000005', // researcher + '20202020-0002-0001-0001-000000000001', // workflow-builder +]; + +const REMOVED_ROLE_STANDARD_IDS = [ + '20202020-0001-0001-0001-000000000002', // workflow-manager + '20202020-0001-0001-0001-000000000004', // data-manipulator + '20202020-0001-0001-0001-000000000005', // dashboard-manager + '20202020-0001-0001-0001-000000000006', // data-model-manager +]; + +@Command({ + name: 'upgrade:1-14:delete-removed-agents', + description: 'Delete agents and roles that were removed from the codebase', +}) +export class DeleteRemovedAgentsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { + constructor( + @InjectRepository(WorkspaceEntity) + protected readonly workspaceRepository: Repository, + protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, + protected readonly dataSourceService: DataSourceService, + private readonly workspaceCacheService: WorkspaceCacheService, + private readonly agentService: AgentService, + private readonly roleService: RoleService, + ) { + super(workspaceRepository, twentyORMGlobalManager, dataSourceService); + } + + override async runOnWorkspace({ + options, + workspaceId, + }: RunOnWorkspaceArgs): Promise { + const isDryRun = options.dryRun || false; + + const { flatAgentMaps, flatRoleMaps } = + await this.workspaceCacheService.getOrRecompute(workspaceId, [ + 'flatAgentMaps', + 'flatRoleMaps', + ]); + + await this.deleteRemovedAgents({ flatAgentMaps, workspaceId, isDryRun }); + await this.deleteRemovedRoles({ flatRoleMaps, workspaceId, isDryRun }); + } + + private async deleteRemovedAgents({ + flatAgentMaps, + workspaceId, + isDryRun, + }: { + flatAgentMaps: FlatAgentMaps; + workspaceId: string; + isDryRun: boolean; + }): Promise { + const allAgents = Object.values(flatAgentMaps.byId).filter(isDefined); + + const agentsToDelete = allAgents.filter((agent) => + REMOVED_AGENT_STANDARD_IDS.includes(agent.standardId ?? ''), + ); + + const agentNames = agentsToDelete.map((agent) => agent.name).join(', '); + + this.logger.log( + `DRY RUN: Would delete ${agentsToDelete.length} removed agent(s): ${agentNames}`, + ); + + if (agentsToDelete.length === 0 || isDryRun) { + return; + } + + const agentIds = agentsToDelete.map((agent) => agent.id); + + await this.agentService.deleteManyAgents({ + ids: agentIds, + workspaceId, + isSystemBuild: true, + }); + + this.logger.log( + `Deleted ${agentsToDelete.length} removed agent(s): ${agentNames}`, + ); + } + + private async deleteRemovedRoles({ + flatRoleMaps, + workspaceId, + isDryRun, + }: { + flatRoleMaps: MetadataFlatEntityMaps<'role'>; + workspaceId: string; + isDryRun: boolean; + }): Promise { + const allRoles = Object.values(flatRoleMaps.byId).filter(isDefined); + + const rolesToDelete = allRoles.filter((role) => + REMOVED_ROLE_STANDARD_IDS.includes(role.standardId ?? ''), + ); + + const roleLabels = rolesToDelete.map((role) => role.label).join(', '); + + this.logger.log( + `DRY RUN: Would delete ${rolesToDelete.length} removed role(s): ${roleLabels}`, + ); + + if (rolesToDelete.length === 0 || isDryRun) { + return; + } + + const roleIds = rolesToDelete.map((role) => role.id); + + await this.roleService.deleteManyRoles({ + ids: roleIds, + workspaceId, + isSystemBuild: true, + }); + + this.logger.log( + `Deleted ${rolesToDelete.length} removed role(s): ${roleLabels}`, + ); + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module.ts index 5aac1e3ad25..e0b71cfa923 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module.ts @@ -1,18 +1,25 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { DeleteRemovedAgentsCommand } from 'src/database/commands/upgrade-version-command/1-14/1-14-delete-removed-agents.command'; import { UpdateCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/1-14/1-14-update-created-by-enum.command'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { AiAgentModule } from 'src/engine/metadata-modules/ai/ai-agent/ai-agent.module'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; +import { RoleModule } from 'src/engine/metadata-modules/role/role.module'; import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; +import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; @Module({ imports: [ TypeOrmModule.forFeature([WorkspaceEntity]), DataSourceModule, + AiAgentModule, + RoleModule, WorkspaceSchemaManagerModule, + WorkspaceCacheModule, ], - providers: [UpdateCreatedByEnumCommand], - exports: [UpdateCreatedByEnumCommand], + providers: [UpdateCreatedByEnumCommand, DeleteRemovedAgentsCommand], + exports: [DeleteRemovedAgentsCommand, UpdateCreatedByEnumCommand], }) export class V1_14_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts index b111fd7c119..34b83c0ce47 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { V1_13_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module'; +import { V1_14_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module'; import { UpgradeCommand } from 'src/database/commands/upgrade-version-command/upgrade.command'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { V1_14_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-14/1-14-upgrade-version-command.module'; @Module({ imports: [ diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts index 1c3c25683f1..e2e15d3f873 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts @@ -16,11 +16,12 @@ import { MigrateStandardInvalidEntitiesCommand } from 'src/database/commands/upg import { MigrateTimelineActivityToMorphRelationsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-timeline-activity-to-morph-relations.command'; import { RenameIndexNameCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command'; import { UpdateRoleTargetsUniqueConstraintMigrationCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-update-role-targets-unique-constraint-migration.command'; +import { DeleteRemovedAgentsCommand } from 'src/database/commands/upgrade-version-command/1-14/1-14-delete-removed-agents.command'; +import { UpdateCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/1-14/1-14-update-created-by-enum.command'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { UpdateCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/1-14/1-14-update-created-by-enum.command'; @Command({ name: 'upgrade', @@ -47,6 +48,7 @@ export class UpgradeCommand extends UpgradeCommandRunner { // 1.14 Commands protected readonly updateCreatedByEnumCommand: UpdateCreatedByEnumCommand, + protected readonly deleteRemovedAgentsCommand: DeleteRemovedAgentsCommand, ) { super( workspaceRepository, @@ -68,7 +70,10 @@ export class UpgradeCommand extends UpgradeCommandRunner { this.renameIndexNameCommand, ]; - const commands_1140: VersionCommands = [this.updateCreatedByEnumCommand]; + const commands_1140: VersionCommands = [ + this.updateCreatedByEnumCommand, + this.deleteRemovedAgentsCommand, + ]; this.allCommands = { '1.12.0': commands_1120, diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts index 65941b057c6..0b0b375210e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts @@ -251,27 +251,58 @@ export class AgentService { id: string, workspaceId: string, ): Promise { - const { - flatAgentMaps: existingFlatAgentMaps, - flatRoleTargetByAgentIdMaps, - } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ - 'flatAgentMaps', - 'flatRoleTargetByAgentIdMaps', - ]); - - const agentToDelete = findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: id, - flatEntityMaps: existingFlatAgentMaps, + const deletedAgents = await this.deleteManyAgents({ + ids: [id], + workspaceId, }); - if (!isDefined(agentToDelete)) { + if (deletedAgents.length !== 1) { throw new AgentException( - `Agent not found`, + 'Could not retrieve deleted agent', AgentExceptionCode.AGENT_NOT_FOUND, ); } - const roleId = flatRoleTargetByAgentIdMaps[agentToDelete.id]?.roleId; + const [deletedAgent] = deletedAgents; + + return deletedAgent; + } + + async deleteManyAgents({ + ids, + workspaceId, + isSystemBuild = false, + }: { + ids: string[]; + workspaceId: string; + isSystemBuild?: boolean; + }): Promise { + if (ids.length === 0) { + return []; + } + + const { flatAgentMaps, flatRoleTargetByAgentIdMaps } = + await this.workspaceCacheService.getOrRecompute(workspaceId, [ + 'flatAgentMaps', + 'flatRoleTargetByAgentIdMaps', + ]); + + const agentsToDelete = ids + .map((id) => + findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: id, + flatEntityMaps: flatAgentMaps, + }), + ) + .filter(isDefined); + + if (agentsToDelete.length === 0) { + return []; + } + + const roleTargetsToDelete = agentsToDelete + .map((agent) => flatRoleTargetByAgentIdMaps[agent.id]) + .filter(isDefined); const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( @@ -279,26 +310,31 @@ export class AgentService { allFlatEntityOperationByMetadataName: { agent: { flatEntityToCreate: [], - flatEntityToDelete: [agentToDelete], + flatEntityToDelete: agentsToDelete, + flatEntityToUpdate: [], + }, + roleTarget: { + flatEntityToCreate: [], + flatEntityToDelete: roleTargetsToDelete, flatEntityToUpdate: [], }, }, workspaceId, - isSystemBuild: false, + isSystemBuild, }, ); if (isDefined(validateAndBuildResult)) { throw new WorkspaceMigrationBuilderExceptionV2( validateAndBuildResult, - 'Multiple validation errors occurred while deleting agent', + `Multiple validation errors occurred while deleting agent${ids.length > 1 ? 's' : ''}`, ); } - return { - ...agentToDelete, - roleId: roleId ?? null, - }; + return agentsToDelete.map((agent) => ({ + ...agent, + roleId: flatRoleTargetByAgentIdMaps[agent.id]?.roleId ?? null, + })); } async searchAgents( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts index aa08a4140ca..eb0d45831a7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts @@ -52,8 +52,11 @@ export const ALL_METADATA_REQUIRED_METADATA_FOR_VALIDATION = { role: {}, roleTarget: { role: true, + agent: true, + }, + agent: { + role: true, }, - agent: {}, pageLayout: {}, pageLayoutTab: { pageLayout: true, 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 46ca384129b..78deec93c68 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,6 +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 { 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'; @@ -25,7 +26,6 @@ import { fromFlatRoleToRoleDto } from 'src/engine/metadata-modules/role/utils/fr import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role.service'; 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 { getFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util'; @Injectable() export class RoleService { @@ -214,6 +214,38 @@ export class RoleService { roleId: string; workspaceId: string; }): Promise { + const deletedRoles = await this.deleteManyRoles({ + ids: [roleId], + workspaceId, + isSystemBuild: false, + }); + + const [deletedRole] = deletedRoles; + + return deletedRole; + } + + public async deleteManyRoles({ + ids, + workspaceId, + isSystemBuild = false, + }: { + ids: string[]; + workspaceId: string; + isSystemBuild?: boolean; + }): Promise { + if (ids.length === 0) { + return []; + } + + const { flatRoleMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: ['flatRoleMaps'], + }, + ); + const workspace = await this.workspaceRepository.findOne({ where: { id: workspaceId, @@ -232,58 +264,56 @@ export class RoleService { ); } - if (defaultRoleId === roleId) { - throw new PermissionsException( - PermissionsExceptionMessage.DEFAULT_ROLE_CANNOT_BE_DELETED, - PermissionsExceptionCode.DEFAULT_ROLE_CANNOT_BE_DELETED, - { - userFriendlyMessage: msg`The default role cannot be deleted as it is required for the workspace to function properly.`, - }, - ); + const rolesToDelete = []; + + for (const roleId of ids) { + const flatRoleToDelete = fromDeleteRoleInputToFlatRoleOrThrow({ + flatRoleMaps, + roleId, + }); + + if (defaultRoleId === roleId) { + throw new PermissionsException( + PermissionsExceptionMessage.DEFAULT_ROLE_CANNOT_BE_DELETED, + PermissionsExceptionCode.DEFAULT_ROLE_CANNOT_BE_DELETED, + { + userFriendlyMessage: msg`The default role cannot be deleted as it is required for the workspace to function properly.`, + }, + ); + } + + await this.assignDefaultRoleToMembersWithRoleToDelete({ + roleId, + workspaceId, + defaultRoleId, + }); + + rolesToDelete.push(flatRoleToDelete); } - await this.assignDefaultRoleToMembersWithRoleToDelete({ - roleId, - workspaceId, - defaultRoleId, - }); - - const { flatRoleMaps: existingFlatRoleMaps } = - await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( - { - workspaceId, - flatMapsKeys: ['flatRoleMaps'], - }, - ); - - const flatRoleToDelete = fromDeleteRoleInputToFlatRoleOrThrow({ - flatRoleMaps: existingFlatRoleMaps, - roleId, - }); - const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { allFlatEntityOperationByMetadataName: { role: { flatEntityToCreate: [], - flatEntityToDelete: [flatRoleToDelete], + flatEntityToDelete: rolesToDelete, flatEntityToUpdate: [], }, }, workspaceId, - isSystemBuild: false, + isSystemBuild, }, ); if (isDefined(validateAndBuildResult)) { throw new WorkspaceMigrationBuilderExceptionV2( validateAndBuildResult, - 'Multiple validation errors occurred while deleting role', + `Multiple validation errors occurred while deleting role${ids.length > 1 ? 's' : ''}`, ); } - return fromFlatRoleToRoleDto(flatRoleToDelete); + return rolesToDelete.map(fromFlatRoleToRoleDto); } public async createMemberRole({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-agent.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-agent.constant.ts new file mode 100644 index 00000000000..ae88be85304 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-agent.constant.ts @@ -0,0 +1,12 @@ +import { HELPER_AGENT } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-agents/agents/helper-agent'; + +export const STANDARD_AGENT = { + helper: { + universalIdentifier: HELPER_AGENT.standardId, + }, +} as const satisfies Record< + string, + { + universalIdentifier: string; + } +>; 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 51bc92351d2..e4066607365 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 @@ -56,7 +56,6 @@ export const STANDARD_OBJECTS = { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.createdBy, }, author: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.author }, - activity: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.activity }, task: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.task }, note: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.note }, person: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.person }, @@ -68,7 +67,6 @@ export const STANDARD_OBJECTS = { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.dashboard, }, workflow: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.workflow }, - custom: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.custom }, }, indexes: { authorIdIndex: { @@ -629,7 +627,6 @@ 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 }, - custom: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.custom }, favoriteFolder: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.favoriteFolder, }, @@ -1098,7 +1095,6 @@ export const STANDARD_OBJECTS = { opportunity: { universalIdentifier: NOTE_TARGET_STANDARD_FIELD_IDS.opportunity, }, - custom: { universalIdentifier: NOTE_TARGET_STANDARD_FIELD_IDS.custom }, }, indexes: { noteIdIndex: { @@ -1514,7 +1510,6 @@ export const STANDARD_OBJECTS = { opportunity: { universalIdentifier: TASK_TARGET_STANDARD_FIELD_IDS.opportunity, }, - custom: { universalIdentifier: TASK_TARGET_STANDARD_FIELD_IDS.custom }, }, indexes: { taskIdIndex: { @@ -1587,9 +1582,6 @@ export const STANDARD_OBJECTS = { universalIdentifier: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetDashboard, }, - targetCustom: { - universalIdentifier: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetCustom, - }, linkedRecordCachedName: { universalIdentifier: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.linkedRecordCachedName, @@ -1679,9 +1671,6 @@ export const STANDARD_OBJECTS = { position: { universalIdentifier: WORKFLOW_STANDARD_FIELD_IDS.position }, versions: { universalIdentifier: WORKFLOW_STANDARD_FIELD_IDS.versions }, runs: { universalIdentifier: WORKFLOW_STANDARD_FIELD_IDS.runs }, - eventListeners: { - universalIdentifier: WORKFLOW_STANDARD_FIELD_IDS.eventListeners, - }, automatedTriggers: { universalIdentifier: WORKFLOW_STANDARD_FIELD_IDS.automatedTriggers, }, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant.ts new file mode 100644 index 00000000000..9aff5ff41fe --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant.ts @@ -0,0 +1,5 @@ +import { ADMIN_ROLE } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/admin-role'; + +export const STANDARD_ROLE = { + admin: { universalIdentifier: ADMIN_ROLE.standardId }, +} as const satisfies Record; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-agent-name.type.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-agent-name.type.ts new file mode 100644 index 00000000000..f3cd7292a5c --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-agent-name.type.ts @@ -0,0 +1,3 @@ +import { type STANDARD_AGENT } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-agent.constant'; + +export type AllStandardAgentName = keyof typeof STANDARD_AGENT; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-role-name.type.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-role-name.type.ts new file mode 100644 index 00000000000..319e21bcf9f --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/types/all-standard-role-name.type.ts @@ -0,0 +1,3 @@ +import { type STANDARD_ROLE } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant'; + +export type AllStandardRoleName = keyof typeof STANDARD_ROLE; 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 debe93cc69b..f210180210e 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 @@ -9,4 +9,6 @@ export type TwentyStandardAllFlatEntityMaps = Pick< | 'flatViewFilterMaps' | 'flatViewGroupMaps' | 'flatViewMaps' + | 'flatRoleMaps' + | 'flatAgentMaps' >; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/build-standard-flat-agent-metadata-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/build-standard-flat-agent-metadata-maps.util.ts new file mode 100644 index 00000000000..0035dc84f7f --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/build-standard-flat-agent-metadata-maps.util.ts @@ -0,0 +1,25 @@ +import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; +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'; +import { type CreateStandardAgentArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util'; +import { STANDARD_FLAT_AGENT_METADATA_BUILDERS_BY_AGENT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-flat-agent-metadata.util'; + +export const buildStandardFlatAgentMetadataMaps = ( + args: Omit, +): FlatEntityMaps => { + const allAgentMetadatas: FlatAgent[] = Object.values( + STANDARD_FLAT_AGENT_METADATA_BUILDERS_BY_AGENT_NAME, + ).map((builder) => builder(args)); + + let flatAgentMetadataMaps = createEmptyFlatEntityMaps(); + + for (const agentMetadata of allAgentMetadatas) { + flatAgentMetadataMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: agentMetadata, + flatEntityMaps: flatAgentMetadataMaps, + }); + } + + return flatAgentMetadataMaps; +}; 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 new file mode 100644 index 00000000000..ae059aa6a89 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util.ts @@ -0,0 +1,69 @@ +import { v4 } from 'uuid'; + +import { type AgentResponseFormat } from 'src/engine/metadata-modules/ai/ai-agent/types/agent-response-format.type'; +import { type ModelConfiguration } from 'src/engine/metadata-modules/ai/ai-agent/types/modelConfiguration'; +import { type ModelId } from 'src/engine/metadata-modules/ai/ai-models/constants/ai-models.const'; +import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; +import { STANDARD_AGENT } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-agent.constant'; +import { type AllStandardAgentName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-agent-name.type'; +import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; + +export type CreateStandardAgentContext = { + agentName: AllStandardAgentName; + name: string; + label: string; + icon: string | null; + description: string | null; + prompt: string; + modelId: ModelId; + responseFormat: AgentResponseFormat; + isCustom: boolean; + modelConfiguration: ModelConfiguration | null; + evaluationInputs: string[]; +}; + +export type CreateStandardAgentArgs = StandardBuilderArgs<'agent'> & { + context: CreateStandardAgentContext; +}; + +export const createStandardAgentFlatMetadata = ({ + context: { + agentName, + name, + label, + icon, + description, + prompt, + modelId, + responseFormat, + isCustom, + modelConfiguration, + evaluationInputs, + }, + workspaceId, + twentyStandardApplicationId, + now, +}: CreateStandardAgentArgs): FlatAgent => { + const universalIdentifier = STANDARD_AGENT[agentName].universalIdentifier; + + return { + id: v4(), + universalIdentifier, + standardId: null, + name, + label, + icon, + description, + prompt, + modelId, + responseFormat, + isCustom, + modelConfiguration, + evaluationInputs, + workspaceId, + applicationId: twentyStandardApplicationId, + createdAt: now, + updatedAt: now, + deletedAt: null, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-flat-agent-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-flat-agent-metadata.util.ts new file mode 100644 index 00000000000..4e5900b0f9e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-flat-agent-metadata.util.ts @@ -0,0 +1,54 @@ +import { DEFAULT_SMART_MODEL } from 'src/engine/metadata-modules/ai/ai-models/constants/ai-models.const'; +import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; +import { type AllStandardAgentName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-agent-name.type'; +import { + type CreateStandardAgentArgs, + createStandardAgentFlatMetadata, +} from 'src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/create-standard-agent-flat-metadata.util'; + +export const STANDARD_FLAT_AGENT_METADATA_BUILDERS_BY_AGENT_NAME = { + helper: (args: Omit) => + createStandardAgentFlatMetadata({ + ...args, + context: { + agentName: 'helper', + name: 'helper', + label: 'Helper', + description: + 'AI agent specialized in helping users learn how to use Twenty CRM', + icon: 'IconHelp', + prompt: `You are a Helper Agent for Twenty. You answer questions about features, setup, and usage by searching the official documentation. + +Core workflow: +1. Use search_help_center tool to find relevant documentation +2. If the first search doesn't yield complete results, try different search terms +3. Synthesize information from multiple articles when needed +4. Provide clear, step-by-step answers based on the documentation +5. Be honest if the docs don't cover the topic + +When to search: +- "How to" questions +- Feature explanations +- Setup and configuration help +- Troubleshooting issues +- Best practices + +Response format: +- Summarize key information from the documentation +- Break down complex topics into clear steps +- Include important notes or prerequisites +- Use markdown for readability + +Always base answers on official Twenty documentation. Be patient and helpful.`, + modelId: DEFAULT_SMART_MODEL, + responseFormat: { type: 'text' }, + isCustom: false, + modelConfiguration: {}, + evaluationInputs: [], + }, + }), +} satisfies { + [P in AllStandardAgentName]: ( + args: Omit, + ) => FlatAgent; +}; 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 371f9143a91..02c7a76b661 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 @@ -220,6 +220,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'author', label: 'Author', description: 'Attachment author (deprecated - use createdBy)', @@ -238,33 +240,12 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - activity: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'activity', - label: 'Activity', - description: 'Attachment activity', - icon: 'IconNotes', - isNullable: true, - // Activity is deprecated, pointing to a non-existent target - targetObjectName: 'note', - targetFieldName: 'attachments', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.SET_NULL, - joinColumnName: 'activityId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), task: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'task', label: 'Task', description: 'Attachment task', @@ -287,6 +268,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'note', label: 'Note', description: 'Attachment note', @@ -309,6 +292,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'Attachment person', @@ -331,6 +316,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: 'Attachment company', @@ -353,6 +340,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'opportunity', label: 'Opportunity', description: 'Attachment opportunity', @@ -375,6 +364,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'dashboard', label: 'Dashboard', description: 'Attachment dashboard', @@ -397,6 +388,8 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflow', label: 'Workflow', description: 'Attachment workflow', @@ -415,27 +408,4 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - custom: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'custom', - label: 'Custom', - description: 'Attachment custom object', - icon: 'IconBuildingSkyscraper', - isNullable: true, - // Custom is a dynamic relation, pointing to custom objects - targetObjectName: 'note', - targetFieldName: 'attachments', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.CASCADE, - joinColumnName: 'customId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), }); 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 58e4d8fdf20..23a8b76c60a 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 @@ -129,6 +129,8 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workspaceMember', label: 'WorkspaceMember', description: 'WorkspaceMember', 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 5949c7b19ad..7639b61baf0 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 @@ -137,6 +137,8 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarChannel', label: 'Channel ID', description: 'Channel ID', @@ -159,6 +161,8 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarEvent', label: 'Event ID', description: 'Event ID', 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 2cc7a2481d0..70031759935 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 @@ -383,6 +383,8 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'connectedAccount', label: 'Connected Account', description: 'Connected Account', @@ -405,6 +407,8 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarChannelEventAssociations', label: 'Calendar Channel Event Associations', description: 'Calendar Channel Event Associations', 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 23a64b6740c..5f48874993e 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 @@ -187,6 +187,8 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarEvent', label: 'Event ID', description: 'Event ID', @@ -209,6 +211,8 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'Person', @@ -231,6 +235,8 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workspaceMember', label: 'Workspace Member', description: 'Workspace Member', 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 a5937a9fcd5..6468addb3cd 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 @@ -292,6 +292,8 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarChannelEventAssociations', label: 'Calendar Channel Event Associations', description: 'Calendar Channel Event Associations', @@ -312,6 +314,8 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarEventParticipants', label: 'Event Participants', description: 'Event Participants', 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 45264754dd8..c0272582f48 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 @@ -318,6 +318,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'people', label: 'People', description: 'People linked to the company.', @@ -338,6 +340,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'accountOwner', label: 'Account Owner', description: @@ -361,6 +365,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'taskTargets', label: 'Tasks', description: 'Tasks tied to the company', @@ -382,6 +388,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'noteTargets', label: 'Notes', description: 'Notes tied to the company', @@ -403,6 +411,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'opportunities', label: 'Opportunities', description: 'Opportunities linked to the company.', @@ -423,6 +433,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the company', @@ -444,6 +456,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Attachments linked to the company', @@ -465,6 +479,8 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline Activities linked to the company', 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 b01ddcc234c..cb763ae9d68 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 @@ -263,6 +263,8 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'accountOwner', label: 'Account Owner', description: 'Account Owner', @@ -285,6 +287,8 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannels', label: 'Message Channels', description: 'Message Channels', @@ -305,6 +309,8 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarChannels', label: 'Calendar Channels', description: 'Calendar Channels', 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 0139921a7d8..8a004dd9483 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 @@ -188,6 +188,8 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline activities linked to the dashboard', @@ -209,6 +211,8 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the dashboard', @@ -230,6 +234,8 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Attachments linked to the dashboard', 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 0e6fea584c9..a757f4a3e2e 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 @@ -137,6 +137,8 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites in this folder', 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 5ad22c3d98d..085a4b4897a 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 @@ -141,6 +141,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'forWorkspaceMember', label: 'Workspace Member', description: 'Favorite workspace member', @@ -163,6 +165,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'Favorite person', @@ -185,6 +189,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: 'Favorite company', @@ -207,6 +213,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'opportunity', label: 'Opportunity', description: 'Favorite opportunity', @@ -229,6 +237,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflow', label: 'Workflow', description: 'Favorite workflow', @@ -251,6 +261,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflowVersion', label: 'Workflow', description: 'Favorite workflow version', @@ -273,6 +285,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflowRun', label: 'Workflow', description: 'Favorite workflow run', @@ -295,6 +309,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'task', label: 'Task', description: 'Favorite task', @@ -317,6 +333,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'note', label: 'Note', description: 'Favorite note', @@ -339,6 +357,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'dashboard', label: 'Dashboard', description: 'Favorite dashboard', @@ -361,6 +381,8 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favoriteFolder', label: 'Favorite Folder', description: 'The folder this favorite belongs to', @@ -379,26 +401,4 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - custom: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'custom', - label: 'Custom', - description: 'Favorite custom object', - icon: 'IconHeart', - isNullable: true, - targetObjectName: 'note', - targetFieldName: 'favorites', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.CASCADE, - joinColumnName: 'customId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), }); 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 8b91bd91c4a..07a0d6b3364 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 @@ -170,6 +170,8 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannel', label: 'Message Channel Id', description: 'Message Channel Id', @@ -192,6 +194,8 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageThread', label: 'Message Thread Id', description: 'Message Thread Id', @@ -214,6 +218,8 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'message', label: 'Message Id', description: 'Message Id', 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 46365a18e23..8cefdf21293 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 @@ -501,6 +501,8 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'connectedAccount', label: 'Connected Account', description: 'Connected Account', @@ -523,6 +525,8 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannelMessageAssociations', label: 'Message Channel Association', description: 'Messages from the channel.', @@ -543,6 +547,8 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageFolders', label: 'Message Folders', description: 'Message Folders', 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 303825525d0..c697c359a6f 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 @@ -226,6 +226,8 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannel', label: 'Message Channel', description: 'Message Channel', 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 b21056602af..a3d0703a1dc 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 @@ -178,6 +178,8 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'message', label: 'Message', description: 'Message', @@ -200,6 +202,8 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'Person', @@ -222,6 +226,8 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workspaceMember', label: 'Workspace Member', description: 'Workspace member', 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 f388a9c3b5e..a5edc99e00d 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 @@ -187,6 +187,8 @@ export const buildMessageStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageThread', label: 'Message Thread Id', description: 'Message Thread Id', @@ -209,6 +211,8 @@ export const buildMessageStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageParticipants', label: 'Message Participants', description: 'Message Participants', @@ -229,6 +233,8 @@ export const buildMessageStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannelMessageAssociations', label: 'Message Channel Association', description: 'Messages from the channel.', 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 efc81bade4b..487c998ff71 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 @@ -98,6 +98,8 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messages', label: 'Messages', description: 'Messages from the thread.', @@ -118,6 +120,8 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageChannelMessageAssociations', label: 'Message Channel Association', description: 'Messages from the channel.', 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 ebe5dc9d33b..05283d3183f 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 @@ -209,6 +209,8 @@ export const buildNoteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'noteTargets', label: 'Relations', description: 'Note targets', @@ -230,6 +232,8 @@ export const buildNoteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Note attachments', @@ -251,6 +255,8 @@ export const buildNoteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline Activities linked to the note.', @@ -272,6 +278,8 @@ export const buildNoteStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the note', 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 01601ecde2f..101f9901798 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 @@ -111,6 +111,8 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'note', label: 'Note', description: 'NoteTarget note', @@ -133,6 +135,8 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'NoteTarget person', @@ -155,6 +159,8 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: 'NoteTarget company', @@ -177,6 +183,8 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'opportunity', label: 'Opportunity', description: 'NoteTarget opportunity', @@ -195,27 +203,4 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - custom: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'custom', - label: 'Custom', - description: 'NoteTarget custom object', - icon: 'IconBuildingSkyscraper', - isNullable: true, - // Custom is a dynamic relation - targetObjectName: 'note', - targetFieldName: 'noteTargets', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.CASCADE, - joinColumnName: 'customId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), }); 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 b51848bc9f9..0a4428c3dd8 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 @@ -247,6 +247,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'pointOfContact', label: 'Point of Contact', description: 'Opportunity point of contact', @@ -269,6 +271,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: 'Opportunity company', @@ -291,6 +295,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the opportunity', @@ -312,6 +318,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'taskTargets', label: 'Tasks', description: 'Tasks tied to the opportunity', @@ -333,6 +341,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'noteTargets', label: 'Notes', description: 'Notes tied to the opportunity', @@ -354,6 +364,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Attachments linked to the opportunity', @@ -375,6 +387,8 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline Activities linked to the opportunity.', 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 8c30528ea0b..73dd5a568e5 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 @@ -316,6 +316,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: "Contact's company", @@ -338,6 +340,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'pointOfContactForOpportunities', label: 'Opportunities', description: @@ -359,6 +363,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'taskTargets', label: 'Tasks', description: 'Tasks tied to the contact', @@ -380,6 +386,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'noteTargets', label: 'Notes', description: 'Notes tied to the contact', @@ -401,6 +409,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the contact', @@ -422,6 +432,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Attachments linked to the contact.', @@ -443,6 +455,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageParticipants', label: 'Message Participants', description: 'Message Participants', @@ -464,6 +478,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarEventParticipants', label: 'Calendar Event Participants', description: 'Calendar Event Participants', @@ -485,6 +501,8 @@ export const buildPersonStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Events', description: 'Events linked to the person', 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 6287aa8f550..0492173f408 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 @@ -256,6 +256,8 @@ export const buildTaskStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'taskTargets', label: 'Relations', description: 'Task targets', @@ -277,6 +279,8 @@ export const buildTaskStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Task attachments', @@ -298,6 +302,8 @@ export const buildTaskStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'assignee', label: 'Assignee', description: 'Task assignee', @@ -320,6 +326,8 @@ export const buildTaskStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline Activities linked to the task.', @@ -341,6 +349,8 @@ export const buildTaskStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the task', 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 858c62f68ea..63578cc9061 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 @@ -111,6 +111,8 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'task', label: 'Task', description: 'TaskTarget task', @@ -133,6 +135,8 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'person', label: 'Person', description: 'TaskTarget person', @@ -155,6 +159,8 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'company', label: 'Company', description: 'TaskTarget company', @@ -177,6 +183,8 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'opportunity', label: 'Opportunity', description: 'TaskTarget opportunity', @@ -195,27 +203,4 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - custom: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'custom', - label: 'Custom', - description: 'TaskTarget custom object', - icon: 'IconBuildingSkyscraper', - isNullable: true, - // Custom is a dynamic relation - targetObjectName: 'task', - targetFieldName: 'taskTargets', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.CASCADE, - joinColumnName: 'customId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), }); 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 fa1eb418a9a..71594702b89 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 @@ -11,7 +11,7 @@ import { type CreateStandardFieldArgs, } 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 { createStandardMorphRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-morph-relation-field-flat-metadata.util'; +import { TIMELINE_ACTIVITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; export const buildTimelineActivityStandardFlatFieldMetadatas = ({ now, @@ -205,6 +205,8 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workspaceMember', label: 'Workspace Member', description: 'Event workspace member', @@ -223,10 +225,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetPerson: createStandardMorphRelationFieldFlatMetadata({ + targetPerson: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetPerson', label: 'Person', description: 'Event person', @@ -245,10 +249,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetCompany: createStandardMorphRelationFieldFlatMetadata({ + targetCompany: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetCompany', label: 'Company', description: 'Event company', @@ -267,10 +273,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetOpportunity: createStandardMorphRelationFieldFlatMetadata({ + targetOpportunity: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetOpportunity', label: 'Opportunity', description: 'Event opportunity', @@ -289,10 +297,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetNote: createStandardMorphRelationFieldFlatMetadata({ + targetNote: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetNote', label: 'Note', description: 'Event note', @@ -311,10 +321,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetTask: createStandardMorphRelationFieldFlatMetadata({ + targetTask: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetTask', label: 'Task', description: 'Event task', @@ -333,10 +345,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetWorkflow: createStandardMorphRelationFieldFlatMetadata({ + targetWorkflow: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetWorkflow', label: 'Workflow', description: 'Event workflow', @@ -355,10 +369,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetWorkflowVersion: createStandardMorphRelationFieldFlatMetadata({ + targetWorkflowVersion: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetWorkflowVersion', label: 'WorkflowVersion', description: 'Event workflow version', @@ -377,10 +393,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetWorkflowRun: createStandardMorphRelationFieldFlatMetadata({ + targetWorkflowRun: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetWorkflowRun', label: 'Workflow Run', description: 'Event workflow run', @@ -399,10 +417,12 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetDashboard: createStandardMorphRelationFieldFlatMetadata({ + targetDashboard: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.MORPH_RELATION, + morphId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.targetMorphId, fieldName: 'targetDashboard', label: 'Dashboard', description: 'Event dashboard', @@ -421,26 +441,4 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - targetCustom: createStandardMorphRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'targetCustom', - label: 'Custom', - description: 'Timeline Activity custom object', - icon: 'IconTimeline', - isNullable: true, - targetObjectName: 'note', - targetFieldName: 'timelineActivities', - settings: { - relationType: RelationType.MANY_TO_ONE, - onDelete: RelationOnDeleteAction.CASCADE, - joinColumnName: 'targetCustomId', - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), }); 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 34723ba93ee..a466d979c67 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 @@ -146,6 +146,8 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflow', label: 'Workflow', description: 'WorkflowAutomatedTrigger workflow', 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 7d70f2c6494..fd13e917843 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 @@ -296,6 +296,8 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflowVersion', label: 'Workflow version', description: 'Workflow version linked to the run.', @@ -318,6 +320,8 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflow', label: 'Workflow', description: 'Workflow linked to the run.', @@ -340,6 +344,8 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the workflow run', @@ -361,6 +367,8 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline activities linked to the run', 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 307e794ef21..2d733e13d94 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 @@ -210,6 +210,8 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'versions', label: 'Versions', description: 'Workflow versions linked to the workflow.', @@ -231,6 +233,8 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'runs', label: 'Runs', description: 'Workflow runs linked to the workflow.', @@ -248,32 +252,12 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ twentyStandardApplicationId, now, }), - eventListeners: createStandardRelationFieldFlatMetadata({ - objectName, - workspaceId, - context: { - fieldName: 'eventListeners', - label: 'Event Listeners', - description: 'Workflow event listeners linked to the workflow.', - icon: 'IconSettingsAutomation', - isSystem: true, - isUIReadOnly: true, - isNullable: false, - targetObjectName: 'workflowAutomatedTrigger', - targetFieldName: 'workflow', - settings: { - relationType: RelationType.ONE_TO_MANY, - }, - }, - standardObjectMetadataRelatedEntityIds, - dependencyFlatEntityMaps, - twentyStandardApplicationId, - now, - }), automatedTriggers: createStandardRelationFieldFlatMetadata({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'automatedTriggers', label: 'Automated Triggers', description: 'Workflow automated triggers linked to the workflow.', @@ -296,6 +280,8 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the workflow', @@ -317,6 +303,8 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline activities linked to the workflow', @@ -338,6 +326,8 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'attachments', label: 'Attachments', description: 'Attachments linked to the workflow', 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 54f0990b2a4..9673dd7fd08 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 @@ -213,6 +213,8 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'workflow', label: 'Workflow', description: 'WorkflowVersion workflow', @@ -235,6 +237,8 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'runs', label: 'Runs', description: 'Workflow runs linked to the version.', @@ -255,6 +259,8 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the workflow version', @@ -276,6 +282,8 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Timeline Activities', description: 'Timeline activities linked to the version', 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 ce7bf2912af..d0f534386b8 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 @@ -388,6 +388,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'assignedTasks', label: 'Assigned tasks', description: 'Tasks assigned to the workspace member', @@ -408,6 +410,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'favorites', label: 'Favorites', description: 'Favorites linked to the workspace member', @@ -428,6 +432,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'accountOwnerForCompanies', label: 'Account Owner For Companies', description: 'Account owner for companies', @@ -448,6 +454,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'authoredAttachments', label: 'Authored attachments', description: 'Attachments created by the workspace member', @@ -469,6 +477,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'connectedAccounts', label: 'Connected accounts', description: 'Connected accounts', @@ -489,6 +499,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'messageParticipants', label: 'Message Participants', description: 'Message Participants', @@ -509,6 +521,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'blocklist', label: 'Blocklist', description: 'Blocklisted handles', @@ -529,6 +543,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'calendarEventParticipants', label: 'Calendar Event Participants', description: 'Calendar Event Participants', @@ -549,6 +565,8 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ objectName, workspaceId, context: { + type: FieldMetadataType.RELATION, + morphId: null, fieldName: 'timelineActivities', label: 'Events', description: 'Events linked to the workspace member', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-morph-relation-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-morph-relation-field-flat-metadata.util.ts deleted file mode 100644 index eb4bb14adf7..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-morph-relation-field-flat-metadata.util.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { FieldMetadataType } from 'twenty-shared/types'; - -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type'; -import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; -import { - type CreateStandardMorphOrRelationFieldContext, - createStandardRelationFieldFlatMetadata, -} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; - -export type CreateStandardMorphRelationFieldContext< - O extends AllStandardObjectName, - T extends AllStandardObjectName, -> = CreateStandardMorphOrRelationFieldContext< - O, - T, - FieldMetadataType.MORPH_RELATION ->; - -export type CreateStandardMorphRelationFieldArgs< - O extends AllStandardObjectName, - T extends AllStandardObjectName, -> = StandardBuilderArgs<'fieldMetadata'> & { - objectName: O; - context: CreateStandardMorphRelationFieldContext; -}; - -export const createStandardMorphRelationFieldFlatMetadata = < - O extends AllStandardObjectName, - T extends AllStandardObjectName, ->( - args: CreateStandardMorphRelationFieldArgs, -): FlatFieldMetadata => { - const simpleRelationFlatFieldMetadata = - createStandardRelationFieldFlatMetadata(args); - - return { - ...simpleRelationFlatFieldMetadata, - type: FieldMetadataType.MORPH_RELATION, - }; -}; 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 cd5940c6168..8457308f543 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 @@ -15,13 +15,18 @@ import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-st export type CreateStandardRelationFieldContext< O extends AllStandardObjectName, T extends AllStandardObjectName, -> = CreateStandardMorphOrRelationFieldContext; +> = CreateStandardMorphOrRelationFieldContext< + O, + T, + FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION +>; export type CreateStandardMorphOrRelationFieldContext< O extends AllStandardObjectName, T extends AllStandardObjectName, F extends FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION, > = { + type: F; fieldName: AllStandardObjectFieldName; label: string; description: string; @@ -34,6 +39,7 @@ export type CreateStandardMorphOrRelationFieldContext< defaultValue?: FieldMetadataDefaultValueForAnyType; settings: FieldMetadataSettings; options?: FieldMetadataDefaultOption[] | FieldMetadataComplexOption[] | null; + morphId: F extends FieldMetadataType.MORPH_RELATION ? string : null; }; export type CreateStandardRelationFieldArgs< @@ -63,6 +69,7 @@ export const createStandardRelationFieldFlatMetadata = < defaultValue = null, settings, options: fieldOptions = null, + morphId, }, standardObjectMetadataRelatedEntityIds, twentyStandardApplicationId, @@ -101,7 +108,7 @@ export const createStandardRelationFieldFlatMetadata = < relationTargetFieldMetadataId: targetFieldIds[targetFieldName].id, relationTargetObjectMetadataId: standardObjectMetadataRelatedEntityIds[targetObjectName].id, - morphId: null, + morphId, viewFieldIds: [], viewFilterIds: [], kanbanAggregateOperationViewIds: [], 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 776abac0ea1..cb6fd6d29e7 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 @@ -19,7 +19,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.attachment.universalIdentifier, - standardId: STANDARD_OBJECTS.attachment.universalIdentifier, nameSingular: 'attachment', namePlural: 'attachments', labelSingular: 'Attachment', @@ -46,7 +45,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.blocklist.universalIdentifier, - standardId: STANDARD_OBJECTS.blocklist.universalIdentifier, nameSingular: 'blocklist', namePlural: 'blocklists', labelSingular: 'Blocklist', @@ -77,8 +75,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.calendarChannelEventAssociation.universalIdentifier, - standardId: - STANDARD_OBJECTS.calendarChannelEventAssociation.universalIdentifier, nameSingular: 'calendarChannelEventAssociation', namePlural: 'calendarChannelEventAssociations', labelSingular: 'Calendar Channel Event Association', @@ -110,7 +106,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.calendarChannel.universalIdentifier, - standardId: STANDARD_OBJECTS.calendarChannel.universalIdentifier, nameSingular: 'calendarChannel', namePlural: 'calendarChannels', labelSingular: 'Calendar Channel', @@ -142,8 +137,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.calendarEventParticipant.universalIdentifier, - standardId: - STANDARD_OBJECTS.calendarEventParticipant.universalIdentifier, nameSingular: 'calendarEventParticipant', namePlural: 'calendarEventParticipants', labelSingular: 'Calendar event participant', @@ -174,7 +167,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.calendarEvent.universalIdentifier, - standardId: STANDARD_OBJECTS.calendarEvent.universalIdentifier, nameSingular: 'calendarEvent', namePlural: 'calendarEvents', labelSingular: 'Calendar event', @@ -203,7 +195,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.company.universalIdentifier, - standardId: STANDARD_OBJECTS.company.universalIdentifier, nameSingular: 'company', namePlural: 'companies', labelSingular: 'Company', @@ -235,7 +226,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.connectedAccount.universalIdentifier, - standardId: STANDARD_OBJECTS.connectedAccount.universalIdentifier, nameSingular: 'connectedAccount', namePlural: 'connectedAccounts', labelSingular: 'Connected Account', @@ -263,7 +253,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.dashboard.universalIdentifier, - standardId: STANDARD_OBJECTS.dashboard.universalIdentifier, nameSingular: 'dashboard', namePlural: 'dashboards', labelSingular: 'Dashboard', @@ -291,7 +280,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.favorite.universalIdentifier, - standardId: STANDARD_OBJECTS.favorite.universalIdentifier, nameSingular: 'favorite', namePlural: 'favorites', labelSingular: 'Favorite', @@ -322,7 +310,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.favoriteFolder.universalIdentifier, - standardId: STANDARD_OBJECTS.favoriteFolder.universalIdentifier, nameSingular: 'favoriteFolder', namePlural: 'favoriteFolders', labelSingular: 'Favorite Folder', @@ -353,8 +340,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.messageChannelMessageAssociation.universalIdentifier, - standardId: - STANDARD_OBJECTS.messageChannelMessageAssociation.universalIdentifier, nameSingular: 'messageChannelMessageAssociation', namePlural: 'messageChannelMessageAssociations', labelSingular: 'Message Channel Message Association', @@ -386,7 +371,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.messageChannel.universalIdentifier, - standardId: STANDARD_OBJECTS.messageChannel.universalIdentifier, nameSingular: 'messageChannel', namePlural: 'messageChannels', labelSingular: 'Message Channel', @@ -417,7 +401,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.messageFolder.universalIdentifier, - standardId: STANDARD_OBJECTS.messageFolder.universalIdentifier, nameSingular: 'messageFolder', namePlural: 'messageFolders', labelSingular: 'Message Folder', @@ -449,7 +432,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.messageParticipant.universalIdentifier, - standardId: STANDARD_OBJECTS.messageParticipant.universalIdentifier, nameSingular: 'messageParticipant', namePlural: 'messageParticipants', labelSingular: 'Message Participant', @@ -480,7 +462,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.messageThread.universalIdentifier, - standardId: STANDARD_OBJECTS.messageThread.universalIdentifier, nameSingular: 'messageThread', namePlural: 'messageThreads', labelSingular: 'Message Thread', @@ -509,7 +490,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.message.universalIdentifier, - standardId: STANDARD_OBJECTS.message.universalIdentifier, nameSingular: 'message', namePlural: 'messages', labelSingular: 'Message', @@ -538,7 +518,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.note.universalIdentifier, - standardId: STANDARD_OBJECTS.note.universalIdentifier, nameSingular: 'note', namePlural: 'notes', labelSingular: 'Note', @@ -566,7 +545,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.noteTarget.universalIdentifier, - standardId: STANDARD_OBJECTS.noteTarget.universalIdentifier, nameSingular: 'noteTarget', namePlural: 'noteTargets', labelSingular: 'Note Target', @@ -593,7 +571,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.opportunity.universalIdentifier, - standardId: STANDARD_OBJECTS.opportunity.universalIdentifier, nameSingular: 'opportunity', namePlural: 'opportunities', labelSingular: 'Opportunity', @@ -621,7 +598,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.person.universalIdentifier, - standardId: STANDARD_OBJECTS.person.universalIdentifier, nameSingular: 'person', namePlural: 'people', labelSingular: 'Person', @@ -649,7 +625,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.task.universalIdentifier, - standardId: STANDARD_OBJECTS.task.universalIdentifier, nameSingular: 'task', namePlural: 'tasks', labelSingular: 'Task', @@ -677,7 +652,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.taskTarget.universalIdentifier, - standardId: STANDARD_OBJECTS.taskTarget.universalIdentifier, nameSingular: 'taskTarget', namePlural: 'taskTargets', labelSingular: 'Task Target', @@ -708,7 +682,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.timelineActivity.universalIdentifier, - standardId: STANDARD_OBJECTS.timelineActivity.universalIdentifier, nameSingular: 'timelineActivity', namePlural: 'timelineActivities', labelSingular: 'Timeline Activity', @@ -736,7 +709,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.workflow.universalIdentifier, - standardId: STANDARD_OBJECTS.workflow.universalIdentifier, nameSingular: 'workflow', namePlural: 'workflows', labelSingular: 'Workflow', @@ -768,8 +740,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.workflowAutomatedTrigger.universalIdentifier, - standardId: - STANDARD_OBJECTS.workflowAutomatedTrigger.universalIdentifier, nameSingular: 'workflowAutomatedTrigger', namePlural: 'workflowAutomatedTriggers', labelSingular: 'Workflow Automated Trigger', @@ -796,7 +766,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { dependencyFlatEntityMaps, context: { universalIdentifier: STANDARD_OBJECTS.workflowRun.universalIdentifier, - standardId: STANDARD_OBJECTS.workflowRun.universalIdentifier, nameSingular: 'workflowRun', namePlural: 'workflowRuns', labelSingular: 'Workflow Run', @@ -827,7 +796,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.workflowVersion.universalIdentifier, - standardId: STANDARD_OBJECTS.workflowVersion.universalIdentifier, nameSingular: 'workflowVersion', namePlural: 'workflowVersions', labelSingular: 'Workflow Version', @@ -858,7 +826,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = { context: { universalIdentifier: STANDARD_OBJECTS.workspaceMember.universalIdentifier, - standardId: STANDARD_OBJECTS.workspaceMember.universalIdentifier, nameSingular: 'workspaceMember', namePlural: 'workspaceMembers', labelSingular: 'Workspace Member', 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 41fd10b1236..0d8fa8fc0ed 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 @@ -5,7 +5,6 @@ import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-st export type CreateStandardObjectContext = { universalIdentifier: string; - standardId: string; nameSingular: O; namePlural: string; labelSingular: string; @@ -32,7 +31,6 @@ export const createStandardObjectFlatMetadata = < >({ context: { universalIdentifier, - standardId, nameSingular, namePlural, labelSingular, @@ -52,7 +50,7 @@ export const createStandardObjectFlatMetadata = < now, }: CreateStandardObjectArgs): FlatObjectMetadata => ({ universalIdentifier, - standardId, + standardId: null, applicationId: twentyStandardApplicationId, workspaceId, nameSingular, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/build-standard-flat-role-metadata-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/build-standard-flat-role-metadata-maps.util.ts new file mode 100644 index 00000000000..e09cdde6651 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/build-standard-flat-role-metadata-maps.util.ts @@ -0,0 +1,25 @@ +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'; +import { type FlatRole } from 'src/engine/metadata-modules/flat-role/types/flat-role.type'; +import { STANDARD_FLAT_ROLE_METADATA_BUILDERS_BY_ROLE_NAME } from 'src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-flat-role-metadata.util'; +import { type CreateStandardRoleArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util'; + +export const buildStandardFlatRoleMetadataMaps = ( + args: Omit, +): FlatEntityMaps => { + const allRoleMetadatas: FlatRole[] = Object.values( + STANDARD_FLAT_ROLE_METADATA_BUILDERS_BY_ROLE_NAME, + ).map((builder) => builder(args)); + + let flatRoleMetadataMaps = createEmptyFlatEntityMaps(); + + for (const roleMetadata of allRoleMetadatas) { + flatRoleMetadataMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: roleMetadata, + flatEntityMaps: flatRoleMetadataMaps, + }); + } + + return flatRoleMetadataMaps; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-flat-role-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-flat-role-metadata.util.ts new file mode 100644 index 00000000000..1b0a7a74e08 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-flat-role-metadata.util.ts @@ -0,0 +1,34 @@ +import { type FlatRole } from 'src/engine/metadata-modules/flat-role/types/flat-role.type'; +import { type AllStandardRoleName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-role-name.type'; +import { + type CreateStandardRoleArgs, + createStandardRoleFlatMetadata, +} from 'src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util'; + +export const STANDARD_FLAT_ROLE_METADATA_BUILDERS_BY_ROLE_NAME = { + admin: (args: Omit) => + createStandardRoleFlatMetadata({ + ...args, + context: { + roleName: 'admin', + label: 'Admin', + description: 'Admin role', + icon: 'IconUserCog', + isEditable: false, + canUpdateAllSettings: true, + canAccessAllTools: true, + canReadAllObjectRecords: true, + canUpdateAllObjectRecords: true, + canSoftDeleteAllObjectRecords: true, + canDestroyAllObjectRecords: true, + canBeAssignedToUsers: true, + canBeAssignedToAgents: false, + canBeAssignedToApiKeys: true, + canBeAssignedToApplications: false, + }, + }), +} satisfies { + [P in AllStandardRoleName]: ( + args: Omit, + ) => FlatRole; +}; 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 new file mode 100644 index 00000000000..fd64a58d283 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/create-standard-role-flat-metadata.util.ts @@ -0,0 +1,81 @@ +import { v4 } from 'uuid'; + +import { type FlatRole } from 'src/engine/metadata-modules/flat-role/types/flat-role.type'; +import { STANDARD_ROLE } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant'; +import { type AllStandardRoleName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-role-name.type'; +import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; + +export type CreateStandardRoleContext = { + roleName: AllStandardRoleName; + label: string; + description: string | null; + icon: string | null; + isEditable: boolean; + canUpdateAllSettings: boolean; + canAccessAllTools: boolean; + canReadAllObjectRecords: boolean; + canUpdateAllObjectRecords: boolean; + canSoftDeleteAllObjectRecords: boolean; + canDestroyAllObjectRecords: boolean; + canBeAssignedToUsers: boolean; + canBeAssignedToAgents: boolean; + canBeAssignedToApiKeys: boolean; + canBeAssignedToApplications: boolean; +}; + +export type CreateStandardRoleArgs = StandardBuilderArgs<'role'> & { + context: CreateStandardRoleContext; +}; + +export const createStandardRoleFlatMetadata = ({ + context: { + roleName, + label, + description, + icon, + isEditable, + canUpdateAllSettings, + canAccessAllTools, + canReadAllObjectRecords, + canUpdateAllObjectRecords, + canSoftDeleteAllObjectRecords, + canDestroyAllObjectRecords, + canBeAssignedToUsers, + canBeAssignedToAgents, + canBeAssignedToApiKeys, + canBeAssignedToApplications, + }, + workspaceId, + twentyStandardApplicationId, + now, +}: CreateStandardRoleArgs): FlatRole => { + const universalIdentifier = STANDARD_ROLE[roleName].universalIdentifier; + + return { + id: v4(), + universalIdentifier, + standardId: null, + label, + description, + icon, + isEditable, + canUpdateAllSettings, + canAccessAllTools, + canReadAllObjectRecords, + canUpdateAllObjectRecords, + canSoftDeleteAllObjectRecords, + canDestroyAllObjectRecords, + canBeAssignedToUsers, + canBeAssignedToAgents, + canBeAssignedToApiKeys, + canBeAssignedToApplications, + workspaceId, + applicationId: twentyStandardApplicationId, + createdAt: now, + updatedAt: now, + permissionFlagIds: [], + fieldPermissionIds: [], + objectPermissionIds: [], + roleTargetIds: [], + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts index 4e4b4ffcd54..a369b6e148a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant.ts @@ -1,9 +1,11 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { type TwentyStandardAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/types/twenty-standard-all-flat-entity-maps.type'; +import { buildStandardFlatAgentMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/agent-metadata/build-standard-flat-agent-metadata-maps.util'; import { buildStandardFlatFieldMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/build-standard-flat-field-metadata-maps.util'; import { getStandardObjectMetadataRelatedEntityIds } from 'src/engine/workspace-manager/twenty-standard-application/utils/get-standard-object-metadata-related-entity-ids.util'; import { buildStandardFlatIndexMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/index/build-standard-flat-index-metadata-maps.util'; import { buildStandardFlatObjectMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/build-standard-flat-object-metadata-maps.util'; +import { buildStandardFlatRoleMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/build-standard-flat-role-metadata-maps.util'; import { buildStandardFlatViewFieldMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/build-standard-flat-view-field-metadata-maps.util'; import { buildStandardFlatViewFilterMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-filter/build-standard-flat-view-filter-metadata-maps.util'; import { buildStandardFlatViewGroupMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-group/build-standard-flat-view-group-metadata-maps.util'; @@ -99,6 +101,24 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({ workspaceId, }); + const flatRoleMaps = buildStandardFlatRoleMetadataMaps({ + now, + workspaceId, + twentyStandardApplicationId, + standardObjectMetadataRelatedEntityIds, + dependencyFlatEntityMaps: undefined, + }); + + const flatAgentMaps = buildStandardFlatAgentMetadataMaps({ + now, + workspaceId, + twentyStandardApplicationId, + standardObjectMetadataRelatedEntityIds, + dependencyFlatEntityMaps: { + flatRoleMaps, + }, + }); + return { flatViewFieldMaps, flatViewFilterMaps, @@ -107,5 +127,7 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({ flatIndexMaps, flatFieldMetadataMaps, flatObjectMetadataMaps, + flatRoleMaps, + flatAgentMaps, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts index 4d3d5c0f65a..739f7c5b9f7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts @@ -572,6 +572,7 @@ export class WorkspaceMigrationBuildOrchestratorService { to: toFlatRoleTargetMaps, buildOptions, dependencyOptimisticFlatEntityMaps: { + flatAgentMaps: optimisticAllFlatEntityMaps.flatAgentMaps, flatRoleMaps: optimisticAllFlatEntityMaps.flatRoleMaps, }, workspaceId, @@ -601,7 +602,9 @@ export class WorkspaceMigrationBuildOrchestratorService { from: fromFlatAgentMaps, to: toFlatAgentMaps, buildOptions, - dependencyOptimisticFlatEntityMaps: undefined, + dependencyOptimisticFlatEntityMaps: { + flatRoleMaps: optimisticAllFlatEntityMaps.flatRoleMaps, + }, workspaceId, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts index 7fe5dd2895b..63ac403bdcb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts @@ -363,6 +363,58 @@ describe('aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions', }, }, }, + { + title: + 'should not merge create_field actions containing relation fields into create_object', + context: { + input: { + ...createEmptyOrchestratorActionsReport(), + objectMetadata: { + created: [ + { + type: 'create_object', + flatObjectMetadata: getFlatObjectMetadataMock({ + universalIdentifier: 'object-1', + id: 'object-1', + nameSingular: 'attachment', + namePlural: 'attachments', + }), + flatFieldMetadatas: [], + } satisfies CreateObjectAction, + ], + updated: [], + deleted: [], + }, + fieldMetadata: { + created: [ + { + type: 'create_field', + objectMetadataId: 'object-1', + flatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: 'field-1', + objectMetadataId: 'object-1', + type: FieldMetadataType.RELATION, + id: 'field-1', + name: 'author', + }), + ], + } satisfies CreateFieldAction, + ], + updated: [], + deleted: [], + }, + } satisfies OrchestratorActionsReport, + expected: { + expectCreateFieldActionPerObjectMetadataId: { + 'object-1': 1, + }, + expectCreateObjectActionPerObjectMetadataId: { + 'object-1': 1, + }, + }, + }, + }, ]; test.each(eachTestingContextFilter(testCases))( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts index 9b6f11d3f83..47ab6722112 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts @@ -1,5 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2'; import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/types/workspace-migration-object-action-v2'; @@ -12,6 +14,7 @@ type AggregatedActions = { createdFieldActionByObjectMetadataId: Record; createdObjectActionByObjectMetadataId: Record; }; + export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions = ({ orchestratorActionsReport, @@ -23,7 +26,7 @@ export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions ...acc, [createObjectAction.flatObjectMetadata.id]: createObjectAction, }), - {}, + {} as Record, ); const initialAccumulator: AggregatedActions = { createdFieldActionByObjectMetadataId: {}, @@ -49,7 +52,90 @@ export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions createFieldAction.objectMetadataId ]; + const existingCreateFieldAction = + createdFieldActionByObjectMetadataId[ + createFieldAction.objectMetadataId + ]; + + const initialAccumulator: { + morphOrRelationFlatFieldMetadatas: FlatFieldMetadata[]; + otherFlatFieldMetadatas: FlatFieldMetadata[]; + } = { + morphOrRelationFlatFieldMetadatas: [], + otherFlatFieldMetadatas: [], + }; + const { morphOrRelationFlatFieldMetadatas, otherFlatFieldMetadatas } = + createFieldAction.flatFieldMetadatas.reduce( + (acc, flatFieldMetadata) => { + if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { + return { + ...acc, + morphOrRelationFlatFieldMetadatas: [ + ...acc.morphOrRelationFlatFieldMetadatas, + flatFieldMetadata, + ], + }; + } + + return { + ...acc, + otherFlatFieldMetadatas: [ + ...acc.otherFlatFieldMetadatas, + flatFieldMetadata, + ], + }; + }, + initialAccumulator, + ); + if (isDefined(existingCreateObjectAction)) { + if (isDefined(existingCreateFieldAction)) { + return { + createdObjectActionByObjectMetadataId: { + ...createdObjectActionByObjectMetadataId, + [createFieldAction.objectMetadataId]: { + ...existingCreateObjectAction, + flatFieldMetadatas: [ + ...existingCreateObjectAction.flatFieldMetadatas, + ...otherFlatFieldMetadatas, + ], + }, + }, + createdFieldActionByObjectMetadataId: { + ...createdFieldActionByObjectMetadataId, + [createFieldAction.objectMetadataId]: { + ...existingCreateFieldAction, + flatFieldMetadatas: [ + ...existingCreateFieldAction.flatFieldMetadatas, + ...morphOrRelationFlatFieldMetadatas, + ], + }, + }, + }; + } + + if (morphOrRelationFlatFieldMetadatas.length > 0) { + return { + createdObjectActionByObjectMetadataId: { + ...createdObjectActionByObjectMetadataId, + [createFieldAction.objectMetadataId]: { + ...existingCreateObjectAction, + flatFieldMetadatas: [ + ...existingCreateObjectAction.flatFieldMetadatas, + ...otherFlatFieldMetadatas, + ], + }, + }, + createdFieldActionByObjectMetadataId: { + ...createdFieldActionByObjectMetadataId, + [createFieldAction.objectMetadataId]: { + ...createFieldAction, + flatFieldMetadatas: morphOrRelationFlatFieldMetadatas, + }, + }, + }; + } + return { createdObjectActionByObjectMetadataId: { ...createdObjectActionByObjectMetadataId, @@ -57,7 +143,7 @@ export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions ...existingCreateObjectAction, flatFieldMetadatas: [ ...existingCreateObjectAction.flatFieldMetadatas, - ...createFieldAction.flatFieldMetadatas, + ...otherFlatFieldMetadatas, ], }, }, @@ -65,11 +151,6 @@ export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions }; } - const existingCreateFieldAction = - createdFieldActionByObjectMetadataId[ - createFieldAction.objectMetadataId - ]; - if (isDefined(existingCreateFieldAction)) { return { createdFieldActionByObjectMetadataId: { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/dashboard-manager-role.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/dashboard-manager-role.ts deleted file mode 100644 index 0be8202a187..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/dashboard-manager-role.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PermissionFlagType } from 'twenty-shared/constants'; - -import { type StandardRoleDefinition } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/types/standard-role-definition.interface'; - -export const DASHBOARD_MANAGER_ROLE: StandardRoleDefinition = { - standardId: '20202020-0001-0001-0001-000000000005', - label: 'Dashboard Manager', - description: 'Role for creating and managing dashboards', - icon: 'IconLayoutDashboard', - isEditable: false, - canUpdateAllSettings: false, - canAccessAllTools: false, - canReadAllObjectRecords: true, - canUpdateAllObjectRecords: true, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canBeAssignedToUsers: false, - canBeAssignedToAgents: true, - canBeAssignedToApiKeys: false, - canBeAssignedToApplications: true, - permissionFlags: [PermissionFlagType.LAYOUTS], - applicationId: null, // TODO: Replace with Twenty application ID -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-manipulator-role.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-manipulator-role.ts deleted file mode 100644 index 443e36953e6..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-manipulator-role.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type StandardRoleDefinition } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/types/standard-role-definition.interface'; - -export const DATA_MANIPULATOR_ROLE: StandardRoleDefinition = { - standardId: '20202020-0001-0001-0001-000000000004', - label: 'Data Manipulator', - description: 'Read and write access to all object records', - icon: 'IconEdit', - isEditable: false, - canUpdateAllSettings: false, - canAccessAllTools: false, - canReadAllObjectRecords: true, - canUpdateAllObjectRecords: true, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canBeAssignedToUsers: false, - canBeAssignedToAgents: true, - canBeAssignedToApiKeys: false, - canBeAssignedToApplications: true, - applicationId: null, // TODO: Replace with Twenty application ID -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-model-manager-role.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-model-manager-role.ts deleted file mode 100644 index 278c13c7097..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/data-model-manager-role.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PermissionFlagType } from 'twenty-shared/constants'; - -import { type StandardRoleDefinition } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/types/standard-role-definition.interface'; - -export const DATA_MODEL_MANAGER_ROLE: StandardRoleDefinition = { - standardId: '20202020-0001-0001-0001-000000000006', - label: 'Data Model Manager', - description: 'Role for managing the workspace data model', - icon: 'IconDatabaseEdit', - isEditable: false, - canUpdateAllSettings: false, - canAccessAllTools: false, - canReadAllObjectRecords: true, - canUpdateAllObjectRecords: false, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canBeAssignedToUsers: false, - canBeAssignedToAgents: true, - canBeAssignedToApiKeys: false, - canBeAssignedToApplications: true, - permissionFlags: [PermissionFlagType.DATA_MODEL], - applicationId: null, -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/workflow-manager-role.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/workflow-manager-role.ts deleted file mode 100644 index 683b6455f26..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/workflow-manager-role.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PermissionFlagType } from 'twenty-shared/constants'; - -import { type StandardRoleDefinition } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/types/standard-role-definition.interface'; - -export const WORKFLOW_MANAGER_ROLE: StandardRoleDefinition = { - standardId: '20202020-0001-0001-0001-000000000002', - label: 'Workflow Manager', - description: 'Role for managing workflows', - icon: 'IconSettingsAutomation', - isEditable: false, - canUpdateAllSettings: false, - canAccessAllTools: false, - canReadAllObjectRecords: false, - canUpdateAllObjectRecords: true, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canBeAssignedToUsers: false, - canBeAssignedToAgents: true, - canBeAssignedToApiKeys: false, - canBeAssignedToApplications: true, - permissionFlags: [PermissionFlagType.WORKFLOWS], - applicationId: null, // TODO: Replace with Twenty application ID -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/standard-role-definitions.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/standard-role-definitions.ts index 72bc9112546..f462432a55e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/standard-role-definitions.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-roles/standard-role-definitions.ts @@ -1,14 +1,6 @@ import { ADMIN_ROLE } from './roles/admin-role'; -import { DASHBOARD_MANAGER_ROLE } from './roles/dashboard-manager-role'; -import { DATA_MANIPULATOR_ROLE } from './roles/data-manipulator-role'; -import { DATA_MODEL_MANAGER_ROLE } from './roles/data-model-manager-role'; -import { WORKFLOW_MANAGER_ROLE } from './roles/workflow-manager-role'; import { type StandardRoleDefinition } from './types/standard-role-definition.interface'; export const STANDARD_ROLE_DEFINITIONS = [ ADMIN_ROLE, - WORKFLOW_MANAGER_ROLE, - DATA_MANIPULATOR_ROLE, - DASHBOARD_MANAGER_ROLE, - DATA_MODEL_MANAGER_ROLE, ] as const satisfies StandardRoleDefinition[]; diff --git a/packages/twenty-server/test/integration/graphql/suites/settings-permissions/roles.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/settings-permissions/roles.integration-spec.ts index d33c270117a..0c611b69666 100644 --- a/packages/twenty-server/test/integration/graphql/suites/settings-permissions/roles.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/settings-permissions/roles.integration-spec.ts @@ -90,7 +90,7 @@ describe('roles permissions', () => { expect(resp.status).toBe(200); expect(resp.body.errors).toBeUndefined(); - expect(resp.body.data.getRoles.length).toBeGreaterThanOrEqual(5); + expect(resp.body.data.getRoles.length).toBeGreaterThanOrEqual(4); const roles = resp.body.data.getRoles; const guestRole = roles.find((role: any) => role.label === 'Guest'); @@ -99,15 +99,11 @@ describe('roles permissions', () => { const objectRestrictedRole = roles.find( (role: any) => role.label === 'Object-restricted', ); - const workflowManagerRole = roles.find( - (role: any) => role.label === 'Workflow Manager', - ); expect(guestRole).toBeDefined(); expect(adminRole).toBeDefined(); expect(memberRole).toBeDefined(); expect(objectRestrictedRole).toBeDefined(); - expect(workflowManagerRole).toBeDefined(); expect(guestRole.workspaceMembers).toEqual([ { @@ -150,8 +146,6 @@ describe('roles permissions', () => { }, }, ]); - - expect(workflowManagerRole.workspaceMembers).toBeDefined(); }); it('should throw a permission error when user does not have permission (member role)', async () => { const query = { diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap index 2d38ec088b3..47c111d3ce4 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap @@ -74,7 +74,7 @@ exports[`Agent deletion should fail when deleting a non-existent agent 1`] = ` "subCode": "AGENT_NOT_FOUND", "userFriendlyMessage": "An error occurred.", }, - "message": "Agent not found", + "message": "Could not retrieve deleted agent", "name": "NotFoundError", } `;