From b0d75169511d578e1fcfac8b4e15cac4398b7664 Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:16:01 +0200 Subject: [PATCH] Deprecate `asExpression` from field metadata search_vector (#22287) ## Summary Fully deprecates the cached `asExpression` / `generatedType` settings on `TS_VECTOR` (searchVector) fields. Previously the generated-column expression was stored in `FieldMetadataSettings` and kept in sync via imperative recompute side-effects. It is now **derived at DDL time** from the `searchFieldMetadata` rows that describe which fields feed the search vector, making `searchFieldMetadata` the single source of truth and removing a whole class of cache-drift bugs. This is delivered across the milestones tracked in #2587 and coordinates with the frontend migration (#1428). ## Why - The searchVector expression lived in two places (stored `settings.asExpression` + the actual generated column), kept consistent by bespoke side-effects (`recompute-search-vector-on-field-rename`, label-identifier recompute, etc.). - The frontend reconstructed the searchable-fields list by **regex-parsing** the stored `asExpression`. - Both are brittle. Deriving the expression from `searchFieldMetadata` rows at build/run time removes the cache and the parsing. ## What changed ### Server - data model & derivation - Introduce the `tsVectorFieldMetadata` relation on `searchFieldMetadata` (`tsVectorFieldMetadataId` / universal identifier) linking each searchable-field row to its target `TS_VECTOR` field. - New runtime derivation `deriveSearchVectorAsExpressionForTsVectorField` (`flat-search-field-metadata/utils/...`) used by the create-object and update-field handlers to generate the column expression from `searchFieldMetadata` rows. - Remove `asExpression` / `generatedType` from stored settings: `FieldMetadataSettings.TS_VECTOR` is now `null`; the column builder (`generate-column-definitions.util.ts`) hardcodes `generatedType: 'STORED'` and requires the derived expression. - Delete the imperative recompute side-effects and the `compute-search-vector-universal-settings-from-object-manifest` path; drop the `settings` block from all 28 standard `compute-*-standard-flat-field-metadata` utils. ### Server - migration runner - New `rebuildSearchVector` marker on `update-field` actions: the orchestrator synthesizes targeted column rebuilds (`compute-search-vector-rebuild-target-universal-identifiers.util.ts` + the deprioritize aggregator) only when a searchFieldMetadata change or indexed-field rename actually requires it - instead of rebuilding on every settings touch. - Deferrable FKs + in-flight ID resolution so a `searchFieldMetadata` row and its `TS_VECTOR` field can be created in the same transaction (deterministic UUIDs). ### Frontend (contract change, #1428) - New `SearchFieldMetadataDTO` + dataloader exposing `searchFieldMetadataList` on object metadata. - `SettingsObjectSearchSection` now reads `objectMetadataItem.searchFieldMetadatas` instead of parsing `asExpression`; new `SearchFieldMetadataItem` type, fragment, and mapping updates. ### Upgrade commands (2.18) - `2-18-instance-command-fast-...-add-ts-vector-field-metadata-id-to-search-field-metadata` - `2-18-instance-command-fast-...-make-search-field-metadata-fks-deferrable` - `2-18-instance-command-slow-...-backfill-ts-vector-field-metadata-id-on-search-field-metadata` (These were relocated from 2.16 to 2.18 and re-timestamped into an ordered block - add column -> make FK deferrable -> backfill data - since 2.16/2.17 are released.) ### Tests - Updated search-vector side-effect integration specs to assert behavior (search works) rather than the now-removed `asExpression`; removed the obsolete expression-validation specs; refreshed the application-sync snapshot (`universalSettings: null`). ## Upgrade / compatibility notes - Existing workspaces keep their stored `settings` until a later cleanup; nothing reads it anymore. The new derivation drives all DDL going forward. - Schema changes are gated behind the 2.18 instance commands above. ## Known follow-up (separate PR) https://github.com/twentyhq/core-team-issues/issues/2620 - The column rebuild (`DROP`/`ADD` of the `searchVector` STORED column) cascade-drops its GIN index and does not recreate it - a pre-existing regression on `main` inherited here. A follow-up PR will fix the rebuild handler to recreate the GIN index and add a 2.18 workspace command to recompute every search vector + strip the deprecated settings. (Planned.) ## Test plan - [ ] `npx nx typecheck twenty-server` / `twenty-front` - [ ] `npx nx lint:diff-with-main twenty-server` / `twenty-front` - [ ] Server integration: create/update/delete field, rename indexed field, update object - search returns expected records - [ ] Run the 2.18 instance commands on a seeded DB; verify `tsVectorFieldMetadataId` backfilled and FKs deferrable - [ ] Frontend: object Search settings tab lists the correct searchable fields (no `asExpression` parsing) close https://github.com/twentyhq/core-team-issues/issues/2587 Review in cubic --- .../src/metadata/generated/schema.graphql | 10 + .../src/metadata/generated/schema.ts | 31 + .../src/metadata/generated/types.ts | 810 +++++++++--------- .../mock-data/generate-object-metadata.ts | 9 + .../src/generated-metadata/graphql.ts | 31 +- .../object-metadata/graphql/fragment.ts | 8 + .../types/EnrichedObjectMetadataItem.ts | 3 + .../types/SearchFieldMetadataItem.ts | 8 + ...bjectMetadataItemsToObjectMetadataItems.ts | 15 +- .../objectMetadataItemSchema.ts | 2 + .../searchFieldMetadataItemSchema.ts | 13 + .../useAggregateRecordsQuery.test.tsx | 1 + .../__tests__/turnSortsIntoOrderBy.test.ts | 3 + ...ildRecordGqlFieldsAggregateForView.test.ts | 1 + .../__tests__/generateAggregateQuery.test.ts | 2 + .../tabs/SettingsObjectSearchSection.tsx | 55 +- .../WorkflowFieldsMultiSelect.stories.ts | 1 + .../SettingsApplicationPermissionsTab.tsx | 1 + .../metadata/objects/mock-objects-metadata.ts | 29 + ...call-recording-standard-objects.command.ts | 2 + ...-metadata-backfill-operations.util.spec.ts | 92 +- ...field-metadata-backfill-operations.util.ts | 11 + ...ld-metadata-id-to-search-field-metadata.ts | 53 ++ ...ld-metadata-id-on-search-field-metadata.ts | 51 ++ ...-metadata-upgrade-command-name.constant.ts | 2 + .../instance-commands.constant.ts | 14 +- ...generate-workspace-schema-ddl.util.spec.ts | 114 +++ .../generate-workspace-schema-ddl.util.ts | 75 +- .../workspace-export.module.ts | 7 +- .../workspace-export.service.ts | 49 +- ...t-to-universal-flat-field-metadata.util.ts | 1 + ...-all-universal-flat-entity-maps.service.ts | 21 +- ...settings-from-object-manifest.util.spec.ts | 149 ---- ...rsal-settings-from-object-manifest.util.ts | 37 - .../dataloaders/dataloader.interface.ts | 7 + .../engine/dataloaders/dataloader.service.ts | 49 ++ .../field-metadata/field-metadata.entity.ts | 7 + .../services/field-metadata.service.ts | 11 +- ...configuration-by-metadata-name.constant.ts | 5 + ...ny-to-one-metadata-foreign-key.constant.ts | 3 + ...many-to-one-metadata-relations.constant.ts | 9 +- ...one-to-many-metadata-relations.constant.ts | 6 + ...ny-entity-relation-properties.type-test.ts | 5 +- ...ity-related-entity-properties.type-test.ts | 3 +- ...a-related-metadata-names.util.spec.ts.snap | 1 + ...ata-names-children-first.util.spec.ts.snap | 2 +- ...ity-maps-through-mutation-or-throw.util.ts | 15 + .../__mocks__/get-flat-field-metadata.mock.ts | 2 + ...elation-target-flat-field-metadata-mock.ts | 2 + ...lat-field-metadatas-to-create.spec.ts.snap | 4 + ...e-flat-field-metadata-map-cache.service.ts | 14 + ...tadata-deletion-for-deleted-fields.util.ts | 31 +- ...-to-flat-field-metadatas-to-delete.util.ts | 7 +- ...data-entity-to-flat-field-metadata.util.ts | 6 + ...field-input-to-flat-field-metadata.util.ts | 5 - ...d-metadata-from-create-field-input.util.ts | 1 + ...-field-metadata-update-side-effect.util.ts | 29 +- ...pute-search-vector-on-field-rename.util.ts | 68 -- ...date-ts-vector-flat-field-metadata.util.ts | 19 - ...create-on-label-identifier-update.util.ts} | 48 +- ...metadata-and-related-flat-entities.util.ts | 2 - ...object-metadata-update-side-effect.util.ts | 15 +- ...-field-from-search-field-metadatas.util.ts | 112 --- ...search-field-metadata-map-cache.service.ts | 43 +- ...at-search-field-metadata-for-field.util.ts | 4 + ...ession-from-search-field-metadatas.util.ts | 14 +- ...-as-expression-for-ts-vector-field.util.ts | 53 ++ ...tor-flat-field-metadata-for-object.util.ts | 28 + ...adata-to-search-field-metadata-dto.util.ts | 15 + ...tity-to-flat-search-field-metadata.util.ts | 13 + ...al-system-flat-field-metadatas.constant.ts | 8 + .../object-metadata.resolver.ts | 22 + .../object-metadata.service.ts | 6 +- ...-field-metadatas-for-custom-object.util.ts | 9 +- ...-field-metadatas-for-custom-object.util.ts | 2 + .../dtos/search-field-metadata.dto.ts | 57 ++ .../search-field-metadata.exception.ts | 2 + .../search-field-metadata.entity.ts | 18 +- .../workspace-entity-manager.spec.ts | 2 + .../__tests__/workspace.repository.spec.ts | 2 + ...hment-standard-flat-field-metadata.util.ts | 9 - ...klist-standard-flat-field-metadata.util.ts | 9 - ...ation-standard-flat-field-metadata.util.ts | 9 - ...ipant-standard-flat-field-metadata.util.ts | 9 - ...event-standard-flat-field-metadata.util.ts | 9 - ...rding-standard-flat-field-metadata.util.ts | 8 - ...mpany-standard-flat-field-metadata.util.ts | 9 - ...board-standard-flat-field-metadata.util.ts | 9 - ...paign-standard-flat-field-metadata.util.ts | 9 - ...older-standard-flat-field-metadata.util.ts | 9 - ...ation-standard-flat-field-metadata.util.ts | 8 - ...ember-standard-flat-field-metadata.util.ts | 9 - ...-list-standard-flat-field-metadata.util.ts | 9 - ...ipant-standard-flat-field-metadata.util.ts | 9 - ...ssage-standard-flat-field-metadata.util.ts | 9 - ...hread-standard-flat-field-metadata.util.ts | 9 - ...-note-standard-flat-field-metadata.util.ts | 9 - ...arget-standard-flat-field-metadata.util.ts | 9 - ...unity-standard-flat-field-metadata.util.ts | 9 - ...erson-standard-flat-field-metadata.util.ts | 9 - ...-task-standard-flat-field-metadata.util.ts | 9 - ...arget-standard-flat-field-metadata.util.ts | 9 - ...ivity-standard-flat-field-metadata.util.ts | 9 - ...igger-standard-flat-field-metadata.util.ts | 9 - ...w-run-standard-flat-field-metadata.util.ts | 9 - ...kflow-standard-flat-field-metadata.util.ts | 9 - ...rsion-standard-flat-field-metadata.util.ts | 9 - ...ember-standard-flat-field-metadata.util.ts | 8 - ...reate-standard-field-flat-metadata.util.ts | 2 + ...ndard-relation-field-flat-metadata.util.ts | 2 + ...tandard-search-field-flat-metadata.util.ts | 11 + ...orkspace-migration-action-with-ids.util.ts | 35 +- ...ce-migration-build-orchestrator.service.ts | 13 + ...e-orchestrator-actions-report-args.type.ts | 1 + ...ggregator-properties.constant.spec.ts.snap | 1 + ...pdated-matrix-dispatcher.util.spec.ts.snap | 8 + ...ity-maps-through-mutation-or-throw.util.ts | 15 + ...versal-relation-identifiers-to-ids.util.ts | 18 + ...search-vector-update-field-actions.util.ts | 42 +- ...regate-orchestrator-actions-report.util.ts | 2 + .../compute-ordered-migration-actions.util.ts | 8 +- ...build-target-universal-identifiers.util.ts | 91 ++ .../types/workspace-migration-field-action.ts | 8 +- ...search-field-metadata-validator.service.ts | 34 + .../update-field-action-handler.service.ts | 100 ++- ...ld-metadata-to-flat-field-metadata.util.ts | 1 + .../create-object-action-handler.service.ts | 23 +- ...h-field-metadata-action-handler.service.ts | 7 +- .../workspace-migration-runner.service.ts | 5 + ...space-migration-action-runner-args.type.ts | 2 + ...-universal-identifier-from-actions.util.ts | 57 ++ .../utils/generate-column-definitions.util.ts | 14 +- ...ate-action-on-all-flat-entity-maps.util.ts | 15 +- .../get-field-metadata-entity.mock.ts | 1 + ...ect-system-fields.integration-spec.ts.snap | 34 +- ...rkspace-migration.integration-spec.ts.snap | 16 +- ...-expression-validation.integration-spec.ts | 74 -- ...rch-vector-side-effect.integration-spec.ts | 59 +- ...-expression-validation.integration-spec.ts | 148 ---- ...rch-vector-side-effect.integration-spec.ts | 53 +- ...bject-metadata-v2.integration-spec.ts.snap | 75 ++ ...ach-vector-side-effect.integration-spec.ts | 58 -- ...ract-record-ids-and-dates-as-expect-any.ts | 3 +- .../src/types/FieldMetadataSettings.ts | 7 +- 144 files changed, 2030 insertions(+), 1759 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-metadata/types/SearchFieldMetadataItem.ts create mode 100644 packages/twenty-front/src/modules/object-metadata/validation-schemas/searchFieldMetadataItemSchema.ts create mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-fast-1810000001000-add-ts-vector-field-metadata-id-to-search-field-metadata.ts create mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-slow-1810000003000-backfill-ts-vector-field-metadata-id-on-search-field-metadata.ts create mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/2-18/add-ts-vector-field-metadata-id-to-search-field-metadata-upgrade-command-name.constant.ts create mode 100644 packages/twenty-server/src/database/commands/workspace-export/utils/__tests__/generate-workspace-schema-ddl.util.spec.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/__tests__/compute-search-vector-universal-settings-from-object-manifest.util.spec.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-search-vector-on-field-rename.util.ts rename packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/{recompute-search-vector-on-label-identifier-update.util.ts => compute-search-field-metadata-to-create-on-label-identifier-update.util.ts} (68%) delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-flat-search-field-metadata-to-search-field-metadata-dto.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-search-vector-rebuild-target-universal-identifiers.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/build-preallocated-id-by-universal-identifier-from-actions.util.ts delete mode 100644 packages/twenty-server/test/integration/metadata/suites/application/failing-sync-application-search-vector-expression-validation.integration-spec.ts delete mode 100644 packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-expression-validation.integration-spec.ts diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql index 1046d09f7c..4d8d52de11 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql @@ -666,6 +666,7 @@ type Object { duplicateCriteria: [[String!]!] fieldsList: [Field!]! indexMetadataList: [Index!]! + searchFieldMetadataList: [SearchField!]! fields( """Limit or page results.""" paging: CursorPaging! = {first: 10} @@ -2085,6 +2086,15 @@ type ObjectRecordCount { totalCount: Int! } +type SearchField { + id: UUID! + fieldMetadataId: UUID! + tsVectorFieldMetadataId: UUID! + position: Float! + createdAt: DateTime! + updatedAt: DateTime! +} + type ObjectConnection { """Paging information""" pageInfo: PageInfo! diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.ts b/packages/twenty-client-sdk/src/metadata/generated/schema.ts index 50b8f4570e..c75e835726 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.ts @@ -455,6 +455,7 @@ export interface Object { duplicateCriteria?: Scalars['String'][][] fieldsList: Field[] indexMetadataList: Index[] + searchFieldMetadataList: SearchField[] fields: ObjectFieldsConnection indexMetadatas: ObjectIndexMetadatasConnection __typename: 'Object' @@ -1719,6 +1720,16 @@ export interface ObjectRecordCount { __typename: 'ObjectRecordCount' } +export interface SearchField { + id: Scalars['UUID'] + fieldMetadataId: Scalars['UUID'] + tsVectorFieldMetadataId: Scalars['UUID'] + position: Scalars['Float'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + __typename: 'SearchField' +} + export interface ObjectConnection { /** Paging information */ pageInfo: PageInfo @@ -3487,6 +3498,7 @@ export interface ObjectGenqlSelection{ duplicateCriteria?: boolean | number fieldsList?: FieldGenqlSelection indexMetadataList?: IndexGenqlSelection + searchFieldMetadataList?: SearchFieldGenqlSelection fields?: (ObjectFieldsConnectionGenqlSelection & { __args: { /** Limit or page results. */ paging: CursorPaging, @@ -4802,6 +4814,17 @@ export interface ObjectRecordCountGenqlSelection{ __scalar?: boolean | number } +export interface SearchFieldGenqlSelection{ + id?: boolean | number + fieldMetadataId?: boolean | number + tsVectorFieldMetadataId?: boolean | number + position?: boolean | number + createdAt?: boolean | number + updatedAt?: boolean | number + __typename?: boolean | number + __scalar?: boolean | number +} + export interface ObjectConnectionGenqlSelection{ /** Paging information */ pageInfo?: PageInfoGenqlSelection @@ -7771,6 +7794,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null + const SearchField_possibleTypes: string[] = ['SearchField'] + export const isSearchField = (obj?: { __typename?: any } | null): obj is SearchField => { + if (!obj?.__typename) throw new Error('__typename is missing in "isSearchField"') + return SearchField_possibleTypes.includes(obj.__typename) + } + + + const ObjectConnection_possibleTypes: string[] = ['ObjectConnection'] export const isObjectConnection = (obj?: { __typename?: any } | null): obj is ObjectConnection => { if (!obj?.__typename) throw new Error('__typename is missing in "isObjectConnection"') diff --git a/packages/twenty-client-sdk/src/metadata/generated/types.ts b/packages/twenty-client-sdk/src/metadata/generated/types.ts index 67d1ce4c17..ac68e81386 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/types.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/types.ts @@ -59,30 +59,30 @@ export default { 188, 191, 204, - 219, - 231, - 237, - 273, - 275, + 220, + 232, + 238, + 274, 276, 277, 278, 279, 280, 281, - 288, - 327, + 282, + 289, 328, 329, 330, - 332, - 334, - 345, - 352, - 359, - 442, - 487, - 496 + 331, + 333, + 335, + 346, + 353, + 360, + 443, + 488, + 497 ], "types": { "BillingProductDTO": { @@ -1287,8 +1287,11 @@ export default { "indexMetadataList": [ 47 ], + "searchFieldMetadataList": [ + 213 + ], "fields": [ - 216, + 217, { "paging": [ 49, @@ -1301,7 +1304,7 @@ export default { } ], "indexMetadatas": [ - 214, + 215, { "paging": [ 49, @@ -1915,7 +1918,7 @@ export default { 146 ], "billingEntitlements": [ - 230 + 231 ], "hasValidSignedEnterpriseKey": [ 6 @@ -2013,7 +2016,7 @@ export default { 20 ], "deletedWorkspaceMembers": [ - 229 + 230 ], "hasPassword": [ 6 @@ -2025,7 +2028,7 @@ export default { 17 ], "availableWorkspaces": [ - 228 + 229 ], "__typename": [ 1 @@ -4047,6 +4050,29 @@ export default { 1 ] }, + "SearchField": { + "id": [ + 3 + ], + "fieldMetadataId": [ + 3 + ], + "tsVectorFieldMetadataId": [ + 3 + ], + "position": [ + 11 + ], + "createdAt": [ + 4 + ], + "updatedAt": [ + 4 + ], + "__typename": [ + 1 + ] + }, "ObjectConnection": { "pageInfo": [ 206 @@ -4085,7 +4111,7 @@ export default { 206 ], "edges": [ - 215 + 216 ], "__typename": [ 1 @@ -4096,7 +4122,7 @@ export default { 206 ], "edges": [ - 215 + 216 ], "__typename": [ 1 @@ -4104,7 +4130,7 @@ export default { }, "AppConnection": { "id": [ - 219 + 220 ], "providerName": [ 1 @@ -4199,7 +4225,7 @@ export default { 178 ], "workspace": [ - 223 + 224 ], "__typename": [ 1 @@ -4268,7 +4294,7 @@ export default { 1 ], "sso": [ - 226 + 227 ], "__typename": [ 1 @@ -4276,10 +4302,10 @@ export default { }, "AvailableWorkspaces": { "availableWorkspacesForSignIn": [ - 227 + 228 ], "availableWorkspacesForSignUp": [ - 227 + 228 ], "__typename": [ 1 @@ -4307,7 +4333,7 @@ export default { }, "BillingEntitlement": { "key": [ - 231 + 232 ], "value": [ 6 @@ -4345,7 +4371,7 @@ export default { 1 ], "records": [ - 232 + 233 ], "isCustomDomainEnabled": [ 6 @@ -4384,7 +4410,7 @@ export default { 1 ], "connectionSecurity": [ - 237 + 238 ], "__typename": [ 1 @@ -4393,13 +4419,13 @@ export default { "EmailConnectionSecurity": {}, "PublicImapSmtpCaldavConnectionParameters": { "IMAP": [ - 236 + 237 ], "SMTP": [ - 236 + 237 ], "CALDAV": [ - 236 + 237 ], "__typename": [ 1 @@ -4455,7 +4481,7 @@ export default { 4 ], "connectionParameters": [ - 238 + 239 ], "__typename": [ 1 @@ -4506,10 +4532,10 @@ export default { }, "AvailableWorkspacesAndAccessTokens": { "tokens": [ - 244 + 245 ], "availableWorkspaces": [ - 228 + 229 ], "__typename": [ 1 @@ -4561,7 +4587,7 @@ export default { 32 ], "workspace": [ - 249 + 250 ], "__typename": [ 1 @@ -4638,7 +4664,7 @@ export default { }, "AuthTokens": { "tokens": [ - 244 + 245 ], "__typename": [ 1 @@ -4679,7 +4705,7 @@ export default { 32 ], "workspace": [ - 249 + 250 ], "__typename": [ 1 @@ -4701,7 +4727,7 @@ export default { 1 ], "dailyUsage": [ - 262 + 263 ], "__typename": [ 1 @@ -4718,7 +4744,7 @@ export default { 197 ], "timeSeries": [ - 262 + 263 ], "periodStart": [ 4 @@ -4727,7 +4753,7 @@ export default { 4 ], "userDailyUsage": [ - 263 + 264 ], "__typename": [ 1 @@ -4884,10 +4910,10 @@ export default { 1 ], "status": [ - 273 + 274 ], "verificationRecords": [ - 271 + 272 ], "verifiedAt": [ 4 @@ -4902,22 +4928,22 @@ export default { 3 ], "visibility": [ - 275 + 276 ], "handle": [ 1 ], "type": [ - 276 + 277 ], "isContactAutoCreationEnabled": [ 6 ], "contactAutoCreationPolicy": [ - 277 + 278 ], "messageFolderImportPolicy": [ - 278 + 279 ], "excludeNonProfessionalEmails": [ 6 @@ -4926,7 +4952,7 @@ export default { 6 ], "pendingGroupEmailsAction": [ - 279 + 280 ], "isSyncEnabled": [ 6 @@ -4935,10 +4961,10 @@ export default { 4 ], "syncStatus": [ - 280 + 281 ], "syncStage": [ - 281 + 282 ], "syncStageStartedAt": [ 4 @@ -4959,7 +4985,7 @@ export default { 4 ], "connectedAccount": [ - 239 + 240 ], "__typename": [ 1 @@ -4974,7 +5000,7 @@ export default { "MessageChannelSyncStage": {}, "CreateEmailGroupChannelOutput": { "messageChannel": [ - 274 + 275 ], "forwardingAddress": [ 1 @@ -5036,7 +5062,7 @@ export default { 21 ], "skipped": [ - 285 + 286 ], "__typename": [ 1 @@ -5059,7 +5085,7 @@ export default { 1 ], "visibility": [ - 288 + 289 ], "__typename": [ 1 @@ -5105,7 +5131,7 @@ export default { 1 ], "location": [ - 290 + 291 ], "__typename": [ 1 @@ -5122,7 +5148,7 @@ export default { 1 ], "connectionSecurity": [ - 237 + 238 ], "__typename": [ 1 @@ -5130,13 +5156,13 @@ export default { }, "ImapSmtpCaldavPublicConnectionParameters": { "IMAP": [ - 292 + 293 ], "SMTP": [ - 292 + 293 ], "CALDAV": [ - 292 + 293 ], "__typename": [ 1 @@ -5156,7 +5182,7 @@ export default { 3 ], "connectionParameters": [ - 293 + 294 ], "__typename": [ 1 @@ -5378,7 +5404,7 @@ export default { 1 ], "series": [ - 302 + 303 ], "xAxisLabel": [ 1 @@ -5427,7 +5453,7 @@ export default { 1 ], "data": [ - 304 + 305 ], "__typename": [ 1 @@ -5435,7 +5461,7 @@ export default { }, "LineChartData": { "series": [ - 305 + 306 ], "xAxisLabel": [ 1 @@ -5472,7 +5498,7 @@ export default { }, "PieChartData": { "data": [ - 307 + 308 ], "showLegend": [ 6 @@ -5574,13 +5600,13 @@ export default { }, "EventLogQueryResult": { "records": [ - 312 + 313 ], "totalCount": [ 21 ], "pageInfo": [ - 313 + 314 ], "__typename": [ 1 @@ -5644,7 +5670,7 @@ export default { 1 ], "parts": [ - 298 + 299 ], "processedAt": [ 4 @@ -5658,7 +5684,7 @@ export default { }, "AgentChatThread": { "id": [ - 219 + 220 ], "title": [ 1 @@ -5713,7 +5739,7 @@ export default { }, "AiSystemPromptPreview": { "sections": [ - 318 + 319 ], "estimatedTokenCount": [ 21 @@ -5789,10 +5815,10 @@ export default { 3 ], "evaluations": [ - 323 + 324 ], "messages": [ - 316 + 317 ], "createdAt": [ 4 @@ -5823,19 +5849,19 @@ export default { 1 ], "syncStatus": [ - 327 - ], - "syncStage": [ 328 ], - "visibility": [ + "syncStage": [ 329 ], + "visibility": [ + 330 + ], "isContactAutoCreationEnabled": [ 6 ], "contactAutoCreationPolicy": [ - 330 + 331 ], "isSyncEnabled": [ 6 @@ -5886,7 +5912,7 @@ export default { 1 ], "pendingSyncAction": [ - 332 + 333 ], "messageChannelId": [ 3 @@ -5904,7 +5930,7 @@ export default { "MessageFolderPendingSyncAction": {}, "CollectionHash": { "collectionName": [ - 334 + 335 ], "hash": [ 1 @@ -5968,13 +5994,13 @@ export default { }, "MinimalMetadata": { "objectMetadataItems": [ - 335 - ], - "views": [ 336 ], + "views": [ + 337 + ], "collectionHashes": [ - 333 + 334 ], "__typename": [ 1 @@ -6127,7 +6153,7 @@ export default { 2, { "input": [ - 339, + 340, "GetApiKeyInput!" ] } @@ -6230,7 +6256,7 @@ export default { 25, { "input": [ - 340, + 341, "AgentIdInput!" ] } @@ -6248,7 +6274,7 @@ export default { } ], "objects": [ - 213, + 214, { "paging": [ 49, @@ -6286,7 +6312,7 @@ export default { 41, { "input": [ - 341, + 342, "LogicFunctionIdInput!" ] } @@ -6298,7 +6324,7 @@ export default { 15, { "input": [ - 341, + 342, "LogicFunctionIdInput!" ] } @@ -6307,7 +6333,7 @@ export default { 1, { "input": [ - 341, + 342, "LogicFunctionIdInput!" ] } @@ -6366,7 +6392,7 @@ export default { } ], "fields": [ - 217, + 218, { "paging": [ 49, @@ -6470,22 +6496,22 @@ export default { } ], "previewMessageCampaignAudience": [ - 283, + 284, { "input": [ - 342, + 343, "PreviewMessageCampaignAudienceInput!" ] } ], "unsubscribeTopics": [ - 287 + 288 ], "unsubscribePagePreviewUrl": [ 1 ], "myMessageChannels": [ - 274, + 275, { "connectedAccountId": [ 3 @@ -6493,13 +6519,13 @@ export default { } ], "getEmailingDomains": [ - 272 + 273 ], "myConnectedAccounts": [ - 239 + 240 ], "getToolIndex": [ - 297 + 298 ], "getToolInputSchema": [ 15, @@ -6511,10 +6537,10 @@ export default { } ], "webhooks": [ - 296 + 297 ], "webhook": [ - 296, + 297, { "id": [ 3, @@ -6523,7 +6549,7 @@ export default { } ], "myMessageFolders": [ - 331, + 332, { "messageChannelId": [ 3 @@ -6531,7 +6557,7 @@ export default { } ], "myCalendarChannels": [ - 326, + 327, { "connectedAccountId": [ 3 @@ -6539,33 +6565,33 @@ export default { } ], "minimalMetadata": [ - 337 + 338 ], "appConnections": [ - 218, + 219, { "filter": [ - 343 + 344 ] } ], "appConnection": [ - 218, + 219, { "id": [ - 219, + 220, "ID!" ] } ], "findWorkspaceAiStats": [ - 325 + 326 ], "chatThreads": [ - 317 + 318 ], "chatThread": [ - 317, + 318, { "id": [ 3, @@ -6574,7 +6600,7 @@ export default { } ], "chatMessages": [ - 316, + 317, { "threadId": [ 3, @@ -6583,7 +6609,7 @@ export default { } ], "chatStreamCatchupChunks": [ - 320, + 321, { "threadId": [ 3, @@ -6592,13 +6618,13 @@ export default { } ], "getAiSystemPromptPreview": [ - 319 + 320 ], "skills": [ - 315 + 316 ], "skill": [ - 315, + 316, { "id": [ 3, @@ -6607,7 +6633,7 @@ export default { } ], "agentTurns": [ - 324, + 325, { "agentId": [ 3, @@ -6616,7 +6642,7 @@ export default { } ], "checkUserExists": [ - 259, + 260, { "email": [ 1, @@ -6628,7 +6654,7 @@ export default { } ], "checkWorkspaceInviteHashIsValid": [ - 260, + 261, { "inviteHash": [ 1, @@ -6646,7 +6672,7 @@ export default { } ], "checkWorkspaceSubdomainAvailability": [ - 254, + 255, { "subdomain": [ 1, @@ -6655,10 +6681,10 @@ export default { } ], "getWorkspaceCreationDefaults": [ - 255 + 256 ], "validatePasswordResetToken": [ - 252, + 253, { "passwordResetToken": [ 1, @@ -6670,46 +6696,46 @@ export default { 79 ], "getSSOIdentityProviders": [ - 224 + 225 ], "eventLogs": [ - 314, + 315, { "input": [ - 344, + 345, "EventLogQueryInput!" ] } ], "pieChartData": [ - 308, + 309, { "input": [ - 348, + 349, "PieChartDataInput!" ] } ], "lineChartData": [ - 306, + 307, { "input": [ - 349, + 350, "LineChartDataInput!" ] } ], "barChartData": [ - 303, + 304, { "input": [ - 350, + 351, "BarChartDataInput!" ] } ], "getConnectedImapSmtpCaldavAccount": [ - 294, + 295, { "id": [ 3, @@ -6718,7 +6744,7 @@ export default { } ], "getAutoCompleteAddress": [ - 289, + 290, { "address": [ 1, @@ -6737,7 +6763,7 @@ export default { } ], "getAddressDetails": [ - 291, + 292, { "placeId": [ 1, @@ -6750,21 +6776,21 @@ export default { } ], "getUsageAnalytics": [ - 264, + 265, { "input": [ - 351 + 352 ] } ], "findManyPublicDomains": [ - 270 + 271 ], "findManyMarketplaceApps": [ - 268 + 269 ], "findMarketplaceAppDetail": [ - 269, + 270, { "universalIdentifier": [ 1, @@ -6794,7 +6820,7 @@ export default { }, "LogicFunctionIdInput": { "id": [ - 219 + 220 ], "__typename": [ 1 @@ -6827,10 +6853,10 @@ export default { }, "EventLogQueryInput": { "table": [ - 345 + 346 ], "filters": [ - 346 + 347 ], "first": [ 21 @@ -6851,7 +6877,7 @@ export default { 1 ], "dateRange": [ - 347 + 348 ], "recordId": [ 1 @@ -6918,7 +6944,7 @@ export default { 1 ], "operationTypes": [ - 352 + 353 ], "__typename": [ 1 @@ -6930,7 +6956,7 @@ export default { 6, { "input": [ - 354, + 355, "AddQuerySubscriptionInput!" ] } @@ -6939,7 +6965,7 @@ export default { 6, { "input": [ - 355, + 356, "RemoveQueryFromEventStreamInput!" ] } @@ -6948,7 +6974,7 @@ export default { 160, { "inputs": [ - 356, + 357, "[CreateNavigationMenuItemInput!]!" ] } @@ -6957,7 +6983,7 @@ export default { 160, { "input": [ - 356, + 357, "CreateNavigationMenuItemInput!" ] } @@ -6966,7 +6992,7 @@ export default { 160, { "inputs": [ - 357, + 358, "[UpdateOneNavigationMenuItemInput!]!" ] } @@ -6975,7 +7001,7 @@ export default { 160, { "input": [ - 357, + 358, "UpdateOneNavigationMenuItemInput!" ] } @@ -7002,7 +7028,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ] } @@ -7023,7 +7049,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ] } @@ -7032,7 +7058,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ] } @@ -7041,7 +7067,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ] } @@ -7050,7 +7076,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ] } @@ -7059,7 +7085,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ], "fieldMetadataId": [ @@ -7072,7 +7098,7 @@ export default { 131, { "file": [ - 359, + 360, "Upload!" ], "fieldMetadataUniversalIdentifier": [ @@ -7085,7 +7111,7 @@ export default { 62, { "input": [ - 360, + 361, "CreateViewFilterGroupInput!" ] } @@ -7098,7 +7124,7 @@ export default { "String!" ], "input": [ - 361, + 362, "UpdateViewFilterGroupInput!" ] } @@ -7125,7 +7151,7 @@ export default { 64, { "input": [ - 362, + 363, "CreateViewFilterInput!" ] } @@ -7134,7 +7160,7 @@ export default { 64, { "input": [ - 363, + 364, "UpdateViewFilterInput!" ] } @@ -7143,7 +7169,7 @@ export default { 64, { "input": [ - 365, + 366, "DeleteViewFilterInput!" ] } @@ -7152,7 +7178,7 @@ export default { 64, { "input": [ - 366, + 367, "DestroyViewFilterInput!" ] } @@ -7161,7 +7187,7 @@ export default { 70, { "input": [ - 367, + 368, "CreateViewInput!" ] } @@ -7174,7 +7200,7 @@ export default { "String!" ], "input": [ - 368, + 369, "UpdateViewInput!" ] } @@ -7201,7 +7227,7 @@ export default { 70, { "input": [ - 369, + 370, "UpsertViewWidgetInput!" ] } @@ -7210,7 +7236,7 @@ export default { 67, { "input": [ - 374, + 375, "CreateViewSortInput!" ] } @@ -7219,7 +7245,7 @@ export default { 67, { "input": [ - 375, + 376, "UpdateViewSortInput!" ] } @@ -7228,7 +7254,7 @@ export default { 6, { "input": [ - 377, + 378, "DeleteViewSortInput!" ] } @@ -7237,7 +7263,7 @@ export default { 6, { "input": [ - 378, + 379, "DestroyViewSortInput!" ] } @@ -7246,7 +7272,7 @@ export default { 60, { "input": [ - 379, + 380, "UpdateViewFieldInput!" ] } @@ -7255,7 +7281,7 @@ export default { 60, { "input": [ - 381, + 382, "CreateViewFieldInput!" ] } @@ -7264,7 +7290,7 @@ export default { 60, { "inputs": [ - 381, + 382, "[CreateViewFieldInput!]!" ] } @@ -7273,7 +7299,7 @@ export default { 60, { "input": [ - 382, + 383, "DeleteViewFieldInput!" ] } @@ -7282,7 +7308,7 @@ export default { 60, { "input": [ - 383, + 384, "DestroyViewFieldInput!" ] } @@ -7291,7 +7317,7 @@ export default { 69, { "input": [ - 384, + 385, "UpdateViewFieldGroupInput!" ] } @@ -7300,7 +7326,7 @@ export default { 69, { "input": [ - 386, + 387, "CreateViewFieldGroupInput!" ] } @@ -7309,7 +7335,7 @@ export default { 69, { "inputs": [ - 386, + 387, "[CreateViewFieldGroupInput!]!" ] } @@ -7318,7 +7344,7 @@ export default { 69, { "input": [ - 387, + 388, "DeleteViewFieldGroupInput!" ] } @@ -7327,7 +7353,7 @@ export default { 69, { "input": [ - 388, + 389, "DestroyViewFieldGroupInput!" ] } @@ -7336,7 +7362,7 @@ export default { 70, { "input": [ - 389, + 390, "UpsertFieldsWidgetInput!" ] } @@ -7345,7 +7371,7 @@ export default { 2, { "input": [ - 392, + 393, "CreateApiKeyInput!" ] } @@ -7354,7 +7380,7 @@ export default { 2, { "input": [ - 393, + 394, "UpdateApiKeyInput!" ] } @@ -7363,7 +7389,7 @@ export default { 2, { "input": [ - 394, + 395, "RevokeApiKeyInput!" ] } @@ -7512,7 +7538,7 @@ export default { 130, { "input": [ - 395, + 396, "CreateApprovedAccessDomainInput!" ] } @@ -7521,7 +7547,7 @@ export default { 6, { "input": [ - 396, + 397, "DeleteApprovedAccessDomainInput!" ] } @@ -7530,7 +7556,7 @@ export default { 130, { "input": [ - 397, + 398, "ValidateApprovedAccessDomainInput!" ] } @@ -7539,7 +7565,7 @@ export default { 123, { "input": [ - 398, + 399, "CreatePageLayoutTabInput!" ] } @@ -7552,7 +7578,7 @@ export default { "String!" ], "input": [ - 399, + 400, "UpdatePageLayoutTabInput!" ] } @@ -7570,7 +7596,7 @@ export default { 124, { "input": [ - 400, + 401, "CreatePageLayoutInput!" ] } @@ -7583,7 +7609,7 @@ export default { "String!" ], "input": [ - 401, + 402, "UpdatePageLayoutInput!" ] } @@ -7605,7 +7631,7 @@ export default { "String!" ], "input": [ - 402, + 403, "UpdatePageLayoutWithTabsInput!" ] } @@ -7641,7 +7667,7 @@ export default { 85, { "input": [ - 406, + 407, "CreatePageLayoutWidgetInput!" ] } @@ -7654,7 +7680,7 @@ export default { "String!" ], "input": [ - 407, + 408, "UpdatePageLayoutWidgetInput!" ] } @@ -7672,7 +7698,7 @@ export default { 25, { "input": [ - 408, + 409, "CreateAgentInput!" ] } @@ -7681,7 +7707,7 @@ export default { 25, { "input": [ - 409, + 410, "UpdateAgentInput!" ] } @@ -7690,7 +7716,7 @@ export default { 25, { "input": [ - 340, + 341, "AgentIdInput!" ] } @@ -7699,7 +7725,7 @@ export default { 56, { "input": [ - 410, + 411, "CreateOneObjectInput!" ] } @@ -7708,7 +7734,7 @@ export default { 56, { "input": [ - 412, + 413, "DeleteOneObjectInput!" ] } @@ -7717,7 +7743,7 @@ export default { 56, { "input": [ - 413, + 414, "UpdateOneObjectInput!" ] } @@ -7726,7 +7752,7 @@ export default { 47, { "input": [ - 415, + 416, "CreateOneIndexInput!" ] } @@ -7735,7 +7761,7 @@ export default { 47, { "input": [ - 418, + 419, "DeleteOneIndexInput!" ] } @@ -7744,7 +7770,7 @@ export default { 41, { "input": [ - 341, + 342, "LogicFunctionIdInput!" ] } @@ -7753,7 +7779,7 @@ export default { 41, { "input": [ - 419, + 420, "CreateLogicFunctionFromSourceInput!" ] } @@ -7762,7 +7788,7 @@ export default { 169, { "input": [ - 420, + 421, "ExecuteOneLogicFunctionInput!" ] } @@ -7771,7 +7797,7 @@ export default { 6, { "input": [ - 421, + 422, "UpdateLogicFunctionFromSourceInput!" ] } @@ -7780,7 +7806,7 @@ export default { 35, { "input": [ - 423, + 424, "CreateCommandMenuItemInput!" ] } @@ -7789,7 +7815,7 @@ export default { 35, { "input": [ - 424, + 425, "UpdateCommandMenuItemInput!" ] } @@ -7816,7 +7842,7 @@ export default { 34, { "input": [ - 425, + 426, "CreateFrontComponentInput!" ] } @@ -7825,7 +7851,7 @@ export default { 34, { "input": [ - 426, + 427, "UpdateFrontComponentInput!" ] } @@ -7843,7 +7869,7 @@ export default { 76, { "data": [ - 428, + 429, "ActivateWorkspaceInput!" ] } @@ -7852,7 +7878,7 @@ export default { 76, { "data": [ - 429, + 430, "UpdateWorkspaceInput!" ] } @@ -7861,13 +7887,13 @@ export default { 76 ], "checkCustomDomainValidRecords": [ - 233 + 234 ], "createOneField": [ 44, { "input": [ - 430, + 431, "CreateOneFieldMetadataInput!" ] } @@ -7876,7 +7902,7 @@ export default { 44, { "input": [ - 432, + 433, "UpdateOneFieldMetadataInput!" ] } @@ -7885,7 +7911,7 @@ export default { 44, { "input": [ - 434, + 435, "DeleteOneFieldInput!" ] } @@ -7894,7 +7920,7 @@ export default { 66, { "input": [ - 435, + 436, "CreateViewGroupInput!" ] } @@ -7903,7 +7929,7 @@ export default { 66, { "inputs": [ - 435, + 436, "[CreateViewGroupInput!]!" ] } @@ -7912,7 +7938,7 @@ export default { 66, { "input": [ - 436, + 437, "UpdateViewGroupInput!" ] } @@ -7921,7 +7947,7 @@ export default { 66, { "inputs": [ - 436, + 437, "[UpdateViewGroupInput!]!" ] } @@ -7930,7 +7956,7 @@ export default { 66, { "input": [ - 438, + 439, "DeleteViewGroupInput!" ] } @@ -7939,7 +7965,7 @@ export default { 66, { "input": [ - 439, + 440, "DestroyViewGroupInput!" ] } @@ -7948,7 +7974,7 @@ export default { 6, { "workspaceMigration": [ - 440, + 441, "WorkspaceMigrationInput!" ] } @@ -7979,7 +8005,7 @@ export default { 29, { "createRoleInput": [ - 443, + 444, "CreateRoleInput!" ] } @@ -7988,7 +8014,7 @@ export default { 29, { "updateRoleInput": [ - 444, + 445, "UpdateRoleInput!" ] } @@ -8006,7 +8032,7 @@ export default { 16, { "upsertObjectPermissionsInput": [ - 446, + 447, "UpsertObjectPermissionsInput!" ] } @@ -8015,7 +8041,7 @@ export default { 27, { "upsertPermissionFlagsInput": [ - 448, + 449, "UpsertPermissionFlagsInput!" ] } @@ -8024,16 +8050,16 @@ export default { 26, { "upsertFieldPermissionsInput": [ - 449, + 450, "UpsertFieldPermissionsInput!" ] } ], "upsertRowLevelPermissionPredicates": [ - 234, + 235, { "input": [ - 451, + 452, "UpsertRowLevelPermissionPredicatesInput!" ] } @@ -8064,7 +8090,7 @@ export default { 200, { "input": [ - 454, + 455, "CreateApplicationRegistrationInput!" ] } @@ -8073,7 +8099,7 @@ export default { 7, { "input": [ - 455, + 456, "UpdateApplicationRegistrationInput!" ] } @@ -8100,7 +8126,7 @@ export default { 5, { "input": [ - 457, + 458, "CreateApplicationRegistrationVariableInput!" ] } @@ -8109,7 +8135,7 @@ export default { 5, { "input": [ - 458, + 459, "UpdateApplicationRegistrationVariableInput!" ] } @@ -8127,7 +8153,7 @@ export default { 7, { "file": [ - 359, + 360, "Upload!" ], "universalIdentifier": [ @@ -8149,37 +8175,37 @@ export default { } ], "sendEmailViaEmailingDomain": [ - 284, + 285, { "input": [ - 460, + 461, "SendEmailViaDomainInput!" ] } ], "sendMessageCampaign": [ - 286, + 287, { "input": [ - 461, + 462, "SendMessageCampaignInput!" ] } ], "createUnsubscribeTopic": [ - 287, + 288, { "input": [ - 462, + 463, "CreateUnsubscribeTopicInput!" ] } ], "updateUnsubscribeTopic": [ - 287, + 288, { "input": [ - 463, + 464, "UpdateUnsubscribeTopicInput!" ] } @@ -8194,25 +8220,25 @@ export default { } ], "updateMessageChannel": [ - 274, + 275, { "input": [ - 464, + 465, "UpdateMessageChannelInput!" ] } ], "createEmailGroupChannel": [ - 282, + 283, { "input": [ - 466, + 467, "CreateEmailGroupChannelInput!" ] } ], "deleteEmailGroupChannel": [ - 274, + 275, { "id": [ 3, @@ -8221,10 +8247,10 @@ export default { } ], "createEmailingDomain": [ - 272, + 273, { "input": [ - 467, + 468, "CreateEmailingDomainInput!" ] } @@ -8239,7 +8265,7 @@ export default { } ], "verifyEmailingDomain": [ - 272, + 273, { "id": [ 1, @@ -8248,7 +8274,7 @@ export default { } ], "deleteConnectedAccount": [ - 239, + 240, { "id": [ 3, @@ -8257,34 +8283,34 @@ export default { } ], "runAgent": [ - 299, + 300, { "input": [ - 468, + 469, "RunAgentInput!" ] } ], "createWebhook": [ - 296, + 297, { "input": [ - 469, + 470, "CreateWebhookInput!" ] } ], "updateWebhook": [ - 296, + 297, { "input": [ - 470, + 471, "UpdateWebhookInput!" ] } ], "deleteWebhook": [ - 296, + 297, { "id": [ 3, @@ -8293,37 +8319,37 @@ export default { } ], "updateMessageFolder": [ - 331, + 332, { "input": [ - 472, + 473, "UpdateMessageFolderInput!" ] } ], "updateMessageFolders": [ - 331, + 332, { "input": [ - 474, + 475, "UpdateMessageFoldersInput!" ] } ], "updateCalendarChannel": [ - 326, + 327, { "input": [ - 475, + 476, "UpdateCalendarChannelInput!" ] } ], "createChatThread": [ - 317 + 318 ], "sendChatMessage": [ - 321, + 322, { "threadId": [ 3, @@ -8344,7 +8370,7 @@ export default { 1 ], "fileAttachments": [ - 477, + 478, "[FileAttachmentInput!]" ] } @@ -8359,7 +8385,7 @@ export default { } ], "renameChatThread": [ - 317, + 318, { "id": [ 3, @@ -8372,7 +8398,7 @@ export default { } ], "archiveChatThread": [ - 317, + 318, { "id": [ 3, @@ -8381,7 +8407,7 @@ export default { } ], "unarchiveChatThread": [ - 317, + 318, { "id": [ 3, @@ -8408,25 +8434,25 @@ export default { } ], "createSkill": [ - 315, + 316, { "input": [ - 478, + 479, "CreateSkillInput!" ] } ], "updateSkill": [ - 315, + 316, { "input": [ - 479, + 480, "UpdateSkillInput!" ] } ], "deleteSkill": [ - 315, + 316, { "id": [ 3, @@ -8435,7 +8461,7 @@ export default { } ], "activateSkill": [ - 315, + 316, { "id": [ 3, @@ -8444,7 +8470,7 @@ export default { } ], "deactivateSkill": [ - 315, + 316, { "id": [ 3, @@ -8453,7 +8479,7 @@ export default { } ], "evaluateAgentTurn": [ - 323, + 324, { "turnId": [ 3, @@ -8462,7 +8488,7 @@ export default { } ], "runEvaluationInput": [ - 324, + 325, { "agentId": [ 3, @@ -8475,16 +8501,16 @@ export default { } ], "getAuthorizationUrlForSSO": [ - 247, + 248, { "input": [ - 480, + 481, "GetAuthorizationUrlForSSOInput!" ] } ], "getLoginTokenFromCredentials": [ - 258, + 259, { "email": [ 1, @@ -8510,7 +8536,7 @@ export default { } ], "signIn": [ - 245, + 246, { "email": [ 1, @@ -8532,7 +8558,7 @@ export default { } ], "verifyEmailAndGetLoginToken": [ - 253, + 254, { "emailVerificationToken": [ 1, @@ -8552,7 +8578,7 @@ export default { } ], "verifyEmailAndGetWorkspaceAgnosticToken": [ - 245, + 246, { "emailVerificationToken": [ 1, @@ -8568,7 +8594,7 @@ export default { } ], "getAuthTokensFromOTP": [ - 257, + 258, { "otp": [ 1, @@ -8588,7 +8614,7 @@ export default { } ], "signUp": [ - 245, + 246, { "email": [ 1, @@ -8610,7 +8636,7 @@ export default { } ], "signUpInWorkspace": [ - 250, + 251, { "email": [ 1, @@ -8641,10 +8667,10 @@ export default { } ], "signUpInNewWorkspace": [ - 250, + 251, { "input": [ - 481 + 482 ] } ], @@ -8656,16 +8682,16 @@ export default { "String!" ], "file": [ - 359, + 360, "Upload!" ] } ], "generateTransientToken": [ - 251 + 252 ], "getAuthTokensFromLoginToken": [ - 257, + 258, { "loginToken": [ 1, @@ -8678,7 +8704,7 @@ export default { } ], "authorizeApp": [ - 243, + 244, { "clientId": [ 1, @@ -8700,7 +8726,7 @@ export default { } ], "renewToken": [ - 257, + 258, { "appToken": [ 1, @@ -8709,7 +8735,7 @@ export default { } ], "generateApiKeyToken": [ - 256, + 257, { "apiKeyId": [ 3, @@ -8725,7 +8751,7 @@ export default { 32 ], "emailPasswordResetLink": [ - 246, + 247, { "email": [ 1, @@ -8737,7 +8763,7 @@ export default { } ], "updatePasswordViaResetToken": [ - 248, + 249, { "passwordResetToken": [ 1, @@ -8750,7 +8776,7 @@ export default { } ], "initiateOTPProvisioning": [ - 241, + 242, { "loginToken": [ 1, @@ -8763,10 +8789,10 @@ export default { } ], "initiateOTPProvisioningForAuthenticatedUser": [ - 241 + 242 ], "deleteTwoFactorAuthenticationMethod": [ - 240, + 241, { "twoFactorAuthenticationMethodId": [ 3, @@ -8775,7 +8801,7 @@ export default { } ], "verifyTwoFactorAuthenticationMethodForAuthenticatedUser": [ - 242, + 243, { "otp": [ 1, @@ -8799,7 +8825,7 @@ export default { 6, { "input": [ - 482, + 483, "UpdateWorkspaceMemberSettingsInput!" ] } @@ -8817,7 +8843,7 @@ export default { } ], "resendEmailVerificationToken": [ - 220, + 221, { "email": [ 1, @@ -8830,43 +8856,43 @@ export default { } ], "createOIDCIdentityProvider": [ - 225, + 226, { "input": [ - 483, + 484, "SetupOIDCSsoInput!" ] } ], "createSAMLIdentityProvider": [ - 225, + 226, { "input": [ - 484, + 485, "SetupSAMLSsoInput!" ] } ], "deleteSSOIdentityProvider": [ - 221, + 222, { "input": [ - 485, + 486, "DeleteSsoInput!" ] } ], "editSSOIdentityProvider": [ - 222, + 223, { "input": [ - 486, + 487, "EditSsoInput!" ] } ], "createObjectEvent": [ - 311, + 312, { "event": [ 1, @@ -8886,10 +8912,10 @@ export default { } ], "trackAnalytics": [ - 311, + 312, { "type": [ - 487, + 488, "AnalyticsType!" ], "name": [ @@ -8904,7 +8930,7 @@ export default { } ], "duplicateDashboard": [ - 309, + 310, { "id": [ 3, @@ -8913,7 +8939,7 @@ export default { } ], "impersonate": [ - 261, + 262, { "userId": [ 3, @@ -8926,25 +8952,25 @@ export default { } ], "createCalendarEvent": [ - 301, + 302, { "input": [ - 488, + 489, "CreateCalendarEventInput!" ] } ], "sendEmail": [ - 310, + 311, { "input": [ - 489, + 490, "SendEmailInput!" ] } ], "startChannelSync": [ - 300, + 301, { "connectedAccountId": [ 3, @@ -8953,14 +8979,14 @@ export default { } ], "saveImapSmtpCaldavAccount": [ - 295, + 296, { "handle": [ 1, "String!" ], "connectionParameters": [ - 491, + 492, "EmailAccountConnectionParameters!" ], "id": [ @@ -8972,13 +8998,13 @@ export default { 171, { "input": [ - 493, + 494, "UpdateLabPublicFeatureFlagInput!" ] } ], "createPublicDomain": [ - 270, + 271, { "domain": [ 1, @@ -9000,7 +9026,7 @@ export default { } ], "checkPublicDomainValidRecords": [ - 233, + 234, { "domain": [ 1, @@ -9012,7 +9038,7 @@ export default { 78, { "input": [ - 494, + 495, "CreateOneAppTokenInput!" ] } @@ -9045,7 +9071,7 @@ export default { 6 ], "createDevelopmentApplication": [ - 265, + 266, { "universalIdentifier": [ 1, @@ -9067,7 +9093,7 @@ export default { } ], "syncApplication": [ - 266, + 267, { "manifest": [ 15, @@ -9079,10 +9105,10 @@ export default { } ], "uploadApplicationFile": [ - 267, + 268, { "file": [ - 359, + 360, "Upload!" ], "applicationUniversalIdentifier": [ @@ -9090,7 +9116,7 @@ export default { "String!" ], "fileFolder": [ - 496, + 497, "FileFolder!" ], "filePath": [ @@ -9199,7 +9225,7 @@ export default { 3 ], "update": [ - 358 + 359 ], "__typename": [ 1 @@ -9309,7 +9335,7 @@ export default { 3 ], "update": [ - 364 + 365 ], "__typename": [ 1 @@ -9474,17 +9500,17 @@ export default { 3 ], "viewFields": [ - 370 - ], - "viewFilters": [ 371 ], - "viewFilterGroups": [ + "viewFilters": [ 372 ], - "viewSorts": [ + "viewFilterGroups": [ 373 ], + "viewSorts": [ + 374 + ], "__typename": [ 1 ] @@ -9594,7 +9620,7 @@ export default { 3 ], "update": [ - 376 + 377 ], "__typename": [ 1 @@ -9632,7 +9658,7 @@ export default { 3 ], "update": [ - 380 + 381 ], "__typename": [ 1 @@ -9708,7 +9734,7 @@ export default { 3 ], "update": [ - 385 + 386 ], "__typename": [ 1 @@ -9772,10 +9798,10 @@ export default { 3 ], "groups": [ - 390 + 391 ], "fields": [ - 391 + 392 ], "__typename": [ 1 @@ -9795,7 +9821,7 @@ export default { 6 ], "fields": [ - 391 + 392 ], "__typename": [ 1 @@ -9963,7 +9989,7 @@ export default { 3 ], "tabs": [ - 403 + 404 ], "__typename": [ 1 @@ -9986,7 +10012,7 @@ export default { 89 ], "widgets": [ - 404 + 405 ], "__typename": [ 1 @@ -10009,7 +10035,7 @@ export default { 3 ], "gridPosition": [ - 405 + 406 ], "position": [ 15 @@ -10058,7 +10084,7 @@ export default { 3 ], "gridPosition": [ - 405 + 406 ], "position": [ 15 @@ -10084,7 +10110,7 @@ export default { 3 ], "gridPosition": [ - 405 + 406 ], "position": [ 15 @@ -10177,7 +10203,7 @@ export default { }, "CreateOneObjectInput": { "object": [ - 411 + 412 ], "__typename": [ 1 @@ -10237,7 +10263,7 @@ export default { }, "UpdateOneObjectInput": { "update": [ - 414 + 415 ], "id": [ 3 @@ -10292,7 +10318,7 @@ export default { }, "CreateOneIndexInput": { "index": [ - 416 + 417 ], "__typename": [ 1 @@ -10303,7 +10329,7 @@ export default { 3 ], "fields": [ - 417 + 418 ], "indexType": [ 48 @@ -10388,7 +10414,7 @@ export default { 3 ], "update": [ - 422 + 423 ], "__typename": [ 1 @@ -10548,7 +10574,7 @@ export default { 3 ], "update": [ - 427 + 428 ], "__typename": [ 1 @@ -10652,7 +10678,7 @@ export default { }, "CreateOneFieldMetadataInput": { "field": [ - 431 + 432 ], "__typename": [ 1 @@ -10725,7 +10751,7 @@ export default { 3 ], "update": [ - 433 + 434 ], "__typename": [ 1 @@ -10820,7 +10846,7 @@ export default { 3 ], "update": [ - 437 + 438 ], "__typename": [ 1 @@ -10861,7 +10887,7 @@ export default { }, "WorkspaceMigrationInput": { "actions": [ - 441 + 442 ], "__typename": [ 1 @@ -10869,10 +10895,10 @@ export default { }, "WorkspaceMigrationDeleteActionInput": { "type": [ - 442 + 443 ], "metadataName": [ - 334 + 335 ], "universalIdentifier": [ 1 @@ -10928,7 +10954,7 @@ export default { }, "UpdateRoleInput": { "update": [ - 445 + 446 ], "id": [ 3 @@ -10983,7 +11009,7 @@ export default { 3 ], "objectPermissions": [ - 447 + 448 ], "__typename": [ 1 @@ -11025,7 +11051,7 @@ export default { 3 ], "fieldPermissions": [ - 450 + 451 ], "__typename": [ 1 @@ -11056,10 +11082,10 @@ export default { 3 ], "predicates": [ - 452 + 453 ], "predicateGroups": [ - 453 + 454 ], "__typename": [ 1 @@ -11139,7 +11165,7 @@ export default { 1 ], "update": [ - 456 + 457 ], "__typename": [ 1 @@ -11190,7 +11216,7 @@ export default { 1 ], "update": [ - 459 + 460 ], "__typename": [ 1 @@ -11270,7 +11296,7 @@ export default { 1 ], "visibility": [ - 288 + 289 ], "__typename": [ 1 @@ -11287,7 +11313,7 @@ export default { 1 ], "visibility": [ - 288 + 289 ], "__typename": [ 1 @@ -11298,7 +11324,7 @@ export default { 3 ], "update": [ - 465 + 466 ], "__typename": [ 1 @@ -11306,16 +11332,16 @@ export default { }, "UpdateMessageChannelInputUpdates": { "visibility": [ - 275 + 276 ], "isContactAutoCreationEnabled": [ 6 ], "contactAutoCreationPolicy": [ - 277 + 278 ], "messageFolderImportPolicy": [ - 278 + 279 ], "isSyncEnabled": [ 6 @@ -11382,7 +11408,7 @@ export default { 3 ], "update": [ - 471 + 472 ], "__typename": [ 1 @@ -11410,7 +11436,7 @@ export default { 3 ], "update": [ - 473 + 474 ], "__typename": [ 1 @@ -11429,7 +11455,7 @@ export default { 3 ], "update": [ - 473 + 474 ], "__typename": [ 1 @@ -11440,7 +11466,7 @@ export default { 3 ], "update": [ - 476 + 477 ], "__typename": [ 1 @@ -11448,13 +11474,13 @@ export default { }, "UpdateCalendarChannelInputUpdates": { "visibility": [ - 329 + 330 ], "isContactAutoCreationEnabled": [ 6 ], "contactAutoCreationPolicy": [ - 330 + 331 ], "isSyncEnabled": [ 6 @@ -11677,7 +11703,7 @@ export default { 1 ], "files": [ - 490 + 491 ], "__typename": [ 1 @@ -11696,13 +11722,13 @@ export default { }, "EmailAccountConnectionParameters": { "IMAP": [ - 492 + 493 ], "SMTP": [ - 492 + 493 ], "CALDAV": [ - 492 + 493 ], "__typename": [ 1 @@ -11722,7 +11748,7 @@ export default { 1 ], "connectionSecurity": [ - 237 + 238 ], "__typename": [ 1 @@ -11741,7 +11767,7 @@ export default { }, "CreateOneAppTokenInput": { "appToken": [ - 495 + 496 ], "__typename": [ 1 @@ -11767,16 +11793,16 @@ export default { } ], "logicFunctionLogs": [ - 235, + 236, { "input": [ - 498, + 499, "LogicFunctionLogsInput!" ] } ], "onAgentChatEvent": [ - 322, + 323, { "threadId": [ 3, @@ -11785,10 +11811,10 @@ export default { } ], "eventLogsLive": [ - 312, + 313, { "table": [ - 345, + 346, "EventLogTable!" ] } diff --git a/packages/twenty-front/scripts/mock-data/generate-object-metadata.ts b/packages/twenty-front/scripts/mock-data/generate-object-metadata.ts index 84a3c3cf36..bfcf35f489 100644 --- a/packages/twenty-front/scripts/mock-data/generate-object-metadata.ts +++ b/packages/twenty-front/scripts/mock-data/generate-object-metadata.ts @@ -33,6 +33,15 @@ const METADATA_QUERY = ` isLabelSyncedWithName isSearchable duplicateCriteria + searchFieldMetadataList { + __typename + id + fieldMetadataId + tsVectorFieldMetadataId + position + createdAt + updatedAt + } indexMetadataList { __typename id diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 7b481670a2..84b5ea4487 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -3870,6 +3870,7 @@ export type Object = { labelSingular: Scalars['String']['output']; namePlural: Scalars['String']['output']; nameSingular: Scalars['String']['output']; + searchFieldMetadataList: Array; shortcut?: Maybe; standardOverrides?: Maybe; universalIdentifier: Scalars['String']['output']; @@ -4976,6 +4977,16 @@ export enum SsoIdentityProviderStatus { Inactive = 'Inactive' } +export type SearchField = { + __typename?: 'SearchField'; + createdAt: Scalars['DateTime']['output']; + fieldMetadataId: Scalars['UUID']['output']; + id: Scalars['UUID']['output']; + position: Scalars['Float']['output']; + tsVectorFieldMetadataId: Scalars['UUID']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + export type SendChatMessageResult = { __typename?: 'SendChatMessageResult'; messageId: Scalars['String']['output']; @@ -6611,7 +6622,7 @@ export type TrackAnalyticsMutationVariables = Exact<{ export type TrackAnalyticsMutation = { __typename?: 'Mutation', trackAnalytics: { __typename?: 'Analytics', success: boolean } }; -export type ApplicationFieldsFragment = { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> }; +export type ApplicationFieldsFragment = { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, searchFieldMetadataList: Array<{ __typename?: 'SearchField', id: string, fieldMetadataId: string, tsVectorFieldMetadataId: string, position: number, createdAt: string, updatedAt: string }>, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> }; export type FindManyApplicationsQueryVariables = Exact<{ [key: string]: never; }>; @@ -6623,14 +6634,14 @@ export type FindOneApplicationQueryVariables = Exact<{ }>; -export type FindOneApplicationQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> } }; +export type FindOneApplicationQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, searchFieldMetadataList: Array<{ __typename?: 'SearchField', id: string, fieldMetadataId: string, tsVectorFieldMetadataId: string, position: number, createdAt: string, updatedAt: string }>, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> } }; export type FindOneApplicationByUniversalIdentifierQueryVariables = Exact<{ universalIdentifier: Scalars['UUID']['input']; }>; -export type FindOneApplicationByUniversalIdentifierQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> } }; +export type FindOneApplicationByUniversalIdentifierQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string, name: string, description?: string | null, logo?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType, logoUrl?: string | null } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, frontComponents: Array<{ __typename?: 'FrontComponent', id: string, name: string, description?: string | null, applicationId: string, componentName: string, builtComponentChecksum: string, universalIdentifier?: string | null, isHeadless: boolean, usesSdkClient: boolean, createdAt: string, updatedAt: string }>, commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, label: string, shortLabel?: string | null, icon?: string | null, isPinned: boolean, availabilityType: CommandMenuItemAvailabilityType, conditionalAvailabilityExpression?: string | null, frontComponentId?: string | null, universalIdentifier?: string | null, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, searchFieldMetadataList: Array<{ __typename?: 'SearchField', id: string, fieldMetadataId: string, tsVectorFieldMetadataId: string, position: number, createdAt: string, updatedAt: string }>, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, executionMode: LogicFunctionExecutionMode, sourceHandlerPath: string, handlerName: string, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, toolTriggerSettings?: any | null, workflowActionTriggerSettings?: any | null, applicationId?: string | null, universalIdentifier?: string | null, createdAt: string, updatedAt: string }> } }; export type FindOneApplicationSummaryQueryVariables = Exact<{ universalIdentifier: Scalars['UUID']['input']; @@ -7184,7 +7195,7 @@ export type FindOneNavigationMenuItemQueryVariables = Exact<{ export type FindOneNavigationMenuItemQuery = { __typename?: 'Query', navigationMenuItem?: { __typename?: 'NavigationMenuItem', id: string, type: NavigationMenuItemType, userWorkspaceId?: string | null, targetRecordId?: string | null, targetObjectMetadataId?: string | null, viewId?: string | null, folderId?: string | null, name?: string | null, link?: string | null, icon?: string | null, color?: string | null, pageLayoutId?: string | null, position: number, applicationId?: string | null, createdAt: string, updatedAt: string, targetRecordIdentifier?: { __typename?: 'RecordIdentifier', id: string, labelIdentifier: string, imageIdentifier?: string | null } | null } | null }; -export type ObjectMetadataFieldsFragment = { __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }; +export type ObjectMetadataFieldsFragment = { __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, searchFieldMetadataList: Array<{ __typename?: 'SearchField', id: string, fieldMetadataId: string, tsVectorFieldMetadataId: string, position: number, createdAt: string, updatedAt: string }>, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }; export type CreateOneObjectMetadataItemMutationVariables = Exact<{ input: CreateOneObjectInput; @@ -7247,7 +7258,7 @@ export type DeleteOneIndexMetadataItemMutation = { __typename?: 'Mutation', dele export type ObjectMetadataItemsQueryVariables = Exact<{ [key: string]: never; }>; -export type ObjectMetadataItemsQuery = { __typename?: 'Query', objects: { __typename?: 'ObjectConnection', edges: Array<{ __typename?: 'ObjectEdge', node: { __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } }; +export type ObjectMetadataItemsQuery = { __typename?: 'Query', objects: { __typename?: 'ObjectConnection', edges: Array<{ __typename?: 'ObjectEdge', node: { __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIEditable: boolean, isUICreatable: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, searchFieldMetadataList: Array<{ __typename?: 'SearchField', id: string, fieldMetadataId: string, tsVectorFieldMetadataId: string, position: number, createdAt: string, updatedAt: string }>, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, subFieldName?: string | null, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isActive?: boolean | null, isSystem?: boolean | null, isUIEditable?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } }; export type ObjectRecordCountsQueryVariables = Exact<{ [key: string]: never; }>; @@ -8662,9 +8673,9 @@ export type GetWorkspaceFromInviteHashQuery = { __typename?: 'Query', findWorksp export const SkillFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SkillFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Skill"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; export const AgentFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; -export const ObjectMetadataFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const ObjectMetadataFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"searchFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"tsVectorFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const LogicFunctionFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; -export const ApplicationFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; +export const ApplicationFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"searchFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"tsVectorFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; export const AuthTokenFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AuthTokenFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AuthToken"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"token"}},{"kind":"Field","name":{"kind":"Name","value":"expiresAt"}}]}}]} as unknown as DocumentNode; export const AuthTokenPairFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AuthTokenPairFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AuthTokenPair"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"accessOrWorkspaceAgnosticToken"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AuthTokenFragment"}}]}},{"kind":"Field","name":{"kind":"Name","value":"refreshToken"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AuthTokenFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AuthTokenFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AuthToken"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"token"}},{"kind":"Field","name":{"kind":"Name","value":"expiresAt"}}]}}]} as unknown as DocumentNode; export const AvailableSsoIdentityProvidersFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AvailableSSOIdentityProvidersFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FindAvailableSSOIDP"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"issuer"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"workspace"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}}]}}]}}]} as unknown as DocumentNode; @@ -8744,8 +8755,8 @@ export const GetToolInputSchemaDocument = {"kind":"Document","definitions":[{"ki export const OnAgentChatEventDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"OnAgentChatEvent"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"onAgentChatEvent"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"threadId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"threadId"}},{"kind":"Field","name":{"kind":"Name","value":"event"}}]}}]}}]} as unknown as DocumentNode; export const TrackAnalyticsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TrackAnalytics"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"type"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"AnalyticsType"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"event"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"properties"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"trackAnalytics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"type"},"value":{"kind":"Variable","name":{"kind":"Name","value":"type"}}},{"kind":"Argument","name":{"kind":"Name","value":"event"},"value":{"kind":"Variable","name":{"kind":"Name","value":"event"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"Argument","name":{"kind":"Name","value":"properties"},"value":{"kind":"Variable","name":{"kind":"Name","value":"properties"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode; export const FindManyApplicationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyApplications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyApplications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}}]}}]}}]}}]} as unknown as DocumentNode; -export const FindOneApplicationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplication"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode; -export const FindOneApplicationByUniversalIdentifierDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationByUniversalIdentifier"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode; +export const FindOneApplicationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplication"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"searchFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"tsVectorFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode; +export const FindOneApplicationByUniversalIdentifierDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationByUniversalIdentifier"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"searchFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"tsVectorFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"executionMode"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"toolTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"workflowActionTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"componentName"}},{"kind":"Field","name":{"kind":"Name","value":"builtComponentChecksum"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"isHeadless"}},{"kind":"Field","name":{"kind":"Name","value":"usesSdkClient"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"commandMenuItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"shortLabel"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isPinned"}},{"kind":"Field","name":{"kind":"Name","value":"availabilityType"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalAvailabilityExpression"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode; export const FindOneApplicationSummaryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationSummary"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const AuthorizeAppDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"authorizeApp"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"clientId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"codeChallenge"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"redirectUrl"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"state"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"authorizeApp"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"clientId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"clientId"}}},{"kind":"Argument","name":{"kind":"Name","value":"codeChallenge"},"value":{"kind":"Variable","name":{"kind":"Name","value":"codeChallenge"}}},{"kind":"Argument","name":{"kind":"Name","value":"redirectUrl"},"value":{"kind":"Variable","name":{"kind":"Name","value":"redirectUrl"}}},{"kind":"Argument","name":{"kind":"Name","value":"state"},"value":{"kind":"Variable","name":{"kind":"Name","value":"state"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"redirectUrl"}}]}}]}}]} as unknown as DocumentNode; export const EmailPasswordResetLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"EmailPasswordResetLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"email"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"emailPasswordResetLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"email"},"value":{"kind":"Variable","name":{"kind":"Name","value":"email"}}},{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode; @@ -8813,7 +8824,7 @@ export const DeleteOneObjectMetadataItemDocument = {"kind":"Document","definitio export const DeleteOneFieldMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneFieldMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneField"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"object"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; export const CreateOneIndexMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateOneIndexMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateOneIndexInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createOneIndex"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}}]}}]} as unknown as DocumentNode; export const DeleteOneIndexMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneIndexMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneIndex"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode; -export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isUICreatable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"searchFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"tsVectorFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"subFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIEditable"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const ObjectRecordCountsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectRecordCounts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectRecordCounts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectNamePlural"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}}]}}]} as unknown as DocumentNode; export const SkipBookOnboardingStepDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SkipBookOnboardingStep"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"skipBookOnboardingStep"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode; export const SkipSyncEmailOnboardingStepDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SkipSyncEmailOnboardingStep"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"skipSyncEmailOnboardingStep"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode; diff --git a/packages/twenty-front/src/modules/object-metadata/graphql/fragment.ts b/packages/twenty-front/src/modules/object-metadata/graphql/fragment.ts index b9ae999c07..ea4d7e29bc 100644 --- a/packages/twenty-front/src/modules/object-metadata/graphql/fragment.ts +++ b/packages/twenty-front/src/modules/object-metadata/graphql/fragment.ts @@ -25,6 +25,14 @@ export const OBJECT_METADATA_FRAGMENT = gql` isLabelSyncedWithName isSearchable duplicateCriteria + searchFieldMetadataList { + id + fieldMetadataId + tsVectorFieldMetadataId + position + createdAt + updatedAt + } indexMetadataList { id createdAt diff --git a/packages/twenty-front/src/modules/object-metadata/types/EnrichedObjectMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/types/EnrichedObjectMetadataItem.ts index da502b0149..2dec037f49 100644 --- a/packages/twenty-front/src/modules/object-metadata/types/EnrichedObjectMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/types/EnrichedObjectMetadataItem.ts @@ -1,6 +1,7 @@ import { type Object as GeneratedObject } from '~/generated-metadata/graphql'; import { type IndexMetadataItem } from '@/object-metadata/types/IndexMetadataItem'; +import { type SearchFieldMetadataItem } from '@/object-metadata/types/SearchFieldMetadataItem'; import { type FieldMetadataItem } from './FieldMetadataItem'; export type EnrichedObjectMetadataItem = Omit< @@ -12,6 +13,7 @@ export type EnrichedObjectMetadataItem = Omit< | 'labelIdentifierFieldMetadataId' | 'fieldsList' | 'indexMetadataList' + | 'searchFieldMetadataList' // Deprecated GraphQL field kept server-side for one release; no longer queried | 'isUIReadOnly' > & { @@ -22,4 +24,5 @@ export type EnrichedObjectMetadataItem = Omit< updatableFields: FieldMetadataItem[]; labelIdentifierFieldMetadataId: string; indexMetadatas: IndexMetadataItem[]; + searchFieldMetadatas: SearchFieldMetadataItem[]; }; diff --git a/packages/twenty-front/src/modules/object-metadata/types/SearchFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/types/SearchFieldMetadataItem.ts new file mode 100644 index 0000000000..aa8070ebfe --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/types/SearchFieldMetadataItem.ts @@ -0,0 +1,8 @@ +import { type SearchField as GeneratedSearchField } from '~/generated-metadata/graphql'; + +export type SearchFieldMetadataItem = Omit< + GeneratedSearchField, + '__typename' +> & { + __typename?: string; +}; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems.ts b/packages/twenty-front/src/modules/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems.ts index 9f4b15c1c8..5bba9381bf 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems.ts @@ -1,5 +1,6 @@ import { type IndexFieldMetadataItem } from '@/object-metadata/types/IndexFieldMetadataItem'; import { type IndexMetadataItem } from '@/object-metadata/types/IndexMetadataItem'; +import { type SearchFieldMetadataItem } from '@/object-metadata/types/SearchFieldMetadataItem'; import { objectMetadataItemSchema } from '@/object-metadata/validation-schemas/objectMetadataItemSchema'; import { type ObjectMetadataItemsQuery } from '~/generated-metadata/graphql'; import { type EnrichedObjectMetadataItem } from '@/object-metadata/types/EnrichedObjectMetadataItem'; @@ -21,8 +22,12 @@ export const mapPaginatedObjectMetadataItemsToObjectMetadataItems = ({ object.node.labelIdentifierFieldMetadataId, ); - const { fieldsList, indexMetadataList, ...objectWithoutFieldsList } = - object.node; + const { + fieldsList, + indexMetadataList, + searchFieldMetadataList, + ...objectWithoutFieldsList + } = object.node; return { ...objectWithoutFieldsList, @@ -30,6 +35,12 @@ export const mapPaginatedObjectMetadataItemsToObjectMetadataItems = ({ ...field, })), labelIdentifierFieldMetadataId, + searchFieldMetadatas: searchFieldMetadataList.map( + (searchFieldMetadata) => + ({ + ...searchFieldMetadata, + }) satisfies SearchFieldMetadataItem, + ), indexMetadatas: indexMetadataList.map( ({ indexFieldMetadataList: indexFields, ...indexRest }) => ({ diff --git a/packages/twenty-front/src/modules/object-metadata/validation-schemas/objectMetadataItemSchema.ts b/packages/twenty-front/src/modules/object-metadata/validation-schemas/objectMetadataItemSchema.ts index a302c4cf0e..e8ad22da83 100644 --- a/packages/twenty-front/src/modules/object-metadata/validation-schemas/objectMetadataItemSchema.ts +++ b/packages/twenty-front/src/modules/object-metadata/validation-schemas/objectMetadataItemSchema.ts @@ -3,6 +3,7 @@ import { z } from 'zod'; import { fieldMetadataItemSchema } from '@/object-metadata/validation-schemas/fieldMetadataItemSchema'; import { indexMetadataItemSchema } from '@/object-metadata/validation-schemas/indexMetadataItemSchema'; import { metadataLabelSchema } from '@/object-metadata/validation-schemas/metadataLabelSchema'; +import { searchFieldMetadataItemSchema } from '@/object-metadata/validation-schemas/searchFieldMetadataItemSchema'; import { camelCaseStringSchema } from '~/utils/validation-schemas/camelCaseStringSchema'; export const objectMetadataItemSchema = z.object({ @@ -13,6 +14,7 @@ export const objectMetadataItemSchema = z.object({ readableFields: z.array(fieldMetadataItemSchema()), updatableFields: z.array(fieldMetadataItemSchema()), indexMetadatas: z.array(indexMetadataItemSchema), + searchFieldMetadatas: z.array(searchFieldMetadataItemSchema), icon: z.string().startsWith('Icon').trim(), applicationId: z.uuid(), id: z.uuid(), diff --git a/packages/twenty-front/src/modules/object-metadata/validation-schemas/searchFieldMetadataItemSchema.ts b/packages/twenty-front/src/modules/object-metadata/validation-schemas/searchFieldMetadataItemSchema.ts new file mode 100644 index 0000000000..fcf895d8ce --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/validation-schemas/searchFieldMetadataItemSchema.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +import { type SearchFieldMetadataItem } from '@/object-metadata/types/SearchFieldMetadataItem'; + +export const searchFieldMetadataItemSchema = z.object({ + __typename: z.literal('SearchField').optional(), + id: z.uuid(), + fieldMetadataId: z.uuid(), + tsVectorFieldMetadataId: z.uuid(), + position: z.number(), + createdAt: z.string(), + updatedAt: z.string(), +}) satisfies z.ZodType; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useAggregateRecordsQuery.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useAggregateRecordsQuery.test.tsx index 19dd68b786..bf1ac7836f 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useAggregateRecordsQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useAggregateRecordsQuery.test.tsx @@ -50,6 +50,7 @@ const mockObjectMetadataItem: EnrichedObjectMetadataItem = { readableFields: fields, updatableFields: fields, indexMetadatas: [], + searchFieldMetadatas: [], isLabelSyncedWithName: true, isRemote: false, isSystem: false, diff --git a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/__tests__/turnSortsIntoOrderBy.test.ts b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/__tests__/turnSortsIntoOrderBy.test.ts index fe5b0bb4dd..0388b16b4a 100644 --- a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/__tests__/turnSortsIntoOrderBy.test.ts +++ b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/__tests__/turnSortsIntoOrderBy.test.ts @@ -29,6 +29,7 @@ const objectMetadataItemWithPositionField: EnrichedObjectMetadataItem = { readableFields: fields, updatableFields: fields, indexMetadatas: [], + searchFieldMetadatas: [], createdAt: '2021-01-01', updatedAt: '2021-01-01', nameSingular: 'object1', @@ -191,6 +192,7 @@ describe('turnSortsIntoOrderBy', () => { readableFields: [], updatableFields: [], indexMetadatas: [], + searchFieldMetadatas: [], createdAt: '2021-01-01', updatedAt: '2021-01-01', nameSingular: 'company', @@ -241,6 +243,7 @@ describe('turnSortsIntoOrderBy', () => { readableFields: [], updatableFields: [], indexMetadatas: [], + searchFieldMetadatas: [], createdAt: '2021-01-01', updatedAt: '2021-01-01', nameSingular: 'person', diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/__tests__/buildRecordGqlFieldsAggregateForView.test.ts b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/__tests__/buildRecordGqlFieldsAggregateForView.test.ts index b75928f2be..8f5b2f0190 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/__tests__/buildRecordGqlFieldsAggregateForView.test.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/__tests__/buildRecordGqlFieldsAggregateForView.test.ts @@ -49,6 +49,7 @@ describe('buildRecordGqlFieldsAggregateForView', () => { readableFields: fields, updatableFields: fields, indexMetadatas: [], + searchFieldMetadatas: [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; diff --git a/packages/twenty-front/src/modules/object-record/utils/__tests__/generateAggregateQuery.test.ts b/packages/twenty-front/src/modules/object-record/utils/__tests__/generateAggregateQuery.test.ts index 5b0ce8b28a..2cb5c10de9 100644 --- a/packages/twenty-front/src/modules/object-record/utils/__tests__/generateAggregateQuery.test.ts +++ b/packages/twenty-front/src/modules/object-record/utils/__tests__/generateAggregateQuery.test.ts @@ -19,6 +19,7 @@ describe('generateAggregateQuery', () => { readableFields: [], updatableFields: [], indexMetadatas: [], + searchFieldMetadatas: [], isLabelSyncedWithName: true, isRemote: false, isSystem: false, @@ -62,6 +63,7 @@ describe('generateAggregateQuery', () => { readableFields: [], updatableFields: [], indexMetadatas: [], + searchFieldMetadatas: [], isLabelSyncedWithName: true, isRemote: false, isSystem: false, diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx index 54d036612c..7a9f310d18 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx @@ -12,6 +12,7 @@ import { TableRow } from '@/ui/layout/table/components/TableRow'; import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { useContext, useMemo, useState } from 'react'; +import { isDefined } from 'twenty-shared/utils'; import { IconEye, IconSearch, useIcons } from 'twenty-ui/icon'; import { Card } from 'twenty-ui/surfaces'; @@ -44,56 +45,34 @@ const StyledNameLabel = styled.div` const INDEXED_FIELDS_GRID_TEMPLATE_COLUMNS = 'minmax(0, 1fr) 100px 148px'; -// TODO: This is very DIRTY ; let's migrate searchVector to be proper tables -// Already tracked here: https://github.com/twentyhq/core-team-issues/issues/1428 const extractIndexedFields = ( objectMetadataItem: EnrichedObjectMetadataItem, ): IndexedFieldEntry[] => { - const searchVectorField = objectMetadataItem.fields.find( - (field) => field.name === SEARCH_VECTOR_FIELD_NAME, + const fieldById = new Map( + objectMetadataItem.fields.map((field) => [field.id, field]), ); - const asExpression = ( - searchVectorField?.settings as { asExpression?: string } | null - )?.asExpression; + return [...objectMetadataItem.searchFieldMetadatas] + .sort( + (searchFieldMetadataA, searchFieldMetadataB) => + searchFieldMetadataA.position - searchFieldMetadataB.position, + ) + .map((searchFieldMetadata) => { + const field = fieldById.get(searchFieldMetadata.fieldMetadataId); - if (!asExpression) { - return []; - } + if (!isDefined(field) || field.name === SEARCH_VECTOR_FIELD_NAME) { + return undefined; + } - const columnNames = [ - ...new Set( - Array.from(asExpression.matchAll(/"([^"]+)"/g), (match) => match[1]), - ), - ]; - - const seenFieldIds = new Set(); - const entries: IndexedFieldEntry[] = []; - - for (const columnName of columnNames) { - const field = objectMetadataItem.fields.find( - (fieldItem) => - fieldItem.name === columnName || columnName.startsWith(fieldItem.name), - ); - - if ( - field && - field.name !== SEARCH_VECTOR_FIELD_NAME && - !seenFieldIds.has(field.id) - ) { - seenFieldIds.add(field.id); - - entries.push({ + return { id: field.id, label: field.label, icon: field.icon, weight: 1, fieldType: field.type, - }); - } - } - - return entries; + } satisfies IndexedFieldEntry; + }) + .filter(isDefined); }; export const SettingsObjectSearchSection = ({ diff --git a/packages/twenty-front/src/modules/workflow/components/__stories__/WorkflowFieldsMultiSelect.stories.ts b/packages/twenty-front/src/modules/workflow/components/__stories__/WorkflowFieldsMultiSelect.stories.ts index cb52b4e9b2..46438c7a70 100644 --- a/packages/twenty-front/src/modules/workflow/components/__stories__/WorkflowFieldsMultiSelect.stories.ts +++ b/packages/twenty-front/src/modules/workflow/components/__stories__/WorkflowFieldsMultiSelect.stories.ts @@ -80,6 +80,7 @@ const mockObjectMetadataItem: EnrichedObjectMetadataItem = { isSearchable: true, labelIdentifierFieldMetadataId: '1', indexMetadatas: [], + searchFieldMetadatas: [], fields: fields, readableFields: fields, updatableFields: fields, diff --git a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx index 6e4a61389c..cd495ae1f5 100644 --- a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx +++ b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx @@ -254,6 +254,7 @@ const buildObjectMetadataItemsFromMarketplaceApp = ( (field) => !nonUpdatableFieldIds.has(field.id), ), indexMetadatas: [], + searchFieldMetadatas: [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; diff --git a/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts b/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts index 9d3394d0a4..d079a68345 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts @@ -43,6 +43,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "labelPlural": "Calendar events", "description": "Calendar events", "icon": "IconCalendar", + "searchFieldMetadataList": [], "indexMetadataList": [], "fieldsList": [ { @@ -1043,6 +1044,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -1488,6 +1490,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -2264,6 +2267,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -2378,6 +2382,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "labelPlural": "Message Threads", "description": "Message Thread", "icon": "IconMessage", + "searchFieldMetadataList": [], "indexMetadataList": [], "fieldsList": [ { @@ -3572,6 +3577,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -4388,6 +4394,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -5184,6 +5191,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -5767,6 +5775,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -6366,6 +6375,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -7179,6 +7189,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -7694,6 +7705,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -8255,6 +8267,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -8842,6 +8855,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -9493,6 +9507,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -10144,6 +10159,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -11184,6 +11200,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -12432,6 +12449,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -13080,6 +13098,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -13492,6 +13511,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -14144,6 +14164,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -14722,6 +14743,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -15937,6 +15959,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -16541,6 +16564,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = ] } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -17677,6 +17701,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -18195,6 +18220,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -18723,6 +18749,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -19072,6 +19099,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", @@ -19650,6 +19678,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "morphRelations": null } ], + "searchFieldMetadataList": [], "indexMetadataList": [ { "__typename": "Index", diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts index a7e0dd74c2..35004336c0 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts @@ -178,6 +178,8 @@ const buildLegacyCalendarEventRecordingPreferenceFieldMetadata = ({ mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: null, }); diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/__tests__/build-search-field-metadata-backfill-operations.util.spec.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/__tests__/build-search-field-metadata-backfill-operations.util.spec.ts index 465e6ebde9..eaac4d78db 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/__tests__/build-search-field-metadata-backfill-operations.util.spec.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/__tests__/build-search-field-metadata-backfill-operations.util.spec.ts @@ -5,6 +5,7 @@ import { buildSearchFieldMetadataBackfillOperations } from 'src/database/command import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { getFlatObjectMetadataMock, getStandardFlatObjectMetadataMock, @@ -100,6 +101,8 @@ const buildSearchFieldMetadata = ({ fieldMetadataUniversalIdentifier, applicationUniversalIdentifier, position = 0, + tsVectorFieldMetadataId = 'ts-vector-field-metadata-id', + tsVectorFieldMetadataUniversalIdentifier = 'ts-vector-field-metadata-universal-identifier', }: { id: string; universalIdentifier: string; @@ -109,6 +112,8 @@ const buildSearchFieldMetadata = ({ fieldMetadataUniversalIdentifier: string; applicationUniversalIdentifier: string; position?: number; + tsVectorFieldMetadataId?: string; + tsVectorFieldMetadataUniversalIdentifier?: string; }): FlatSearchFieldMetadata => { const createdAt = '2024-01-01T00:00:00.000Z'; @@ -119,6 +124,8 @@ const buildSearchFieldMetadata = ({ fieldMetadataId, objectMetadataUniversalIdentifier, fieldMetadataUniversalIdentifier, + tsVectorFieldMetadataId, + tsVectorFieldMetadataUniversalIdentifier, applicationId: 'unused-application-id', applicationUniversalIdentifier, position, @@ -128,6 +135,25 @@ const buildSearchFieldMetadata = ({ }; }; +const buildSearchVectorField = ({ + objectMetadataId, + objectMetadataUniversalIdentifier, + applicationUniversalIdentifier, +}: { + objectMetadataId: string; + objectMetadataUniversalIdentifier: string; + applicationUniversalIdentifier: string; +}): FlatFieldMetadata => + getFlatFieldMetadataMock({ + id: `${objectMetadataId}-search-vector-field-id`, + universalIdentifier: `${objectMetadataUniversalIdentifier}-search-vector-field-uid`, + objectMetadataId, + objectMetadataUniversalIdentifier, + type: FieldMetadataType.TS_VECTOR, + name: SEARCH_VECTOR_FIELD.name, + applicationUniversalIdentifier, + }); + // Custom object with a searchable `name` field plus a TEXT field whose name // overlaps it by prefix (name / nameDescription). Only the `name` field should // produce a row; the exact-name match makes the prefix overlap irrelevant. This @@ -158,6 +184,12 @@ const buildCustomObjectFixture = () => { applicationUniversalIdentifier: CUSTOM_APPLICATION_UNIVERSAL_IDENTIFIER, }); + const searchVectorField = buildSearchVectorField({ + objectMetadataId: customObjectId, + objectMetadataUniversalIdentifier: customObjectUniversalIdentifier, + applicationUniversalIdentifier: CUSTOM_APPLICATION_UNIVERSAL_IDENTIFIER, + }); + const customObject = getFlatObjectMetadataMock({ id: customObjectId, universalIdentifier: customObjectUniversalIdentifier, @@ -168,15 +200,16 @@ const buildCustomObjectFixture = () => { fieldUniversalIdentifiers: [ nameField.universalIdentifier, nameDescriptionField.universalIdentifier, + searchVectorField.universalIdentifier, ], }); - return { customObject, nameField, nameDescriptionField }; + return { customObject, nameField, nameDescriptionField, searchVectorField }; }; describe('buildSearchFieldMetadataBackfillOperations', () => { it('selects only the name field for a custom object, ignoring a prefix-overlapping field name', () => { - const { customObject, nameField, nameDescriptionField } = + const { customObject, nameField, nameDescriptionField, searchVectorField } = buildCustomObjectFixture(); const { flatSearchFieldMetadatasToCreateByApplicationUniversalIdentifier } = @@ -185,6 +218,7 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { flatFieldMetadataMaps: buildFlatFieldMetadataMaps([ nameField, nameDescriptionField, + searchVectorField, ]), flatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([]), standardFlatSearchFieldMetadataMaps: @@ -204,6 +238,10 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { expect(customApplicationRows?.[0].objectMetadataUniversalIdentifier).toBe( customObject.universalIdentifier, ); + // The row points at the object's searchVector field via the new FK. + expect( + customApplicationRows?.[0].tsVectorFieldMetadataUniversalIdentifier, + ).toBe(searchVectorField.universalIdentifier); // Custom object name field is seeded at position 0. expect(customApplicationRows?.[0].position).toBe(0); // No spurious row for the prefix-overlapping `nameDescription` field. @@ -263,7 +301,7 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { }); it('groups rows per application: standard-object rows under the standard application, custom-object rows under the custom application', () => { - const { customObject, nameField, nameDescriptionField } = + const { customObject, nameField, nameDescriptionField, searchVectorField } = buildCustomObjectFixture(); const standardObjectId = 'standard-object-id'; @@ -282,12 +320,23 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, }); + const standardSearchVectorField = buildSearchVectorField({ + objectMetadataId: standardObjectId, + objectMetadataUniversalIdentifier: standardObjectUniversalIdentifier, + applicationUniversalIdentifier: + TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, + }); + const standardObject = getStandardFlatObjectMetadataMock({ id: standardObjectId, universalIdentifier: standardObjectUniversalIdentifier, isSearchable: true, labelIdentifierFieldMetadataId: standardFieldId, fieldIds: [standardFieldId], + fieldUniversalIdentifiers: [ + standardFieldUniversalIdentifier, + standardSearchVectorField.universalIdentifier, + ], }); const standardSearchFieldMetadata = buildSearchFieldMetadata({ @@ -310,7 +359,9 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { flatFieldMetadataMaps: buildFlatFieldMetadataMaps([ nameField, nameDescriptionField, + searchVectorField, standardField, + standardSearchVectorField, ]), flatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([]), standardFlatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([ @@ -339,6 +390,9 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { expect(standardApplicationRows?.[0].fieldMetadataUniversalIdentifier).toBe( standardFieldUniversalIdentifier, ); + expect( + standardApplicationRows?.[0].tsVectorFieldMetadataUniversalIdentifier, + ).toBe(standardSearchVectorField.universalIdentifier); const customApplicationRows = flatSearchFieldMetadatasToCreateByApplicationUniversalIdentifier[ @@ -349,6 +403,9 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { expect(customApplicationRows?.[0].fieldMetadataUniversalIdentifier).toBe( nameField.universalIdentifier, ); + expect( + customApplicationRows?.[0].tsVectorFieldMetadataUniversalIdentifier, + ).toBe(searchVectorField.universalIdentifier); }); it('selects only the standard-set field on a standard object, never a prefix-overlapping sibling (phone vs phoneNumber)', () => { @@ -386,12 +443,24 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, }); + const standardSearchVectorField = buildSearchVectorField({ + objectMetadataId: standardObjectId, + objectMetadataUniversalIdentifier: standardObjectUniversalIdentifier, + applicationUniversalIdentifier: + TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, + }); + const standardObject = getStandardFlatObjectMetadataMock({ id: standardObjectId, universalIdentifier: standardObjectUniversalIdentifier, isSearchable: true, labelIdentifierFieldMetadataId: phoneFieldId, fieldIds: [phoneFieldId, phoneNumberFieldId], + fieldUniversalIdentifiers: [ + phoneFieldUniversalIdentifier, + phoneNumberFieldUniversalIdentifier, + standardSearchVectorField.universalIdentifier, + ], }); const phoneSearchFieldMetadata = buildSearchFieldMetadata({ @@ -411,6 +480,7 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { flatFieldMetadataMaps: buildFlatFieldMetadataMaps([ phoneField, phoneNumberField, + standardSearchVectorField, ]), flatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([]), standardFlatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([ @@ -455,12 +525,23 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, }); + const standardSearchVectorField = buildSearchVectorField({ + objectMetadataId: standardObjectId, + objectMetadataUniversalIdentifier: standardObjectUniversalIdentifier, + applicationUniversalIdentifier: + TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, + }); + const standardObject = getStandardFlatObjectMetadataMock({ id: standardObjectId, universalIdentifier: standardObjectUniversalIdentifier, isSearchable: true, labelIdentifierFieldMetadataId: emailsFieldId, fieldIds: [emailsFieldId], + fieldUniversalIdentifiers: [ + emailsFieldUniversalIdentifier, + standardSearchVectorField.universalIdentifier, + ], }); // The standard maps row sits at position 3 (e.g. SEARCH_FIELDS_FOR_PERSON order); @@ -480,7 +561,10 @@ describe('buildSearchFieldMetadataBackfillOperations', () => { const { flatSearchFieldMetadatasToCreateByApplicationUniversalIdentifier } = buildSearchFieldMetadataBackfillOperations({ flatObjectMetadataMaps: buildFlatObjectMetadataMaps([standardObject]), - flatFieldMetadataMaps: buildFlatFieldMetadataMaps([emailsField]), + flatFieldMetadataMaps: buildFlatFieldMetadataMaps([ + emailsField, + standardSearchVectorField, + ]), flatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([]), standardFlatSearchFieldMetadataMaps: buildFlatSearchFieldMetadataMaps([ standardSearchFieldMetadata, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/build-search-field-metadata-backfill-operations.util.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/build-search-field-metadata-backfill-operations.util.ts index e8259a249a..41220b32e6 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/build-search-field-metadata-backfill-operations.util.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/utils/build-search-field-metadata-backfill-operations.util.ts @@ -10,6 +10,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; import { buildFlatSearchFieldMetadataForField } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util'; +import { findTsVectorFlatFieldMetadataForObject } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util'; import { DEFAULT_LABEL_IDENTIFIER_FIELD_NAME } from 'src/engine/metadata-modules/object-metadata/constants/object-metadata.constants'; import { type UniversalFlatSearchFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-search-field-metadata.type'; @@ -84,12 +85,22 @@ export const buildSearchFieldMetadataBackfillOperations = ({ return; } + const tsVectorFlatFieldMetadata = findTsVectorFlatFieldMetadataForObject({ + fieldUniversalIdentifiers: flatObjectMetadata.fieldUniversalIdentifiers, + flatFieldMetadataMaps, + }); + + if (!isDefined(tsVectorFlatFieldMetadata)) { + return; + } + candidateSearchFieldMetadataKeys.add(searchFieldMetadataKey); flatSearchFieldMetadatasToCreate.push( buildFlatSearchFieldMetadataForField({ flatObjectMetadata, flatFieldMetadata, + tsVectorFlatFieldMetadata, position, }), ); diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-fast-1810000001000-add-ts-vector-field-metadata-id-to-search-field-metadata.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-fast-1810000001000-add-ts-vector-field-metadata-id-to-search-field-metadata.ts new file mode 100644 index 0000000000..24e693f85f --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-fast-1810000001000-add-ts-vector-field-metadata-id-to-search-field-metadata.ts @@ -0,0 +1,53 @@ +import { QueryRunner } from 'typeorm'; + +import { RegisteredInstanceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-instance-command.decorator'; +import { FastInstanceCommand } from 'src/engine/core-modules/upgrade/interfaces/fast-instance-command.interface'; + +@RegisteredInstanceCommand('2.18.0', 1810000001000) +export class AddTsVectorFieldMetadataIdToSearchFieldMetadataFastInstanceCommand implements FastInstanceCommand { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD "tsVectorFieldMetadataId" uuid', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD CONSTRAINT "FK_31102b31f7338b6a298fc22996a" FOREIGN KEY ("tsVectorFieldMetadataId") REFERENCES "core"."fieldMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED', + ); + + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP CONSTRAINT IF EXISTS "FK_1b78544eb06f82059a2a01013a3"', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD CONSTRAINT "FK_1b78544eb06f82059a2a01013a3" FOREIGN KEY ("objectMetadataId") REFERENCES "core"."objectMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED', + ); + + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP CONSTRAINT IF EXISTS "FK_6d5c6922bfd1578b1eff2abb9d6"', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD CONSTRAINT "FK_6d5c6922bfd1578b1eff2abb9d6" FOREIGN KEY ("fieldMetadataId") REFERENCES "core"."fieldMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED', + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP CONSTRAINT IF EXISTS "FK_6d5c6922bfd1578b1eff2abb9d6"', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD CONSTRAINT "FK_6d5c6922bfd1578b1eff2abb9d6" FOREIGN KEY ("fieldMetadataId") REFERENCES "core"."fieldMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION', + ); + + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP CONSTRAINT IF EXISTS "FK_1b78544eb06f82059a2a01013a3"', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ADD CONSTRAINT "FK_1b78544eb06f82059a2a01013a3" FOREIGN KEY ("objectMetadataId") REFERENCES "core"."objectMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION', + ); + + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP CONSTRAINT "FK_31102b31f7338b6a298fc22996a"', + ); + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" DROP COLUMN "tsVectorFieldMetadataId"', + ); + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-slow-1810000003000-backfill-ts-vector-field-metadata-id-on-search-field-metadata.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-slow-1810000003000-backfill-ts-vector-field-metadata-id-on-search-field-metadata.ts new file mode 100644 index 0000000000..ec627aa8c3 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-instance-command-slow-1810000003000-backfill-ts-vector-field-metadata-id-on-search-field-metadata.ts @@ -0,0 +1,51 @@ +import { DataSource, QueryRunner } from 'typeorm'; + +import { RegisteredInstanceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-instance-command.decorator'; +import { SlowInstanceCommand } from 'src/engine/core-modules/upgrade/interfaces/slow-instance-command.interface'; + +// Backfills the tsVectorFieldMetadataId FK by pointing every existing +// searchFieldMetadata row at its object's system searchVector (TS_VECTOR) field, +// then enforces NOT NULL. Runs after the fast command that adds the column (and makes +// the FKs deferrable). Any row left without a resolvable searchVector +// aborts the upgrade rather than silently relaxing the NOT NULL guarantee. +@RegisteredInstanceCommand('2.18.0', 1810000003000, { type: 'slow' }) +export class BackfillTsVectorFieldMetadataIdOnSearchFieldMetadataSlowInstanceCommand + implements SlowInstanceCommand +{ + async runDataMigration(dataSource: DataSource): Promise { + await dataSource.query( + `UPDATE "core"."searchFieldMetadata" "searchFieldMetadata" + SET "tsVectorFieldMetadataId" = "fieldMetadata"."id" + FROM "core"."fieldMetadata" "fieldMetadata" + WHERE "fieldMetadata"."objectMetadataId" = "searchFieldMetadata"."objectMetadataId" + AND "fieldMetadata"."type" = 'TS_VECTOR' + AND "fieldMetadata"."name" = 'searchVector' + AND "searchFieldMetadata"."tsVectorFieldMetadataId" IS NULL`, + ); + + const unresolvedRows: { count: string }[] = await dataSource.query( + `SELECT COUNT(*) AS "count" FROM "core"."searchFieldMetadata" + WHERE "tsVectorFieldMetadataId" IS NULL`, + ); + + const unresolvedCount = Number(unresolvedRows[0]?.count ?? 0); + + if (unresolvedCount > 0) { + throw new Error( + `Cannot enforce searchFieldMetadata.tsVectorFieldMetadataId NOT NULL: ${unresolvedCount} row(s) reference an object without a searchVector (TS_VECTOR) field`, + ); + } + } + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ALTER COLUMN "tsVectorFieldMetadataId" SET NOT NULL', + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'ALTER TABLE "core"."searchFieldMetadata" ALTER COLUMN "tsVectorFieldMetadataId" DROP NOT NULL', + ); + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/add-ts-vector-field-metadata-id-to-search-field-metadata-upgrade-command-name.constant.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/add-ts-vector-field-metadata-id-to-search-field-metadata-upgrade-command-name.constant.ts new file mode 100644 index 0000000000..8c0a553b86 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/add-ts-vector-field-metadata-id-to-search-field-metadata-upgrade-command-name.constant.ts @@ -0,0 +1,2 @@ +export const ADD_TS_VECTOR_FIELD_METADATA_ID_TO_SEARCH_FIELD_METADATA_UPGRADE_COMMAND_NAME = + '2.18.0_AddTsVectorFieldMetadataIdToSearchFieldMetadataFastInstanceCommand_1810000001000'; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts index aecc507456..a9b3e4ff64 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts @@ -34,6 +34,13 @@ import { AddIsSystemSideEffectFastInstanceCommand } from 'src/database/commands/ import { BackfillConnectionSecuritySlowInstanceCommand } from 'src/database/commands/upgrade-version-command/2-15/2-15-instance-command-slow-1781461753981-backfill-connection-security'; import { AddChannelWebhookSubscriptionFieldsFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782152096938-add-channel-webhook-subscription-fields'; import { AddUniversalIdentifierAndApplicationIdToSearchFieldMetadataFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782200000000-add-universal-identifier-and-application-id-to-search-field-metadata'; +import { AddServerTriggerSettingsToLogicFunctionFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782211913427-add-server-trigger-settings-to-logic-function'; +import { AddPrimaryPublicDomainToApplicationFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782281874768-add-primary-public-domain-to-application'; +import { MakePublicDomainApplicationIdNotNullSlowInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-slow-1782281874769-make-public-domain-application-id-not-null'; +import { CreateDpaAgreementCoreTableFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-17/2-17-instance-command-fast-1801000020000-create-dpa-agreement-core-table'; +import { CreateApplicationTranslationCoreTableFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-17/2-17-instance-command-fast-1801000100000-create-application-translation-core-table'; +import { AddTsVectorFieldMetadataIdToSearchFieldMetadataFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-18/2-18-instance-command-fast-1810000001000-add-ts-vector-field-metadata-id-to-search-field-metadata'; +import { BackfillTsVectorFieldMetadataIdOnSearchFieldMetadataSlowInstanceCommand } from 'src/database/commands/upgrade-version-command/2-18/2-18-instance-command-slow-1810000003000-backfill-ts-vector-field-metadata-id-on-search-field-metadata'; import { AddCacheTokensToAgentChatThreadFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-2/2-2-instance-command-fast-1777455269302-add-cache-tokens-to-agent-chat-thread'; import { AddLogoToApplicationFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-2/2-2-instance-command-fast-1777539664664-add-logo-to-application'; import { AddSubFieldNameToViewSortEarlyFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-3/2-3-instance-command-fast-1747234200000-add-sub-field-name-to-view-sort'; @@ -77,11 +84,6 @@ import { EncryptNonSecretApplicationVariableSlowInstanceCommand } from 'src/data import { MigrateAiModelPreferencesSlowInstanceCommand } from 'src/database/commands/upgrade-version-command/2-9/2-9-instance-command-slow-1799000010000-migrate-ai-model-preferences'; import { AddFolderImportToMessageFolderPendingSyncActionFastInstanceCommand } from './2-15/2-15-instance-command-fast-1781714499016-add-folder-import-to-message-folder-pending-sync-action'; import { AddViewKanbanColumnWidthFastInstanceCommand } from './2-15/2-15-instance-command-fast-1781900000000-add-view-kanban-column-width'; -import { AddPrimaryPublicDomainToApplicationFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782281874768-add-primary-public-domain-to-application'; -import { MakePublicDomainApplicationIdNotNullSlowInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-slow-1782281874769-make-public-domain-application-id-not-null'; -import { AddServerTriggerSettingsToLogicFunctionFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-16/2-16-instance-command-fast-1782211913427-add-server-trigger-settings-to-logic-function'; -import { CreateDpaAgreementCoreTableFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-17/2-17-instance-command-fast-1801000020000-create-dpa-agreement-core-table'; -import { CreateApplicationTranslationCoreTableFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-17/2-17-instance-command-fast-1801000100000-create-application-translation-core-table'; export const INSTANCE_COMMANDS = [ AddViewFieldGroupIdIndexOnViewFieldFastInstanceCommand, @@ -166,4 +168,6 @@ export const INSTANCE_COMMANDS = [ MakePublicDomainApplicationIdNotNullSlowInstanceCommand, CreateDpaAgreementCoreTableFastInstanceCommand, CreateApplicationTranslationCoreTableFastInstanceCommand, + AddTsVectorFieldMetadataIdToSearchFieldMetadataFastInstanceCommand, + BackfillTsVectorFieldMetadataIdOnSearchFieldMetadataSlowInstanceCommand, ]; diff --git a/packages/twenty-server/src/database/commands/workspace-export/utils/__tests__/generate-workspace-schema-ddl.util.spec.ts b/packages/twenty-server/src/database/commands/workspace-export/utils/__tests__/generate-workspace-schema-ddl.util.spec.ts new file mode 100644 index 0000000000..a319f5dfc3 --- /dev/null +++ b/packages/twenty-server/src/database/commands/workspace-export/utils/__tests__/generate-workspace-schema-ddl.util.spec.ts @@ -0,0 +1,114 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + +import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; +import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { type SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; +import { generateWorkspaceSchemaDdl } from 'src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util'; + +describe('generateWorkspaceSchemaDdl', () => { + const workspaceId = '20202020-1c25-4d02-bf25-6aeccf7ea419'; + const objectMetadataId = '20202020-object-id'; + const nameFieldId = '20202020-name-field-id'; + const searchVectorFieldId = '20202020-search-vector-field-id'; + + const objectMetadata = { + ...getFlatObjectMetadataMock({ + universalIdentifier: 'person', + id: objectMetadataId, + nameSingular: 'person', + namePlural: 'persons', + }), + isActive: true, + } as unknown as ObjectMetadataEntity; + + const nameField = getFlatFieldMetadataMock({ + universalIdentifier: 'name', + id: nameFieldId, + objectMetadataId, + type: FieldMetadataType.TEXT, + name: 'name', + }) as unknown as FieldMetadataEntity; + + const searchVectorField = getFlatFieldMetadataMock({ + universalIdentifier: 'searchVector', + id: searchVectorFieldId, + objectMetadataId, + type: FieldMetadataType.TS_VECTOR, + name: 'searchVector', + }) as unknown as FieldMetadataEntity; + + const fieldsByObjectId = new Map([ + [objectMetadataId, [nameField, searchVectorField]], + ]); + + const buildSearchFieldMetadata = ( + overrides: Partial = {}, + ): SearchFieldMetadataEntity => + ({ + universalIdentifier: 'search-name', + objectMetadataId, + fieldMetadataId: nameFieldId, + tsVectorFieldMetadataId: searchVectorFieldId, + position: 0, + ...overrides, + }) as SearchFieldMetadataEntity; + + const generateSearchVectorColumnSql = ( + searchFieldMetadatasByObjectId: Map, + ): string => { + const statements = generateWorkspaceSchemaDdl( + workspaceId, + 'workspace_schema', + [objectMetadata], + fieldsByObjectId, + searchFieldMetadatasByObjectId, + ); + + const createTableStatement = statements.find((statement) => + statement.includes('"searchVector"'), + ); + + expect(createTableStatement).toBeDefined(); + + return createTableStatement as string; + }; + + it('should emit the searchVector column as a STORED generated column derived from searchFieldMetadata', () => { + const createTableStatement = generateSearchVectorColumnSql( + new Map([[objectMetadataId, [buildSearchFieldMetadata()]]]), + ); + + expect(createTableStatement).toContain( + `"searchVector" tsvector GENERATED ALWAYS AS (to_tsvector('simple', COALESCE(public.unaccent_immutable("name"), ''))) STORED`, + ); + }); + + it('should tolerate a legacy NULL tsVectorFieldMetadataId row (pre-2.18 backfill)', () => { + const createTableStatement = generateSearchVectorColumnSql( + new Map([ + [ + objectMetadataId, + [ + buildSearchFieldMetadata({ + tsVectorFieldMetadataId: null as never, + }), + ], + ], + ]), + ); + + expect(createTableStatement).toContain( + `GENERATED ALWAYS AS (to_tsvector('simple', COALESCE(public.unaccent_immutable("name"), ''))) STORED`, + ); + }); + + it('should still emit a valid STORED generated column when no searchFieldMetadata rows exist', () => { + const createTableStatement = generateSearchVectorColumnSql(new Map()); + + expect(createTableStatement).toContain( + `"searchVector" tsvector GENERATED ALWAYS AS (to_tsvector('simple', NULL)) STORED`, + ); + }); +}); diff --git a/packages/twenty-server/src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util.ts b/packages/twenty-server/src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util.ts index 96f804c38c..5d6eb18b3d 100644 --- a/packages/twenty-server/src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util.ts +++ b/packages/twenty-server/src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util.ts @@ -1,26 +1,82 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; +import { deriveSearchVectorAsExpressionForTsVectorField } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; +import { type SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; import { buildSqlColumnDefinition } from 'src/engine/twenty-orm/workspace-schema-manager/utils/build-sql-column-definition.util'; import { computeTableName } from 'src/engine/utils/compute-table-name.util'; +import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; import { escapeIdentifier, escapeLiteral, } from 'src/engine/workspace-manager/workspace-migration/utils/remove-sql-injection.util'; import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; -import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; import { type CreateEnumOperationSpec, EnumOperation, collectEnumOperationsForObject, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/workspace-schema-enum-operations.util'; +const buildSearchFieldMetadataDerivationInputs = ({ + fieldMetadatas, + objectSearchFieldMetadatas, +}: { + fieldMetadatas: FieldMetadataEntity[]; + objectSearchFieldMetadatas: SearchFieldMetadataEntity[]; +}): { + indexedFieldById: ReadonlyMap< + string, + { name: string; type: FieldMetadataType } + >; + flatSearchFieldMetadataMaps: FlatEntityMaps; +} => { + const indexedFieldById = new Map( + fieldMetadatas.map((fieldMetadata) => [ + fieldMetadata.id, + { name: fieldMetadata.name, type: fieldMetadata.type }, + ]), + ); + + const searchVectorFieldId = fieldMetadatas.find( + (fieldMetadata) => + fieldMetadata.type === FieldMetadataType.TS_VECTOR && + fieldMetadata.name === SEARCH_VECTOR_FIELD.name, + )?.id; + + const byUniversalIdentifier = Object.fromEntries( + objectSearchFieldMetadatas.map((searchFieldMetadata) => [ + searchFieldMetadata.universalIdentifier, + { + ...searchFieldMetadata, + tsVectorFieldMetadataId: + searchFieldMetadata.tsVectorFieldMetadataId ?? searchVectorFieldId, + } as unknown as FlatSearchFieldMetadata, + ]), + ); + + return { + indexedFieldById, + flatSearchFieldMetadataMaps: { + byUniversalIdentifier, + universalIdentifierById: {}, + universalIdentifiersByApplicationId: {}, + }, + }; +}; + export const generateWorkspaceSchemaDdl = ( workspaceId: string, schemaName: string, objectMetadatas: ObjectMetadataEntity[], fieldsByObjectId: Map, + searchFieldMetadatasByObjectId: Map, ): string[] => { const statements: string[] = []; @@ -37,6 +93,13 @@ export const generateWorkspaceSchemaDdl = ( const flatFieldMetadatas = fieldMetadatas as unknown as FlatFieldMetadata[]; const flatObjectMetadata = objectMetadata as unknown as FlatObjectMetadata; + const { indexedFieldById, flatSearchFieldMetadataMaps } = + buildSearchFieldMetadataDerivationInputs({ + fieldMetadatas, + objectSearchFieldMetadatas: + searchFieldMetadatasByObjectId.get(objectMetadata.id) ?? [], + }); + const enumOperations = collectEnumOperationsForObject({ tableName, operation: EnumOperation.CREATE, @@ -57,6 +120,16 @@ export const generateWorkspaceSchemaDdl = ( flatFieldMetadata, flatObjectMetadata, workspaceId, + searchVectorAsExpression: isFlatFieldMetadataOfType( + flatFieldMetadata, + FieldMetadataType.TS_VECTOR, + ) + ? deriveSearchVectorAsExpressionForTsVectorField({ + tsVectorFieldMetadataId: flatFieldMetadata.id, + flatSearchFieldMetadataMaps, + indexedFieldById, + }) + : undefined, }), ); diff --git a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.module.ts b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.module.ts index 14b41af2b9..eda25e34a4 100644 --- a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.module.ts +++ b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.module.ts @@ -5,10 +5,15 @@ import { WorkspaceExportCommand } from 'src/database/commands/workspace-export/w import { WorkspaceExportService } from 'src/database/commands/workspace-export/workspace-export.service'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([ObjectMetadataEntity, FieldMetadataEntity]), + TypeOrmModule.forFeature([ + ObjectMetadataEntity, + FieldMetadataEntity, + SearchFieldMetadataEntity, + ]), ], providers: [WorkspaceExportCommand, WorkspaceExportService], }) diff --git a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts index 85078c842b..13d4fdcdc5 100644 --- a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts +++ b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts @@ -11,20 +11,21 @@ import { Repository, } from 'typeorm'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { computeTableName } from 'src/engine/utils/compute-table-name.util'; -import { escapeIdentifier } from 'src/engine/workspace-manager/workspace-migration/utils/remove-sql-injection.util'; -import { getCoreEntityMetadatasWithWorkspaceId } from 'src/database/commands/workspace-export/utils/get-core-entity-metadatas-with-workspace-id.util'; -import { generateWorkspaceSchemaDdl } from 'src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util'; import { buildInsertPrefix } from 'src/database/commands/workspace-export/utils/build-insert-prefix.util'; import { buildWorkspaceTableColumnSets } from 'src/database/commands/workspace-export/utils/build-workspace-table-column-sets.util'; import { formatSqlValue } from 'src/database/commands/workspace-export/utils/format-sql-value.util'; -import { formatPgCopyField } from './utils/format-pg-copy-value.util'; +import { generateWorkspaceSchemaDdl } from 'src/database/commands/workspace-export/utils/generate-workspace-schema-ddl.util'; +import { getCoreEntityMetadatasWithWorkspaceId } from 'src/database/commands/workspace-export/utils/get-core-entity-metadatas-with-workspace-id.util'; +import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; +import { computeTableName } from 'src/engine/utils/compute-table-name.util'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; +import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; +import { escapeIdentifier } from 'src/engine/workspace-manager/workspace-migration/utils/remove-sql-injection.util'; import { isNonEmptyArray } from 'twenty-shared/utils'; +import { formatPgCopyField } from './utils/format-pg-copy-value.util'; const BATCH_SIZE = 10_000; @@ -57,6 +58,9 @@ export class WorkspaceExportService { private readonly objectMetadataRepository: Repository, @InjectRepository(FieldMetadataEntity) private readonly fieldMetadataRepository: Repository, + // eslint-disable-next-line twenty/prefer-workspace-scoped-repository -- Ignored + @InjectRepository(SearchFieldMetadataEntity) + private readonly searchFieldMetadataRepository: Repository, ) {} async exportWorkspace({ @@ -95,6 +99,28 @@ export class WorkspaceExportService { fieldsByObjectId.set(fieldMetadata.objectMetadataId, objectFields); } + const searchFieldMetadatas = await this.searchFieldMetadataRepository.find({ + where: { workspaceId }, + }); + + const searchFieldMetadatasByObjectId = new Map< + string, + SearchFieldMetadataEntity[] + >(); + + for (const searchFieldMetadata of searchFieldMetadatas) { + const objectSearchFieldMetadatas = + searchFieldMetadatasByObjectId.get( + searchFieldMetadata.objectMetadataId, + ) ?? []; + + objectSearchFieldMetadatas.push(searchFieldMetadata); + searchFieldMetadatasByObjectId.set( + searchFieldMetadata.objectMetadataId, + objectSearchFieldMetadatas, + ); + } + mkdirSync(outputPath, { recursive: true }); const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); @@ -117,6 +143,7 @@ export class WorkspaceExportService { schemaName, objectMetadatas, fieldsByObjectId, + searchFieldMetadatasByObjectId, stream, ); @@ -327,6 +354,7 @@ export class WorkspaceExportService { schemaName: string, objectMetadatas: ObjectMetadataEntity[], fieldsByObjectId: Map, + searchFieldMetadatasByObjectId: Map, stream: WriteStream, ): void { this.logger.log('Generating workspace schema DDL from metadata...'); @@ -336,6 +364,7 @@ export class WorkspaceExportService { schemaName, objectMetadatas, fieldsByObjectId, + searchFieldMetadatasByObjectId, ); this.logger.log(` ${ddlStatements.length} DDL statements`); diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-field-manifest-to-universal-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-field-manifest-to-universal-flat-field-metadata.util.ts index a1b6b877e6..f18c97cf73 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-field-manifest-to-universal-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-field-manifest-to-universal-flat-field-metadata.util.ts @@ -114,6 +114,7 @@ export const fromFieldManifestToUniversalFlatFieldMetadata = ({ calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], createdAt: now, updatedAt: now, }; diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/services/compute-application-manifest-all-universal-flat-entity-maps.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/services/compute-application-manifest-all-universal-flat-entity-maps.service.ts index 123ba1cbde..abdb91758f 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-manifest/services/compute-application-manifest-all-universal-flat-entity-maps.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-manifest/services/compute-application-manifest-all-universal-flat-entity-maps.service.ts @@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common'; import { type Manifest } from 'twenty-shared/application'; import { MAX_CUSTOM_INDEXES_PER_OBJECT } from 'twenty-shared/constants'; -import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { fromApplicationVariableManifestToUniversalFlatApplicationVariable } from 'src/engine/core-modules/application/application-manifest/converters/from-application-variable-manifest-to-universal-flat-application-variable.util'; @@ -25,7 +24,6 @@ import { fromRoleManifestToUniversalFlatRole } from 'src/engine/core-modules/app import { fromRowLevelPermissionPredicateGroupManifestToUniversalFlatRowLevelPermissionPredicateGroup } from 'src/engine/core-modules/application/application-manifest/converters/from-row-level-permission-predicate-group-manifest-to-universal-flat-row-level-permission-predicate-group.util'; import { fromRowLevelPermissionPredicateManifestToUniversalFlatRowLevelPermissionPredicate } from 'src/engine/core-modules/application/application-manifest/converters/from-row-level-permission-predicate-manifest-to-universal-flat-row-level-permission-predicate.util'; import { fromSkillManifestToUniversalFlatSkill } from 'src/engine/core-modules/application/application-manifest/converters/from-skill-manifest-to-universal-flat-skill.util'; -import { computeSearchVectorUniversalSettingsFromObjectManifest } from 'src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util'; import { fromViewFieldGroupManifestToUniversalFlatViewFieldGroup } from 'src/engine/core-modules/application/application-manifest/converters/from-view-field-group-manifest-to-universal-flat-view-field-group.util'; import { fromViewFieldManifestToUniversalFlatViewField } from 'src/engine/core-modules/application/application-manifest/converters/from-view-field-manifest-to-universal-flat-view-field.util'; import { fromViewFilterGroupManifestToUniversalFlatViewFilterGroup } from 'src/engine/core-modules/application/application-manifest/converters/from-view-filter-group-manifest-to-universal-flat-view-filter-group.util'; @@ -95,21 +93,10 @@ export class ComputeApplicationManifestAllUniversalFlatEntityMapsService { }); for (const fieldManifest of objectManifest.fields) { - const enrichedFieldManifest = - fieldManifest.type === FieldMetadataType.TS_VECTOR && - !isDefined(fieldManifest.universalSettings) - ? { - ...fieldManifest, - objectUniversalIdentifier: objectManifest.universalIdentifier, - universalSettings: - computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest, - }), - } - : { - ...fieldManifest, - objectUniversalIdentifier: objectManifest.universalIdentifier, - }; + const enrichedFieldManifest = { + ...fieldManifest, + objectUniversalIdentifier: objectManifest.universalIdentifier, + }; const flatFieldMetadata = fromFieldManifestToUniversalFlatFieldMetadata( { diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/__tests__/compute-search-vector-universal-settings-from-object-manifest.util.spec.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/__tests__/compute-search-vector-universal-settings-from-object-manifest.util.spec.ts deleted file mode 100644 index 66bcb2ad11..0000000000 --- a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/__tests__/compute-search-vector-universal-settings-from-object-manifest.util.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { type ObjectManifest } from 'twenty-shared/application'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { computeSearchVectorUniversalSettingsFromObjectManifest } from 'src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util'; - -const buildObjectManifest = ( - overrides: Partial & { - fields: ObjectManifest['fields']; - labelIdentifierFieldMetadataUniversalIdentifier: string; - }, -): ObjectManifest => ({ - universalIdentifier: 'obj-uuid-1', - nameSingular: 'testObject', - namePlural: 'testObjects', - labelSingular: 'Test Object', - labelPlural: 'Test Objects', - ...overrides, -}); - -describe('computeSearchVectorUniversalSettingsFromObjectManifest', () => { - it('should return asExpression and generatedType for a TEXT label identifier field', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-name', - fields: [ - { - universalIdentifier: 'field-uuid-name', - name: 'name', - label: 'Name', - type: FieldMetadataType.TEXT, - }, - ], - }), - }); - - expect(result?.generatedType).toBe('STORED'); - expect(result?.asExpression).toContain("to_tsvector('simple'"); - expect(result?.asExpression).toContain('"name"'); - }); - - it('should return asExpression for a FULL_NAME label identifier field', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-name', - fields: [ - { - universalIdentifier: 'field-uuid-name', - name: 'name', - label: 'Name', - type: FieldMetadataType.FULL_NAME, - }, - ], - }), - }); - - expect(result?.generatedType).toBe('STORED'); - expect(result?.asExpression).toContain("to_tsvector('simple'"); - expect(result?.asExpression).toContain('"nameFirstName"'); - expect(result?.asExpression).toContain('"nameLastName"'); - }); - - it('should return asExpression for an EMAILS label identifier field', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-email', - fields: [ - { - universalIdentifier: 'field-uuid-email', - name: 'email', - label: 'Email', - type: FieldMetadataType.EMAILS, - }, - ], - }), - }); - - expect(result?.generatedType).toBe('STORED'); - expect(result?.asExpression).toContain("to_tsvector('simple'"); - expect(result?.asExpression).toContain('"emailPrimaryEmail"'); - }); - - it('should return asExpression for a UUID label identifier field', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-id', - fields: [ - { - universalIdentifier: 'field-uuid-id', - name: 'externalId', - label: 'External ID', - type: FieldMetadataType.UUID, - }, - ], - }), - }); - - expect(result?.generatedType).toBe('STORED'); - expect(result?.asExpression).toContain("to_tsvector('simple'"); - expect(result?.asExpression).toContain('"externalId"'); - }); - - it('should return null when label identifier field is not found in fields', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: - 'non-existent-field-uuid', - fields: [ - { - universalIdentifier: 'field-uuid-name', - name: 'name', - label: 'Name', - type: FieldMetadataType.TEXT, - }, - ], - }), - }); - - expect(result).toBeNull(); - }); - - it('should return null when label identifier field has a non-searchable type', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-number', - fields: [ - { - universalIdentifier: 'field-uuid-number', - name: 'amount', - label: 'Amount', - type: FieldMetadataType.NUMBER, - }, - ], - }), - }); - - expect(result).toBeNull(); - }); - - it('should return null when fields array is empty', () => { - const result = computeSearchVectorUniversalSettingsFromObjectManifest({ - objectManifest: buildObjectManifest({ - labelIdentifierFieldMetadataUniversalIdentifier: 'field-uuid-name', - fields: [], - }), - }); - - expect(result).toBeNull(); - }); -}); diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util.ts deleted file mode 100644 index 6354b9a745..0000000000 --- a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-search-vector-universal-settings-from-object-manifest.util.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { type ObjectManifest } from 'twenty-shared/application'; -import { - type FieldMetadataUniversalSettings, - FieldMetadataType, -} from 'twenty-shared/types'; - -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { isDefined, isSearchableFieldType } from 'twenty-shared/utils'; - -export const computeSearchVectorUniversalSettingsFromObjectManifest = ({ - objectManifest, -}: { - objectManifest: ObjectManifest; -}): FieldMetadataUniversalSettings => { - const labelIdentifierField = objectManifest.fields.find( - (field) => - field.universalIdentifier === - objectManifest.labelIdentifierFieldMetadataUniversalIdentifier, - ); - - if ( - !isDefined(labelIdentifierField) || - !isSearchableFieldType(labelIdentifierField.type) - ) { - return null; - } - - return { - asExpression: getTsVectorColumnExpressionFromFields([ - { - name: labelIdentifierField.name, - type: labelIdentifierField.type, - }, - ]), - generatedType: 'STORED', - }; -}; diff --git a/packages/twenty-server/src/engine/dataloaders/dataloader.interface.ts b/packages/twenty-server/src/engine/dataloaders/dataloader.interface.ts index e79094ae21..8290e5143b 100644 --- a/packages/twenty-server/src/engine/dataloaders/dataloader.interface.ts +++ b/packages/twenty-server/src/engine/dataloaders/dataloader.interface.ts @@ -5,6 +5,7 @@ import { type FieldMetadataLoaderPayload, type IndexFieldMetadataLoaderPayload, type IndexMetadataLoaderPayload, + type SearchFieldMetadataLoaderPayload, type IsConfiguredLoaderPayload, type MorphRelationLoaderPayload, type StandardApplicationIdLoaderPayload, @@ -23,6 +24,7 @@ import { type RelationDTO } from 'src/engine/metadata-modules/field-metadata/dto import { type IndexFieldMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-field-metadata.dto'; import { type IndexMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-metadata.dto'; import { type ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto'; +import { type SearchFieldMetadataDTO } from 'src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto'; import { type ViewFieldGroupDTO } from 'src/engine/metadata-modules/view-field-group/dtos/view-field-group.dto'; import { type ViewFieldDTO } from 'src/engine/metadata-modules/view-field/dtos/view-field.dto'; import { type ViewFilterGroupDTO } from 'src/engine/metadata-modules/view-filter-group/dtos/view-filter-group.dto'; @@ -53,6 +55,11 @@ export interface IDataloaders { IndexFieldMetadataDTO[] >; + searchFieldMetadataLoader: DataLoader< + SearchFieldMetadataLoaderPayload, + SearchFieldMetadataDTO[] + >; + objectMetadataLoader: DataLoader< ObjectMetadataLoaderPayload, ObjectMetadataDTO | null diff --git a/packages/twenty-server/src/engine/dataloaders/dataloader.service.ts b/packages/twenty-server/src/engine/dataloaders/dataloader.service.ts index 268e46197e..495daedb5b 100644 --- a/packages/twenty-server/src/engine/dataloaders/dataloader.service.ts +++ b/packages/twenty-server/src/engine/dataloaders/dataloader.service.ts @@ -31,6 +31,7 @@ import { resolveMorphRelationsFromFlatFieldMetadata } from 'src/engine/metadata- import { resolveRelationFromFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/resolve-relation-from-flat-field-metadata.util'; import { fromFlatObjectMetadataToObjectMetadataDto } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-to-object-metadata-dto.util'; import { getMorphNameFromMorphFieldMetadataName } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-morph-name-from-morph-field-metadata-name.util'; +import { fromFlatSearchFieldMetadataToSearchFieldMetadataDto } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/from-flat-search-field-metadata-to-search-field-metadata-dto.util'; import { fromFlatViewFieldGroupToViewFieldGroupDto } from 'src/engine/metadata-modules/view-field-group/utils/from-flat-view-field-group-to-view-field-group-dto.util'; import { fromFlatViewFieldToViewFieldDto } from 'src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util'; import { fromFlatViewFilterToViewFilterDto } from 'src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util'; @@ -41,6 +42,7 @@ import { type IndexFieldMetadataDTO } from 'src/engine/metadata-modules/index-me import { type IndexMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-metadata.dto'; import { ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { type SearchFieldMetadataDTO } from 'src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto'; export type RelationMetadataLoaderPayload = { workspaceId: string; @@ -76,6 +78,11 @@ export type IndexFieldMetadataLoaderPayload = { indexMetadata: Pick; }; +export type SearchFieldMetadataLoaderPayload = { + workspaceId: string; + objectMetadata: Pick; +}; + export type ObjectMetadataLoaderPayload = { workspaceId: string; objectMetadataId: string; @@ -145,6 +152,7 @@ export class DataloaderService { const fieldMetadataLoader = this.createFieldMetadataLoader(); const indexMetadataLoader = this.createIndexMetadataLoader(); const indexFieldMetadataLoader = this.createIndexFieldMetadataLoader(); + const searchFieldMetadataLoader = this.createSearchFieldMetadataLoader(); const objectMetadataLoader = this.createObjectMetadataLoader(); const viewFieldGroupsByViewIdLoader = this.createViewFieldGroupsByViewIdLoader(); @@ -168,6 +176,7 @@ export class DataloaderService { fieldMetadataLoader, indexMetadataLoader, indexFieldMetadataLoader, + searchFieldMetadataLoader, objectMetadataLoader, viewFieldGroupsByViewIdLoader, viewFieldsByViewFieldGroupIdLoader, @@ -306,6 +315,46 @@ export class DataloaderService { ); } + private createSearchFieldMetadataLoader() { + return new DataLoader< + SearchFieldMetadataLoaderPayload, + SearchFieldMetadataDTO[] + >(async (dataLoaderParams: SearchFieldMetadataLoaderPayload[]) => { + const workspaceId = dataLoaderParams[0].workspaceId; + const objectMetadataIds = dataLoaderParams.map( + (dataLoaderParam) => dataLoaderParam.objectMetadata.id, + ); + + const { flatSearchFieldMetadataMaps, flatObjectMetadataMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: [ + 'flatSearchFieldMetadataMaps', + 'flatObjectMetadataMaps', + ], + }, + ); + + return objectMetadataIds.map((objectMetadataId) => { + const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: objectMetadataId, + flatEntityMaps: flatObjectMetadataMaps, + }); + + const searchFieldMetadatas = + findManyFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityIds: flatObjectMetadata.searchFieldMetadataIds, + flatEntityMaps: flatSearchFieldMetadataMaps, + }); + + return searchFieldMetadatas.map( + fromFlatSearchFieldMetadataToSearchFieldMetadataDto, + ); + }); + }); + } + private createFieldMetadataLoader() { return new DataLoader( async (dataLoaderParams: FieldMetadataLoaderPayload[]) => { diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts index 45b1a069f3..7a735ddc53 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts @@ -30,6 +30,7 @@ import { AssignTypeIfIsMorphOrRelationFieldMetadataType } from 'src/engine/metad import { IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity'; +import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @@ -238,4 +239,10 @@ export class FieldMetadataEntity< @OneToMany(() => ViewSortEntity, (viewSort) => viewSort.fieldMetadata) viewSorts: Relation; + + @OneToMany( + () => SearchFieldMetadataEntity, + (searchFieldMetadata) => searchFieldMetadata.fieldMetadata, + ) + searchFieldMetadatas: Relation; } diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts index 60454fdce7..4b147bc02e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts @@ -16,7 +16,6 @@ import { FieldMetadataExceptionCode, } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; 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 { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; @@ -114,7 +113,6 @@ export class FieldMetadataService extends TypeOrmQueryService >, @@ -43,6 +45,7 @@ type Assertions = [ | 'calendarViews' | 'mainGroupByFieldMetadataViews' | 'viewSorts' + | 'searchFieldMetadatas' > >, ]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/extract-entity-related-entity-properties.type-test.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/extract-entity-related-entity-properties.type-test.ts index af3a029bf1..ef1dd4dd48 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/extract-entity-related-entity-properties.type-test.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/extract-entity-related-entity-properties.type-test.ts @@ -10,7 +10,7 @@ type FieldMetadataRelatedProperties = type Assertions = [ // FieldMetadataEntity has both ManyToOne and OneToMany relations // ManyToOne: object, workspace, application, relationTargetFieldMetadata, relationTargetObjectMetadata - // OneToMany: indexFieldMetadatas, fieldPermissions, viewFields, viewFilters, kanbanAggregateOperationViews, calendarViews, mainGroupByFieldMetadataViews, viewSorts + // OneToMany: indexFieldMetadatas, fieldPermissions, viewFields, viewFilters, kanbanAggregateOperationViews, calendarViews, mainGroupByFieldMetadataViews, viewSorts, searchFieldMetadatas Expect< Equal< FieldMetadataRelatedProperties, @@ -27,6 +27,7 @@ type Assertions = [ | 'calendarViews' | 'mainGroupByFieldMetadataViews' | 'viewSorts' + | 'searchFieldMetadatas' > >, ]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap index 8da7ded374..8e94550d7e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap @@ -23,6 +23,7 @@ exports[`getMetadataRelatedMetadataNames should return related metadata names fo "viewField", "viewFilter", "view", + "searchFieldMetadata", ] `; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/sort-metadata-names-children-first.util.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/sort-metadata-names-children-first.util.spec.ts.snap index c9a96a1c58..ffda9ae514 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/sort-metadata-names-children-first.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/sort-metadata-names-children-first.util.spec.ts.snap @@ -7,11 +7,11 @@ exports[`sortMetadataNamesChildrenFirst should return metadata names sorted with "viewFilter", "commandMenuItem", "fieldPermission", + "searchFieldMetadata", "viewField", "objectPermission", "pageLayoutWidget", "rolePermissionFlag", - "searchFieldMetadata", "viewSort", "index", "pageLayout", diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts index 9475eb6659..0291e9a643 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -12,6 +12,7 @@ import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; @@ -22,6 +23,7 @@ type AddFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs< metadataName: T; flatEntity: MetadataFlatEntity; flatEntityAndRelatedMapsToMutate: MetadataFlatEntityAndRelatedFlatEntityMaps; + skipMissingRelatedEntities?: boolean; }; export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = @@ -29,6 +31,7 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow metadataName, flatEntity, flatEntityAndRelatedMapsToMutate, + skipMissingRelatedEntities = false, }: AddFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow( { @@ -36,6 +39,7 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow universalFlatEntity: flatEntity, universalFlatEntityAndRelatedMapsToMutate: flatEntityAndRelatedMapsToMutate, + skipMissingRelatedEntities, }, ); @@ -101,6 +105,17 @@ export const addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow continue; } + if (skipMissingRelatedEntities) { + const maybeRelatedFlatEntity = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: flatEntityRelatedEntityForeignKeyValue, + flatEntityMaps: relatedFlatEntityMetadataMaps, + }); + + if (!isDefined(maybeRelatedFlatEntity)) { + continue; + } + } + const relatedFlatEntity = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityId: flatEntityRelatedEntityForeignKeyValue, flatEntityMaps: relatedFlatEntityMetadataMaps, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock.ts index d5c5156176..0c761b42a3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock.ts @@ -57,6 +57,8 @@ export const getFlatFieldMetadataMock = ( mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: null, ...overrides, }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts index f2f640ffe0..6b784b1164 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts @@ -77,6 +77,8 @@ export const getRelationTargetFlatFieldMetadataMock = ({ mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: settings, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap index 231e563869..3edb98de37 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap @@ -139,6 +139,7 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "options": null, "relationTargetFieldMetadataUniversalIdentifier": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, + "searchFieldMetadataUniversalIdentifiers": [], "standardOverrides": null, "type": "MORPH_RELATION", "universalIdentifier": Any, @@ -174,6 +175,7 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "options": null, "relationTargetFieldMetadataUniversalIdentifier": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, + "searchFieldMetadataUniversalIdentifiers": [], "standardOverrides": null, "type": "RELATION", "universalIdentifier": Any, @@ -211,6 +213,7 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "options": null, "relationTargetFieldMetadataUniversalIdentifier": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, + "searchFieldMetadataUniversalIdentifiers": [], "standardOverrides": null, "type": "MORPH_RELATION", "universalIdentifier": Any, @@ -246,6 +249,7 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "options": null, "relationTargetFieldMetadataUniversalIdentifier": Any, "relationTargetObjectMetadataUniversalIdentifier": Any, + "searchFieldMetadataUniversalIdentifiers": [], "standardOverrides": null, "type": "RELATION", "universalIdentifier": Any, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/workspace-flat-field-metadata-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/workspace-flat-field-metadata-map-cache.service.ts index dadff176d8..94e82c7fe2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/workspace-flat-field-metadata-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/workspace-flat-field-metadata-map-cache.service.ts @@ -14,6 +14,7 @@ import { fromFieldMetadataEntityToFlatFieldMetadata } from 'src/engine/metadata- import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { computeUniqueFieldMetadataIdsFromIndexEntities } from 'src/engine/metadata-modules/index-metadata/utils/compute-unique-field-metadata-ids-from-index-entities.util'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; @@ -50,6 +51,8 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro private readonly viewSortRepository: WorkspaceScopedRepository, @InjectWorkspaceScopedRepository(ViewEntity) private readonly viewRepository: WorkspaceScopedRepository, + @InjectWorkspaceScopedRepository(SearchFieldMetadataEntity) + private readonly searchFieldMetadataRepository: WorkspaceScopedRepository, ) { super(); } @@ -66,6 +69,7 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro viewFilters, viewSorts, views, + searchFieldMetadatas, ] = await Promise.all([ this.fieldMetadataRepository.find({ where: { workspaceId }, @@ -108,6 +112,9 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro ], withDeleted: true, }), + this.searchFieldMetadataRepository.find(workspaceId, { + select: ['id', 'universalIdentifier', 'fieldMetadataId'], + }), ]); const [ @@ -117,6 +124,7 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro kanbanViewsByFieldId, mainGroupByFieldMetadataViewsByFieldId, viewSortsByFieldId, + searchFieldMetadatasByFieldId, ] = ( [ { @@ -143,6 +151,10 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro entities: viewSorts, foreignKey: 'fieldMetadataId', }, + { + entities: searchFieldMetadatas, + foreignKey: 'fieldMetadataId', + }, ] as const ).map(regroupEntitiesByRelatedEntityId); @@ -173,6 +185,8 @@ export class WorkspaceFlatFieldMetadataMapCacheService extends WorkspaceCachePro fieldMetadataEntity.id, ) || [], viewSorts: viewSortsByFieldId.get(fieldMetadataEntity.id) || [], + searchFieldMetadatas: + searchFieldMetadatasByFieldId.get(fieldMetadataEntity.id) || [], }, fieldMetadataIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-search-field-metadata-deletion-for-deleted-fields.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-search-field-metadata-deletion-for-deleted-fields.util.ts index eba5d0722d..19bbedb87c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-search-field-metadata-deletion-for-deleted-fields.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-search-field-metadata-deletion-for-deleted-fields.util.ts @@ -1,29 +1,23 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { recomputeSearchVectorFieldFromSearchFieldMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util'; import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; import { type UniversalFlatSearchFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-search-field-metadata.type'; export const computeSearchFieldMetadataDeletionForDeletedFields = ({ flatFieldMetadatasToDelete, flatObjectMetadataMaps, - flatFieldMetadataMaps, flatSearchFieldMetadataMaps, }: { flatFieldMetadatasToDelete: FlatFieldMetadata[]; } & Pick< AllFlatEntityMaps, - | 'flatObjectMetadataMaps' - | 'flatFieldMetadataMaps' - | 'flatSearchFieldMetadataMaps' + 'flatObjectMetadataMaps' | 'flatSearchFieldMetadataMaps' >): { searchFieldMetadatasToDelete: UniversalFlatSearchFieldMetadata[]; - flatSearchVectorFieldsToUpdate: FlatFieldMetadata[]; } => { const deletedFieldIds = new Set( flatFieldMetadatasToDelete.map((flatFieldMetadata) => flatFieldMetadata.id), @@ -35,8 +29,6 @@ export const computeSearchFieldMetadataDeletionForDeletedFields = ({ ); const searchFieldMetadatasToDelete: UniversalFlatSearchFieldMetadata[] = []; - const flatSearchVectorFieldsToUpdate: FlatFieldMetadata[] = - []; for (const objectMetadataId of affectedObjectMetadataIds) { const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({ @@ -59,31 +51,10 @@ export const computeSearchFieldMetadataDeletionForDeletedFields = ({ deletedFieldIds.has(searchFieldMetadata.fieldMetadataId), ); - if (rowsToDelete.length === 0) { - continue; - } - searchFieldMetadatasToDelete.push(...rowsToDelete); - - const remainingSearchFieldMetadatas = objectSearchFieldMetadatas.filter( - (searchFieldMetadata) => - !deletedFieldIds.has(searchFieldMetadata.fieldMetadataId), - ); - - const flatSearchVectorFieldToUpdate = - recomputeSearchVectorFieldFromSearchFieldMetadatas({ - flatObjectMetadata, - flatFieldMetadataMaps, - searchFieldMetadatas: remainingSearchFieldMetadatas, - }); - - if (isDefined(flatSearchVectorFieldToUpdate)) { - flatSearchVectorFieldsToUpdate.push(flatSearchVectorFieldToUpdate); - } } return { searchFieldMetadatasToDelete, - flatSearchVectorFieldsToUpdate, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts index 6777c01e6b..11f5609e9e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-delete-field-input-to-flat-field-metadatas-to-delete.util.ts @@ -1,4 +1,3 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; import { isDefined, trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties, @@ -13,7 +12,6 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { computeFlatFieldMetadataRelatedFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util'; import { computeSearchFieldMetadataDeletionForDeletedFields } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-search-field-metadata-deletion-for-deleted-fields.util'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; @@ -44,7 +42,6 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ flatIndexesToUpdate: UniversalFlatIndexMetadata[]; flatIndexesToDelete: UniversalFlatIndexMetadata[]; searchFieldMetadatasToDelete: UniversalFlatSearchFieldMetadata[]; - flatSearchVectorFieldsToUpdate: FlatFieldMetadata[]; } => { const { id: fieldMetadataToDeleteId } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -187,11 +184,10 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ }, ); - const { searchFieldMetadatasToDelete, flatSearchVectorFieldsToUpdate } = + const { searchFieldMetadatasToDelete } = computeSearchFieldMetadataDeletionForDeletedFields({ flatFieldMetadatasToDelete, flatObjectMetadataMaps: existingFlatObjectMetadataMaps, - flatFieldMetadataMaps: existingFlatFieldMetadataMaps, flatSearchFieldMetadataMaps: existingFlatSearchFieldMetadataMaps, }); @@ -200,6 +196,5 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({ flatIndexesToDelete, flatIndexesToUpdate, searchFieldMetadatasToDelete, - flatSearchVectorFieldsToUpdate, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts index c61fef38ae..9ed3168878 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts @@ -78,6 +78,12 @@ export const fromFieldMetadataEntityToFlatFieldMetadata = ( fieldMetadataEntity.viewSorts?.map( ({ universalIdentifier }) => universalIdentifier, ) ?? [], + searchFieldMetadataIds: + fieldMetadataEntity.searchFieldMetadatas?.map(({ id }) => id) ?? [], + searchFieldMetadataUniversalIdentifiers: + fieldMetadataEntity.searchFieldMetadatas?.map( + ({ universalIdentifier }) => universalIdentifier, + ) ?? [], fieldPermissionUniversalIdentifiers: fieldMetadataEntity.fieldPermissions?.map( ({ universalIdentifier }) => universalIdentifier, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts index 73aa746b87..63abd96223 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-update-field-input-to-flat-field-metadata.util.ts @@ -35,7 +35,6 @@ type FromUpdateFieldInputToFlatFieldMetadataArgs = { | 'flatViewGroupMaps' | 'flatViewMaps' | 'flatViewFieldMaps' - | 'flatSearchFieldMetadataMaps' >; type FlatFieldMetadataAndIndexToUpdate = { @@ -52,7 +51,6 @@ export const fromUpdateFieldInputToFlatFieldMetadata = ({ flatViewGroupMaps, flatViewMaps, flatViewFieldMaps, - flatSearchFieldMetadataMaps, isSystemBuild, }: FromUpdateFieldInputToFlatFieldMetadataArgs): FieldInputTranspilationResult => { const updateFieldInputInformalProperties = @@ -152,7 +150,6 @@ export const fromUpdateFieldInputToFlatFieldMetadata = ({ toFlatFieldMetadata, flatViewMaps, flatViewFieldMaps, - flatSearchFieldMetadataMaps, flatApplication, }); @@ -175,14 +172,12 @@ export const fromUpdateFieldInputToFlatFieldMetadata = ({ flatViewsToDelete, flatViewFieldsToDelete, flatViewsToUpdate, - flatFieldMetadatasToUpdate: flatFieldMetadatasToUpdateFromSideEffect, } = sideEffectResult.result; return { flatFieldMetadatasToUpdate: [ ...accumulator.flatFieldMetadatasToUpdate, toFlatFieldMetadata, - ...flatFieldMetadatasToUpdateFromSideEffect, ], flatIndexMetadatasToUpdate: [ ...accumulator.flatIndexMetadatasToUpdate, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts index 63aabbf5cc..bc6a4fe4a4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts @@ -77,5 +77,6 @@ export const getDefaultFlatFieldMetadata = ({ mainGroupByFieldMetadataViewUniversalIdentifiers: [], universalSettings: settings ?? null, viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies UniversalFlatFieldMetadata; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-flat-field-metadata-update-side-effect.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-flat-field-metadata-update-side-effect.util.ts index 2c84d6603e..7022ff4070 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-flat-field-metadata-update-side-effect.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/handle-flat-field-metadata-update-side-effect.util.ts @@ -1,9 +1,7 @@ import { type FromTo } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { handleEnumFlatFieldMetadataUpdateSideEffects } from 'src/engine/metadata-modules/flat-field-metadata/utils/handle-enum-flat-field-metadata-update-side-effects.util'; @@ -16,7 +14,6 @@ import { handleIndexChangesDuringFieldUpdate, } from 'src/engine/metadata-modules/flat-field-metadata/utils/handle-index-changes-during-field-update.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; -import { recomputeSearchVectorOnFieldRename } from 'src/engine/metadata-modules/flat-field-metadata/utils/recompute-search-vector-on-field-rename.util'; import { type FlatViewFiltersToDeleteAndUpdate } from 'src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-filters-on-flat-field-metadata-options-update.util'; import { type FlatViewGroupsToDeleteUpdateAndCreate } from 'src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-flat-field-metadata-options-update.util'; @@ -24,9 +21,7 @@ export type FlatFieldMetadataUpdateSideEffects = FlatViewFiltersToDeleteAndUpdate & FlatViewGroupsToDeleteUpdateAndCreate & FieldMetadataUpdateIndexSideEffect & - FieldMetadataDeactivationSideEffect & { - flatFieldMetadatasToUpdate: FlatFieldMetadata[]; - }; + FieldMetadataDeactivationSideEffect; type HandleFlatFieldMetadataUpdateSideEffectArgs = FromTo< FlatFieldMetadata, @@ -41,7 +36,6 @@ type HandleFlatFieldMetadataUpdateSideEffectArgs = FromTo< | 'flatViewGroupMaps' | 'flatViewMaps' | 'flatViewFieldMaps' - | 'flatSearchFieldMetadataMaps' > & { flatApplication: FlatApplication; }; @@ -59,7 +53,6 @@ export const FLAT_FIELD_METADATA_UPDATE_EMPTY_SIDE_EFFECTS: FlatFieldMetadataUpd flatViewsToDelete: [], flatViewFieldsToDelete: [], flatViewsToUpdate: [], - flatFieldMetadatasToUpdate: [], }; export const handleFlatFieldMetadataUpdateSideEffect = ({ @@ -72,7 +65,6 @@ export const handleFlatFieldMetadataUpdateSideEffect = ({ flatViewGroupMaps, flatViewMaps, flatViewFieldMaps, - flatSearchFieldMetadataMaps, flatApplication, }: HandleFlatFieldMetadataUpdateSideEffectArgs): FieldInputTranspilationResult => { const sideEffectResult = structuredClone( @@ -140,25 +132,6 @@ export const handleFlatFieldMetadataUpdateSideEffect = ({ return indexChangesSideEffectResult; } - const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: flatObjectMetadataMaps, - flatEntityId: fromFlatFieldMetadata.objectMetadataId, - }); - - const { flatSearchVectorFieldToUpdate } = recomputeSearchVectorOnFieldRename({ - fromFlatFieldMetadata, - toFlatFieldMetadata, - flatObjectMetadata, - flatFieldMetadataMaps, - flatSearchFieldMetadataMaps, - }); - - if (isDefined(flatSearchVectorFieldToUpdate)) { - sideEffectResult.flatFieldMetadatasToUpdate.push( - flatSearchVectorFieldToUpdate, - ); - } - const { flatIndexMetadatasToUpdate, flatIndexMetadatasToCreate, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-search-vector-on-field-rename.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-search-vector-on-field-rename.util.ts deleted file mode 100644 index f6691ad6db..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-search-vector-on-field-rename.util.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { type FieldMetadataType, type FromTo } from 'twenty-shared/types'; - -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { recomputeSearchVectorFieldFromSearchFieldMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util'; -import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; - -export type FieldMetadataUpdateSearchVectorSideEffect = { - flatSearchVectorFieldToUpdate: - | FlatFieldMetadata - | undefined; -}; - -type RecomputeSearchVectorOnFieldRenameArgs = { - flatObjectMetadata: FlatObjectMetadata; -} & FromTo & - Pick< - AllFlatEntityMaps, - 'flatFieldMetadataMaps' | 'flatSearchFieldMetadataMaps' - >; - -const EMPTY_SIDE_EFFECT: FieldMetadataUpdateSearchVectorSideEffect = { - flatSearchVectorFieldToUpdate: undefined, -}; - -export const recomputeSearchVectorOnFieldRename = ({ - fromFlatFieldMetadata, - toFlatFieldMetadata, - flatObjectMetadata, - flatFieldMetadataMaps, - flatSearchFieldMetadataMaps, -}: RecomputeSearchVectorOnFieldRenameArgs): FieldMetadataUpdateSearchVectorSideEffect => { - if (!flatObjectMetadata.isSearchable) { - return EMPTY_SIDE_EFFECT; - } - - const objectSearchFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: flatSearchFieldMetadataMaps, - flatEntityIds: flatObjectMetadata.searchFieldMetadataIds, - }); - - const isIndexedField = objectSearchFieldMetadatas.some( - (searchFieldMetadata) => - searchFieldMetadata.fieldMetadataId === toFlatFieldMetadata.id, - ); - - const hasNameChanged = - fromFlatFieldMetadata.name !== toFlatFieldMetadata.name; - - if (!isIndexedField || !hasNameChanged) { - return EMPTY_SIDE_EFFECT; - } - - return { - flatSearchVectorFieldToUpdate: - recomputeSearchVectorFieldFromSearchFieldMetadatas({ - flatObjectMetadata, - flatFieldMetadataMaps, - searchFieldMetadatas: objectSearchFieldMetadatas, - overrideFlatFieldMetadataById: new Map([ - [toFlatFieldMetadata.id, toFlatFieldMetadata], - ]), - }), - }; -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-ts-vector-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-ts-vector-flat-field-metadata.util.ts index 3cca34acee..cd8e14a623 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-ts-vector-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-ts-vector-flat-field-metadata.util.ts @@ -1,11 +1,9 @@ import { msg } from '@lingui/core/macro'; -import { isNonEmptyString } from '@sniptt/guards'; import { type FieldMetadataType } from 'twenty-shared/types'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type FlatFieldMetadataTypeValidationArgs } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { isSafeTsVectorExpression } from 'src/engine/workspace-manager/workspace-migration/utils/remove-sql-injection.util'; export const validateTsVectorFlatFieldMetadata = ({ flatEntityToValidate, @@ -30,22 +28,5 @@ export const validateTsVectorFlatFieldMetadata = ({ }); } - const asExpression = flatEntityToValidate.universalSettings?.asExpression; - - if (!isNonEmptyString(asExpression)) { - errors.push({ - code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - message: - 'Field type TS_VECTOR must have an expression. This may have failed to be built because record identifier field does not exist or is not of a searchable type.', - userFriendlyMessage: msg`Field type TS_VECTOR must have an expression. This may have failed to be built because record identifier field does not exist or is not of a searchable type.`, - }); - } else if (!isSafeTsVectorExpression(asExpression)) { - errors.push({ - code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT, - message: 'Field type TS_VECTOR expression is invalid', - userFriendlyMessage: msg`The search field expression is invalid.`, - }); - } - return errors; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-on-label-identifier-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/compute-search-field-metadata-to-create-on-label-identifier-update.util.ts similarity index 68% rename from packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-on-label-identifier-update.util.ts rename to packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/compute-search-field-metadata-to-create-on-label-identifier-update.util.ts index e33cbf60dc..fca60403a2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-on-label-identifier-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/compute-search-field-metadata-to-create-on-label-identifier-update.util.ts @@ -1,24 +1,20 @@ -import { type FieldMetadataType, type FromTo } from 'twenty-shared/types'; +import { type FromTo } from 'twenty-shared/types'; import { isDefined, isSearchableFieldType } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { recomputeSearchVectorFieldFromSearchFieldMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util'; import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; import { buildFlatSearchFieldMetadataForField } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util'; +import { findTsVectorFlatFieldMetadataForObject } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util'; import { type UniversalFlatSearchFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-search-field-metadata.type'; -export type LabelIdentifierUpdateSearchVectorSideEffect = { - flatSearchVectorFieldToUpdate: - | FlatFieldMetadata - | undefined; +export type LabelIdentifierUpdateSearchFieldMetadataSideEffect = { searchFieldMetadatasToCreate: UniversalFlatSearchFieldMetadata[]; }; -type RecomputeSearchVectorOnLabelIdentifierUpdateArgs = FromTo< +type ComputeSearchFieldMetadataToCreateOnLabelIdentifierUpdateArgs = FromTo< FlatObjectMetadata, 'flatObjectMetadata' > & @@ -27,21 +23,20 @@ type RecomputeSearchVectorOnLabelIdentifierUpdateArgs = FromTo< 'flatFieldMetadataMaps' | 'flatSearchFieldMetadataMaps' >; -const EMPTY_SIDE_EFFECT: LabelIdentifierUpdateSearchVectorSideEffect = { - flatSearchVectorFieldToUpdate: undefined, +const EMPTY_SIDE_EFFECT: LabelIdentifierUpdateSearchFieldMetadataSideEffect = { searchFieldMetadatasToCreate: [], }; // Relabeling is additive: it indexes the new label identifier field while preserving the // existing search surface (e.g. the provisioned name row). We never drop a row here so the -// previous label identifier stays searchable. Removal of fields from the search surface is -// deferred to a follow-up PR. -export const recomputeSearchVectorOnLabelIdentifierUpdate = ({ +// previous label identifier stays searchable. The searchVector column itself is rebuilt +// from the resulting rows by the rebuildSearchVector marker in the migration runner. +export const computeSearchFieldMetadataToCreateOnLabelIdentifierUpdate = ({ fromFlatObjectMetadata, toFlatObjectMetadata, flatFieldMetadataMaps, flatSearchFieldMetadataMaps, -}: RecomputeSearchVectorOnLabelIdentifierUpdateArgs): LabelIdentifierUpdateSearchVectorSideEffect => { +}: ComputeSearchFieldMetadataToCreateOnLabelIdentifierUpdateArgs): LabelIdentifierUpdateSearchFieldMetadataSideEffect => { const newLabelIdentifierFieldMetadataId = toFlatObjectMetadata.labelIdentifierFieldMetadataId; @@ -79,6 +74,15 @@ export const recomputeSearchVectorOnLabelIdentifierUpdate = ({ return EMPTY_SIDE_EFFECT; } + const tsVectorFlatFieldMetadata = findTsVectorFlatFieldMetadataForObject({ + fieldUniversalIdentifiers: fromFlatObjectMetadata.fieldUniversalIdentifiers, + flatFieldMetadataMaps, + }); + + if (!isDefined(tsVectorFlatFieldMetadata)) { + return EMPTY_SIDE_EFFECT; + } + const newLabelIdentifierPosition = existingSearchFieldMetadatas.reduce( (maxPosition, searchFieldMetadata) => @@ -89,25 +93,11 @@ export const recomputeSearchVectorOnLabelIdentifierUpdate = ({ const newSearchFieldMetadata = buildFlatSearchFieldMetadataForField({ flatObjectMetadata: fromFlatObjectMetadata, flatFieldMetadata: newLabelIdentifierField, + tsVectorFlatFieldMetadata, position: newLabelIdentifierPosition, }); - const nextSearchFieldMetadatas = [ - ...existingSearchFieldMetadatas, - { - fieldMetadataId: newLabelIdentifierFieldMetadataId, - position: newLabelIdentifierPosition, - universalIdentifier: newSearchFieldMetadata.universalIdentifier, - }, - ]; - return { - flatSearchVectorFieldToUpdate: - recomputeSearchVectorFieldFromSearchFieldMetadatas({ - flatObjectMetadata: fromFlatObjectMetadata, - flatFieldMetadataMaps, - searchFieldMetadatas: nextSearchFieldMetadatas, - }), searchFieldMetadatasToCreate: [newSearchFieldMetadata], }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts index bbff2b9ac0..44b74d7de6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts @@ -102,7 +102,6 @@ export const fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities = flatViewFieldsToCreate, flatViewFieldsToUpdate, otherObjectFlatFieldMetadatasToUpdate, - sameObjectFlatFieldMetadatasToUpdate, searchFieldMetadatasToCreate, } = handleFlatObjectMetadataUpdateSideEffect({ fromFlatObjectMetadata: existingFlatObjectMetadata, @@ -121,7 +120,6 @@ export const fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities = flatViewFieldsToCreate, flatViewFieldsToUpdate, otherObjectFlatFieldMetadatasToUpdate, - sameObjectFlatFieldMetadatasToUpdate, searchFieldMetadatasToCreate, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts index 7bd20b0beb..e90294edd1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts @@ -2,10 +2,9 @@ import { type FromTo } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { computeSearchFieldMetadataToCreateOnLabelIdentifierUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-search-field-metadata-to-create-on-label-identifier-update.util'; import { recomputeIndexAfterFlatObjectMetadataSingularNameUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-index-after-flat-object-metadata-singular-name-update.util'; -import { recomputeSearchVectorOnLabelIdentifierUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-on-label-identifier-update.util'; import { recomputeViewFieldIdentifierAfterFlatObjectIdentifierUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util'; import { renameRelatedMorphFieldOnObjectNamesUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util'; import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; @@ -15,7 +14,6 @@ import { type UniversalFlatViewField } from 'src/engine/workspace-manager/worksp export type FlatObjectMetadataUpdateSideEffects = { otherObjectFlatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; - sameObjectFlatFieldMetadatasToUpdate: UniversalFlatFieldMetadata[]; flatViewFieldsToUpdate: UniversalFlatViewField[]; flatViewFieldsToCreate: UniversalFlatViewField[]; flatIndexMetadatasToUpdate: UniversalFlatIndexMetadata[]; @@ -89,20 +87,14 @@ export const handleFlatObjectMetadataUpdateSideEffect = ({ flatViewFieldsToUpdate: [], }; - const sameObjectFlatFieldMetadatasToUpdate: FlatFieldMetadata[] = []; - - const { flatSearchVectorFieldToUpdate, searchFieldMetadatasToCreate } = - recomputeSearchVectorOnLabelIdentifierUpdate({ + const { searchFieldMetadatasToCreate } = + computeSearchFieldMetadataToCreateOnLabelIdentifierUpdate({ fromFlatObjectMetadata, toFlatObjectMetadata, flatFieldMetadataMaps, flatSearchFieldMetadataMaps, }); - if (isDefined(flatSearchVectorFieldToUpdate)) { - sameObjectFlatFieldMetadatasToUpdate.push(flatSearchVectorFieldToUpdate); - } - return { flatIndexMetadatasToUpdate: [ ...morphRelatedFlatIndexesToUpdate, @@ -111,7 +103,6 @@ export const handleFlatObjectMetadataUpdateSideEffect = ({ flatViewFieldsToCreate, flatViewFieldsToUpdate, otherObjectFlatFieldMetadatasToUpdate: morphFlatFieldMetadatasToUpdate, - sameObjectFlatFieldMetadatasToUpdate, searchFieldMetadatasToCreate, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util.ts deleted file mode 100644 index 14f7eebcb0..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-search-vector-field-from-search-field-metadatas.util.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { FieldMetadataType } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; -import { - ObjectMetadataException, - ObjectMetadataExceptionCode, -} from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; -import { - buildSearchVectorTargetField, - computeSearchVectorAsExpressionFromSearchFieldMetadatas, -} from 'src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util'; -import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; - -type RecomputeSearchVectorFieldFromSearchFieldMetadatasArgs = { - flatObjectMetadata: FlatObjectMetadata; - // Post-change searchFieldMetadata rows for the object, carrying the field id and the - // per-object position that drives the deterministic asExpression order. - searchFieldMetadatas: Pick< - FlatSearchFieldMetadata, - 'fieldMetadataId' | 'position' | 'universalIdentifier' - >[]; - // Takes precedence over the flat maps when resolving an id — for a field created or - // renamed in the same migration, whose maps entry is absent or stale. - overrideFlatFieldMetadataById?: Map; -} & Pick; - -export const recomputeSearchVectorFieldFromSearchFieldMetadatas = ({ - flatObjectMetadata, - flatFieldMetadataMaps, - searchFieldMetadatas, - overrideFlatFieldMetadataById, -}: RecomputeSearchVectorFieldFromSearchFieldMetadatasArgs): - | FlatFieldMetadata - | undefined => { - const objectFlatFieldMetadatas = - findManyFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityMaps: flatFieldMetadataMaps, - flatEntityIds: flatObjectMetadata.fieldIds, - }); - - const searchVectorField = objectFlatFieldMetadatas.find( - (field) => field.name === SEARCH_VECTOR_FIELD.name, - ); - - if ( - !isDefined(searchVectorField) || - !isFlatFieldMetadataOfType(searchVectorField, FieldMetadataType.TS_VECTOR) - ) { - throw new ObjectMetadataException( - `Search vector field not found for object metadata ${flatObjectMetadata.id}`, - ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, - ); - } - - const targetSearchableFields = searchFieldMetadatas.map( - (searchFieldMetadata) => { - const { fieldMetadataId, position, universalIdentifier } = - searchFieldMetadata; - - const overriddenFlatFieldMetadata = - overrideFlatFieldMetadataById?.get(fieldMetadataId); - - const flatFieldMetadata = - overriddenFlatFieldMetadata ?? - findFlatEntityByIdInFlatEntityMaps({ - flatEntityId: fieldMetadataId, - flatEntityMaps: flatFieldMetadataMaps, - }); - - if (!isDefined(flatFieldMetadata)) { - throw new ObjectMetadataException( - `Field metadata ${fieldMetadataId} referenced by searchFieldMetadata not found for object metadata ${flatObjectMetadata.id}`, - ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, - ); - } - - return buildSearchVectorTargetField( - flatFieldMetadata, - position, - universalIdentifier, - ); - }, - ); - - try { - const newAsExpression = - computeSearchVectorAsExpressionFromSearchFieldMetadatas( - targetSearchableFields, - ); - - return { - ...searchVectorField, - universalSettings: { - ...searchVectorField.universalSettings, - asExpression: newAsExpression, - generatedType: 'STORED', - }, - }; - } catch (error) { - throw new ObjectMetadataException( - `Failed to compute search vector column expression for object metadata ${flatObjectMetadata.id}: ${error instanceof Error ? error.message : String(error)}`, - ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, - ); - } -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/services/workspace-flat-search-field-metadata-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/services/workspace-flat-search-field-metadata-map-cache.service.ts index 2618f7ce39..48cc387ae4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/services/workspace-flat-search-field-metadata-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/services/workspace-flat-search-field-metadata-map-cache.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service'; @@ -11,6 +13,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti import { FlatSearchFieldMetadataMaps } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata-maps.type'; import { fromSearchFieldMetadataEntityToFlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/from-search-field-metadata-entity-to-flat-search-field-metadata.util'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity'; import { InjectWorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scoped-repository/inject-workspace-scoped-repository.decorator'; import { WorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scoped-repository/workspace-scoped-repository'; @@ -56,7 +59,13 @@ export class WorkspaceFlatSearchFieldMetadataMapCacheService extends WorkspaceCa }), this.fieldMetadataRepository.find({ where: { workspaceId }, - select: ['id', 'universalIdentifier'], + select: [ + 'id', + 'universalIdentifier', + 'name', + 'type', + 'objectMetadataId', + ], withDeleted: true, }), ]); @@ -68,12 +77,42 @@ export class WorkspaceFlatSearchFieldMetadataMapCacheService extends WorkspaceCa const fieldMetadataIdToUniversalIdentifierMap = createIdToUniversalIdentifierMap(fieldMetadatas); + // Each object's single system TS_VECTOR field, used to backfill the FK for + // legacy searchFieldMetadata rows still NULL before the 2.18 slow command runs. + // TODO: remove this fallback (and the searchVector map) once the minimum + // cross-upgrade supported version is past 2.18 — at which point no instance can + // still have NULL tsVectorFieldMetadataId rows. + const searchVectorFieldIdByObjectMetadataId = new Map(); + + for (const fieldMetadata of fieldMetadatas) { + if ( + fieldMetadata.type === FieldMetadataType.TS_VECTOR && + fieldMetadata.name === SEARCH_VECTOR_FIELD.name + ) { + searchVectorFieldIdByObjectMetadataId.set( + fieldMetadata.objectMetadataId, + fieldMetadata.id, + ); + } + } + const flatSearchFieldMetadataMaps = createEmptyFlatEntityMaps(); for (const searchFieldMetadata of existingSearchFieldMetadatas) { + const resolvedTsVectorFieldMetadataId = + (searchFieldMetadata.tsVectorFieldMetadataId as string | null) ?? + searchVectorFieldIdByObjectMetadataId.get( + searchFieldMetadata.objectMetadataId, + ); + const flatSearchFieldMetadata = fromSearchFieldMetadataEntityToFlatSearchFieldMetadata({ - entity: searchFieldMetadata, + entity: isDefined(resolvedTsVectorFieldMetadataId) + ? { + ...searchFieldMetadata, + tsVectorFieldMetadataId: resolvedTsVectorFieldMetadataId, + } + : searchFieldMetadata, applicationIdToUniversalIdentifierMap, objectMetadataIdToUniversalIdentifierMap, fieldMetadataIdToUniversalIdentifierMap, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util.ts index 51250533d7..eef9ff9192 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/build-flat-search-field-metadata-for-field.util.ts @@ -6,6 +6,7 @@ import { type UniversalFlatSearchFieldMetadata } from 'src/engine/workspace-mana export const buildFlatSearchFieldMetadataForField = ({ flatObjectMetadata, flatFieldMetadata, + tsVectorFlatFieldMetadata, position, }: { flatObjectMetadata: Pick< @@ -13,6 +14,7 @@ export const buildFlatSearchFieldMetadataForField = ({ 'applicationUniversalIdentifier' | 'universalIdentifier' >; flatFieldMetadata: { universalIdentifier: string }; + tsVectorFlatFieldMetadata: { universalIdentifier: string }; position: number; }): UniversalFlatSearchFieldMetadata => { const createdAt = new Date().toISOString(); @@ -26,5 +28,7 @@ export const buildFlatSearchFieldMetadataForField = ({ flatObjectMetadata.applicationUniversalIdentifier, objectMetadataUniversalIdentifier: flatObjectMetadata.universalIdentifier, fieldMetadataUniversalIdentifier: flatFieldMetadata.universalIdentifier, + tsVectorFieldMetadataUniversalIdentifier: + tsVectorFlatFieldMetadata.universalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util.ts index 89e7407ee7..eb2a94dcec 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util.ts @@ -15,11 +15,15 @@ export type SearchVectorTargetField = { sortKey: string; }; -export const buildSearchVectorTargetField = ( - field: { name: string; type: FieldMetadataType }, - position: number, - sortKey: string, -): SearchVectorTargetField => ({ +export const buildSearchVectorTargetField = ({ + field, + position, + sortKey, +}: { + field: { name: string; type: FieldMetadataType }; + position: number; + sortKey: string; +}): SearchVectorTargetField => ({ name: field.name, type: field.type, position, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util.ts new file mode 100644 index 0000000000..0208cb40d5 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util.ts @@ -0,0 +1,53 @@ +import { type FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { + buildSearchVectorTargetField, + computeSearchVectorAsExpressionFromSearchFieldMetadatas, +} from 'src/engine/metadata-modules/flat-search-field-metadata/utils/compute-search-vector-as-expression-from-search-field-metadatas.util'; +import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; + +export const deriveSearchVectorAsExpressionForTsVectorField = ({ + tsVectorFieldMetadataId, + flatSearchFieldMetadataMaps, + indexedFieldById, +}: { + tsVectorFieldMetadataId: string; + flatSearchFieldMetadataMaps: FlatEntityMaps; + indexedFieldById: ReadonlyMap< + string, + { name: string; type: FieldMetadataType } + >; +}): string => { + const targetSearchableFields = Object.values( + flatSearchFieldMetadataMaps.byUniversalIdentifier, + ) + .filter(isDefined) + .filter( + (flatSearchFieldMetadata) => + flatSearchFieldMetadata.tsVectorFieldMetadataId === + tsVectorFieldMetadataId, + ) + .flatMap((flatSearchFieldMetadata) => { + const indexedField = indexedFieldById.get( + flatSearchFieldMetadata.fieldMetadataId, + ); + + if (!isDefined(indexedField)) { + return []; + } + + return [ + buildSearchVectorTargetField({ + field: indexedField, + position: flatSearchFieldMetadata.position, + sortKey: flatSearchFieldMetadata.universalIdentifier, + }), + ]; + }); + + return computeSearchVectorAsExpressionFromSearchFieldMetadatas( + targetSearchableFields, + ); +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util.ts new file mode 100644 index 0000000000..f73ad53d30 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/find-ts-vector-flat-field-metadata-for-object.util.ts @@ -0,0 +1,28 @@ +import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; + +// Resolves the object's single system TS_VECTOR field (the 'searchVector' field) that +// every searchFieldMetadata row contributes to. +// Could be refactored once https://github.com/twentyhq/twenty/pull/21949 has been merged. +export const findTsVectorFlatFieldMetadataForObject = ({ + fieldUniversalIdentifiers, + flatFieldMetadataMaps, +}: { + fieldUniversalIdentifiers: string[]; + flatFieldMetadataMaps: FlatEntityMaps; +}): FlatFieldMetadata | undefined => + fieldUniversalIdentifiers + .map( + (fieldUniversalIdentifier) => + flatFieldMetadataMaps.byUniversalIdentifier[fieldUniversalIdentifier], + ) + .find( + (flatFieldMetadata) => + isDefined(flatFieldMetadata) && + flatFieldMetadata.type === FieldMetadataType.TS_VECTOR && + flatFieldMetadata.name === SEARCH_VECTOR_FIELD.name, + ); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-flat-search-field-metadata-to-search-field-metadata-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-flat-search-field-metadata-to-search-field-metadata-dto.util.ts new file mode 100644 index 0000000000..4694365b9e --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-flat-search-field-metadata-to-search-field-metadata-dto.util.ts @@ -0,0 +1,15 @@ +import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; +import { type SearchFieldMetadataDTO } from 'src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto'; + +export const fromFlatSearchFieldMetadataToSearchFieldMetadataDto = ( + flatSearchFieldMetadata: FlatSearchFieldMetadata, +): SearchFieldMetadataDTO => ({ + id: flatSearchFieldMetadata.id, + objectMetadataId: flatSearchFieldMetadata.objectMetadataId, + fieldMetadataId: flatSearchFieldMetadata.fieldMetadataId, + tsVectorFieldMetadataId: flatSearchFieldMetadata.tsVectorFieldMetadataId, + position: flatSearchFieldMetadata.position, + createdAt: new Date(flatSearchFieldMetadata.createdAt), + updatedAt: new Date(flatSearchFieldMetadata.updatedAt), + workspaceId: flatSearchFieldMetadata.workspaceId, +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-search-field-metadata-entity-to-flat-search-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-search-field-metadata-entity-to-flat-search-field-metadata.util.ts index 54d54ad237..6a696e0770 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-search-field-metadata-entity-to-flat-search-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-search-field-metadata/utils/from-search-field-metadata-entity-to-flat-search-field-metadata.util.ts @@ -55,6 +55,18 @@ export const fromSearchFieldMetadataEntityToFlatSearchFieldMetadata = ({ ); } + const tsVectorFieldMetadataUniversalIdentifier = + fieldMetadataIdToUniversalIdentifierMap.get( + searchFieldMetadataEntity.tsVectorFieldMetadataId, + ); + + if (!isDefined(tsVectorFieldMetadataUniversalIdentifier)) { + throw new FlatEntityMapsException( + `TS_VECTOR field metadata with id ${searchFieldMetadataEntity.tsVectorFieldMetadataId} not found for searchFieldMetadata ${searchFieldMetadataEntity.id}`, + FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND, + ); + } + return { ...searchFieldMetadataEntityWithoutRelations, createdAt: searchFieldMetadataEntity.createdAt.toISOString(), @@ -64,5 +76,6 @@ export const fromSearchFieldMetadataEntityToFlatSearchFieldMetadata = ({ applicationUniversalIdentifier, objectMetadataUniversalIdentifier, fieldMetadataUniversalIdentifier, + tsVectorFieldMetadataUniversalIdentifier, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/partial-system-flat-field-metadatas.constant.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/partial-system-flat-field-metadatas.constant.ts index ddb79529ff..b793b9b6e4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/partial-system-flat-field-metadatas.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/constants/partial-system-flat-field-metadatas.constant.ts @@ -40,6 +40,7 @@ const PARTIAL_ID_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_CREATED_AT_FIELD = { @@ -69,6 +70,7 @@ const PARTIAL_CREATED_AT_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_UPDATED_AT_FIELD = { @@ -98,6 +100,7 @@ const PARTIAL_UPDATED_AT_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_DELETED_AT_FIELD = { @@ -127,6 +130,7 @@ const PARTIAL_DELETED_AT_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_CREATED_BY_FIELD = { @@ -156,6 +160,7 @@ const PARTIAL_CREATED_BY_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_UPDATED_BY_FIELD = { @@ -185,6 +190,7 @@ const PARTIAL_UPDATED_BY_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_POSITION_FIELD = { @@ -214,6 +220,7 @@ const PARTIAL_POSITION_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; const PARTIAL_SEARCH_VECTOR_FIELD = { @@ -245,6 +252,7 @@ const PARTIAL_SEARCH_VECTOR_FIELD = { mainGroupByFieldMetadataViewUniversalIdentifiers: [], fieldPermissionUniversalIdentifiers: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataUniversalIdentifiers: [], } as const satisfies PartialSystemFlatFieldMetadata; export const PARTIAL_SYSTEM_FLAT_FIELD_METADATAS = { diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts index c498025ba1..4685a82ba0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts @@ -30,6 +30,7 @@ import { ObjectRecordCountDTO } from 'src/engine/metadata-modules/object-metadat import { UpdateOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { ObjectRecordCountService } from 'src/engine/metadata-modules/object-metadata/object-record-count.service'; +import { SearchFieldMetadataDTO } from 'src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto'; import { objectMetadataGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util'; import { resolveObjectMetadataStandardOverride } from 'src/engine/metadata-modules/object-metadata/utils/resolve-object-metadata-standard-override.util'; import { PermissionsGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/permissions/utils/permissions-graphql-api-exception.filter'; @@ -273,4 +274,25 @@ export class ObjectMetadataResolver { return []; } } + + @ResolveField(() => [SearchFieldMetadataDTO], { nullable: false }) + async searchFieldMetadataList( + @AuthWorkspace() workspace: WorkspaceEntity, + @Parent() objectMetadata: ObjectMetadataDTO, + @Context() context: { loaders: IDataloaders }, + ): Promise { + try { + const searchFieldMetadataItems = + await context.loaders.searchFieldMetadataLoader.load({ + objectMetadata, + workspaceId: workspace.id, + }); + + return searchFieldMetadataItems; + } catch (error) { + objectMetadataGraphqlApiExceptionHandler(error); + + return []; + } + } } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 74f76c5201..09536993d4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -107,7 +107,6 @@ export class ObjectMetadataService extends TypeOrmQueryService['universalSettings'] = - { - asExpression: getTsVectorColumnExpressionFromFields( - nameField ? [nameField] : [], - ), - generatedType: 'STORED', - }; + null; return { fields: { diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-search-field-metadatas-for-custom-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-search-field-metadatas-for-custom-object.util.ts index d32890f410..157c64bf65 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-search-field-metadatas-for-custom-object.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-search-field-metadatas-for-custom-object.util.ts @@ -27,6 +27,8 @@ export const buildDefaultSearchFieldMetadatasForCustomObject = ({ const nameSearchFieldMetadata = buildFlatSearchFieldMetadataForField({ flatObjectMetadata, flatFieldMetadata: nameField, + tsVectorFlatFieldMetadata: + defaultFlatFieldForCustomObjectMaps.fields.searchVector, position: 0, }); diff --git a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto.ts b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto.ts new file mode 100644 index 0000000000..9510c9ceb2 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/dtos/search-field-metadata.dto.ts @@ -0,0 +1,57 @@ +import { Field, HideField, ObjectType } from '@nestjs/graphql'; + +import { + Authorize, + IDField, + QueryOptions, +} from '@ptc-org/nestjs-query-graphql'; +import { IsDateString, IsNotEmpty, IsNumber, IsUUID } from 'class-validator'; + +import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; + +@ObjectType('SearchField') +@Authorize({ + // oxlint-disable-next-line typescript/no-explicit-any + authorize: (context: any) => ({ + workspaceId: { eq: context?.req?.workspace?.id }, + }), +}) +@QueryOptions({ + defaultResultSize: 10, + disableSort: true, + maxResultsSize: 1000, +}) +export class SearchFieldMetadataDTO { + @IsUUID() + @IsNotEmpty() + @IDField(() => UUIDScalarType) + id: string; + + objectMetadataId: string; + + @IsUUID() + @IsNotEmpty() + @Field(() => UUIDScalarType) + fieldMetadataId: string; + + @IsUUID() + @IsNotEmpty() + @Field(() => UUIDScalarType) + tsVectorFieldMetadataId: string; + + @IsNumber() + @IsNotEmpty() + @Field() + position: number; + + @IsDateString() + @Field() + createdAt: Date; + + @IsDateString() + @Field() + updatedAt: Date; + + @HideField() + workspaceId: string; +} diff --git a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/exceptions/search-field-metadata.exception.ts b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/exceptions/search-field-metadata.exception.ts index c7b87bfd4c..65a6830bfd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/exceptions/search-field-metadata.exception.ts +++ b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/exceptions/search-field-metadata.exception.ts @@ -3,4 +3,6 @@ export enum SearchFieldMetadataExceptionCode { INVALID_SEARCH_FIELD_METADATA_DATA = 'INVALID_SEARCH_FIELD_METADATA_DATA', OBJECT_METADATA_NOT_FOUND = 'OBJECT_METADATA_NOT_FOUND', FIELD_METADATA_NOT_FOUND = 'FIELD_METADATA_NOT_FOUND', + TS_VECTOR_FIELD_METADATA_NOT_FOUND = 'TS_VECTOR_FIELD_METADATA_NOT_FOUND', + INVALID_TS_VECTOR_FIELD_METADATA = 'INVALID_TS_VECTOR_FIELD_METADATA', } diff --git a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts index 3145e99fb3..d7dd374a95 100644 --- a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts @@ -12,6 +12,7 @@ import { } from 'typeorm'; import { ADD_UNIVERSAL_IDENTIFIER_AND_APPLICATION_ID_TO_SEARCH_FIELD_METADATA_UPGRADE_COMMAND_NAME } from 'src/database/commands/upgrade-version-command/2-16/add-universal-identifier-and-application-id-to-search-field-metadata-upgrade-command-name.constant'; +import { ADD_TS_VECTOR_FIELD_METADATA_ID_TO_SEARCH_FIELD_METADATA_UPGRADE_COMMAND_NAME } from 'src/database/commands/upgrade-version-command/2-18/add-ts-vector-field-metadata-id-to-search-field-metadata-upgrade-command-name.constant'; import { WasIntroducedInUpgrade } from 'src/engine/core-modules/upgrade/decorators/was-introduced-in-upgrade.decorator'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -46,10 +47,25 @@ export class SearchFieldMetadataEntity extends SyncableEntity { @Column({ nullable: false, type: 'uuid' }) fieldMetadataId: string; - @ManyToOne(() => FieldMetadataEntity, { onDelete: 'CASCADE' }) + @ManyToOne( + () => FieldMetadataEntity, + (fieldMetadata) => fieldMetadata.searchFieldMetadatas, + { onDelete: 'CASCADE' }, + ) @JoinColumn({ name: 'fieldMetadataId' }) fieldMetadata: Relation; + @WasIntroducedInUpgrade({ + upgradeCommandName: + ADD_TS_VECTOR_FIELD_METADATA_ID_TO_SEARCH_FIELD_METADATA_UPGRADE_COMMAND_NAME, + }) + @Column({ nullable: false, type: 'uuid' }) + tsVectorFieldMetadataId: string; + + @ManyToOne(() => FieldMetadataEntity, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'tsVectorFieldMetadataId' }) + tsVectorFieldMetadata: Relation; + @Column({ nullable: false, type: 'float' }) position: number; diff --git a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts index cb697ae7ba..83a7659eee 100644 --- a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts @@ -186,6 +186,8 @@ describe('WorkspaceEntityManager', () => { fieldPermissionUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: null, }; diff --git a/packages/twenty-server/src/engine/twenty-orm/repository/__tests__/workspace.repository.spec.ts b/packages/twenty-server/src/engine/twenty-orm/repository/__tests__/workspace.repository.spec.ts index 6043b62cd6..de118c815b 100644 --- a/packages/twenty-server/src/engine/twenty-orm/repository/__tests__/workspace.repository.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/repository/__tests__/workspace.repository.spec.ts @@ -109,6 +109,8 @@ describe('WorkspaceRepository', () => { fieldPermissionUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: null, }; 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 7515cf344f..0dcf590095 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildAttachmentStandardFlatFieldMetadatas = ({ now, objectName, @@ -327,12 +324,6 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, 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 771365c2ac..4443abd92d 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildBlocklistStandardFlatFieldMetadatas = ({ now, objectName, @@ -190,12 +187,6 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, 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 c28d1d8fb0..8e0716d8be 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ now, objectName, @@ -188,12 +185,6 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-participant-standard-flat-field-metadata.util.ts index c5594a5e82..03362a3408 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ now, objectName, @@ -186,12 +183,6 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-calendar-event-standard-flat-field-metadata.util.ts index 59faf1ceb1..05b9d69ab7 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 @@ -13,9 +13,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildCalendarEventStandardFlatFieldMetadatas = ({ now, objectName, @@ -182,12 +179,6 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-call-recording-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-call-recording-standard-flat-field-metadata.util.ts index b92246fedc..a6728f6065 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-call-recording-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-call-recording-standard-flat-field-metadata.util.ts @@ -14,10 +14,8 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; import { CallRecordingRequestStatus } from 'src/modules/call-recording/common/enums/call-recording-request-status.enum'; import { CallRecordingStatus } from 'src/modules/call-recording/common/enums/call-recording-status.enum'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; export const buildCallRecordingStandardFlatFieldMetadatas = ({ now, @@ -486,12 +484,6 @@ export const buildCallRecordingStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-company-standard-flat-field-metadata.util.ts index 437b3eb0e3..a620adc168 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildCompanyStandardFlatFieldMetadatas = ({ now, objectName, @@ -279,12 +276,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-dashboard-standard-flat-field-metadata.util.ts index 4636e2310c..f39f096c6f 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildDashboardStandardFlatFieldMetadatas = ({ now, objectName, @@ -219,12 +216,6 @@ export const buildDashboardStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-campaign-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-campaign-standard-flat-field-metadata.util.ts index f3c6b1c536..19120aaace 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-campaign-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-campaign-standard-flat-field-metadata.util.ts @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageCampaignStandardFlatFieldMetadatas = ({ now, objectName, @@ -160,12 +157,6 @@ export const buildMessageCampaignStandardFlatFieldMetadatas = ({ icon: 'IconSend', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, }), subject: createStandardFieldFlatMetadata({ diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-message-folder-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-message-folder-standard-flat-field-metadata.util.ts index 0bbc1dbdd5..aebee697d0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-channel-message-association-message-folder-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-message-folder-standard-flat-field-metadata.util.ts @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageChannelMessageAssociationMessageFolderStandardFlatFieldMetadatas = ({ now, @@ -192,12 +189,6 @@ export const buildMessageChannelMessageAssociationMessageFolderStandardFlatField icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, 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 4b69d7eee2..2267bb6050 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 @@ -14,8 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; import { MessageDirection } from 'src/modules/messaging/common/enums/message-direction.enum'; export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = @@ -193,12 +191,6 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas = icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-member-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-member-standard-flat-field-metadata.util.ts index 7f6aea1fb3..fad82b2c9e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-member-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-member-standard-flat-field-metadata.util.ts @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageListMemberStandardFlatFieldMetadatas = ({ now, objectName, @@ -234,12 +231,6 @@ export const buildMessageListMemberStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-standard-flat-field-metadata.util.ts index 8fe5f291b6..4171fcaa9a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-list-standard-flat-field-metadata.util.ts @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageListStandardFlatFieldMetadatas = ({ now, objectName, @@ -269,12 +266,6 @@ export const buildMessageListStandardFlatFieldMetadatas = ({ icon: 'IconUsersGroup', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-participant-standard-flat-field-metadata.util.ts index 381338d2f1..e21ca9aa1b 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageParticipantStandardFlatFieldMetadatas = ({ now, objectName, @@ -187,12 +184,6 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-standard-flat-field-metadata.util.ts index da68fef650..4e4c41fa64 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageStandardFlatFieldMetadatas = ({ now, objectName, @@ -183,12 +180,6 @@ export const buildMessageStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-message-thread-standard-flat-field-metadata.util.ts index c43a43152c..d320052cfe 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 @@ -13,9 +13,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildMessageThreadStandardFlatFieldMetadatas = ({ now, objectName, @@ -182,12 +179,6 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts index 64d322c37c..37ada61d33 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildNoteStandardFlatFieldMetadatas = ({ now, objectName, @@ -224,12 +221,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-target-standard-flat-field-metadata.util.ts index 1e647ddd5e..316d388ed7 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildNoteTargetStandardFlatFieldMetadatas = ({ now, objectName, @@ -191,12 +188,6 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, 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 7f754de066..4e1a62a919 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildOpportunityStandardFlatFieldMetadatas = ({ now, objectName, @@ -295,12 +292,6 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-person-standard-flat-field-metadata.util.ts index cb34da8c26..8e3773da7a 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 @@ -17,9 +17,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildPersonStandardFlatFieldMetadatas = ({ now, objectName, @@ -538,12 +535,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts index aabcfffbf8..98b46ebf2a 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildTaskStandardFlatFieldMetadatas = ({ now, objectName, @@ -281,12 +278,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-target-standard-flat-field-metadata.util.ts index 3594d77574..40abc8a77d 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildTaskTargetStandardFlatFieldMetadatas = ({ now, objectName, @@ -191,12 +188,6 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, 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 29c4f110c6..c5b20289d1 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 @@ -15,9 +15,6 @@ 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 { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildTimelineActivityStandardFlatFieldMetadatas = ({ now, objectName, @@ -597,12 +594,6 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-automated-trigger-standard-flat-field-metadata.util.ts index bbf5532c24..72000f808b 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ now, objectName, @@ -186,12 +183,6 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-run-standard-flat-field-metadata.util.ts index 2218c1c1fc..6ff53f9b4d 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildWorkflowRunStandardFlatFieldMetadatas = ({ now, objectName, @@ -360,12 +357,6 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({ isSystem: true, isNullable: true, isUIEditable: false, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-standard-flat-field-metadata.util.ts index fc1253a334..2fbbd049d8 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 @@ -14,9 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildWorkflowStandardFlatFieldMetadatas = ({ now, objectName, @@ -258,12 +255,6 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({ icon: 'IconUser', isSystem: true, isNullable: true, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workflow-version-standard-flat-field-metadata.util.ts index cdaad3f307..aea3e39f54 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 @@ -15,9 +15,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; - export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ now, objectName, @@ -288,12 +285,6 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({ isSystem: true, isNullable: true, isUIEditable: false, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-workspace-member-standard-flat-field-metadata.util.ts index 2e8b069436..ddfa9cbf80 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 @@ -14,8 +14,6 @@ import { createStandardFieldFlatMetadata, } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util'; import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/search-fields-by-standard-object-name.constant'; import { WorkspaceMemberNumberFormatEnum } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ @@ -457,12 +455,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({ isSystem: true, isNullable: true, isUIEditable: false, - settings: { - generatedType: 'STORED', - asExpression: getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_BY_STANDARD_OBJECT_NAME[objectName], - ), - }, }, standardObjectMetadataRelatedEntityIds, dependencyFlatEntityMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts index 5c34ebb817..6ca8aef187 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts @@ -117,6 +117,8 @@ export const createStandardFieldFlatMetadata = < mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: settings ?? null, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts index 4361b98271..c10d900907 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 @@ -138,6 +138,8 @@ export const createStandardRelationFieldFlatMetadata = < mainGroupByFieldMetadataViewUniversalIdentifiers: [], viewSortIds: [], viewSortUniversalIdentifiers: [], + searchFieldMetadataIds: [], + searchFieldMetadataUniversalIdentifiers: [], universalSettings: { ...settings, ...(junctionTargetFieldUniversalIdentifier && { diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/search-field-metadata/create-standard-search-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/search-field-metadata/create-standard-search-field-flat-metadata.util.ts index 1e7b62f96c..03e9254a68 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/search-field-metadata/create-standard-search-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/search-field-metadata/create-standard-search-field-flat-metadata.util.ts @@ -3,6 +3,7 @@ import { v4 } from 'uuid'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { type FlatSearchFieldMetadata } from 'src/engine/metadata-modules/flat-search-field-metadata/types/flat-search-field-metadata.type'; +import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.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'; @@ -56,6 +57,14 @@ export const createStandardSearchFieldFlatMetadata = < flatEntityMaps: flatFieldMetadataMaps, }); + const tsVectorFieldMetadataId = + standardObjectMetadataRelatedEntityIds[objectName].fields[ + SEARCH_VECTOR_FIELD.name as AllStandardObjectFieldName + ].id; + const tsVectorFieldMetadataUniversalIdentifier = + objectFields[SEARCH_VECTOR_FIELD.name as keyof typeof objectFields] + .universalIdentifier; + return { id: v4(), universalIdentifier: v4(), @@ -66,6 +75,8 @@ export const createStandardSearchFieldFlatMetadata = < objectMetadataUniversalIdentifier: flatObjectMetadata.universalIdentifier, fieldMetadataId, fieldMetadataUniversalIdentifier: flatFieldMetadata.universalIdentifier, + tsVectorFieldMetadataId, + tsVectorFieldMetadataUniversalIdentifier, position, workspaceId, createdAt: now, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts index b69ca891ab..ba090e8fcb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/utils/enrich-create-workspace-migration-action-with-ids.util.ts @@ -23,15 +23,14 @@ const buildFieldIdByUniversalIdentifierForObjectAction = ({ }; for (const universalFlatFieldMetadata of action.universalFlatFieldMetadatas) { + const { universalIdentifier } = universalFlatFieldMetadata; const providedFieldId = - fieldMetadataIdByUniversalIdentifier[ - universalFlatFieldMetadata.universalIdentifier - ]; + fieldMetadataIdByUniversalIdentifier[universalIdentifier]; if (isDefined(providedFieldId)) { - fieldIdByUniversalIdentifier[ - universalFlatFieldMetadata.universalIdentifier - ] = providedFieldId; + fieldIdByUniversalIdentifier[universalIdentifier] = providedFieldId; + } else if (!isDefined(fieldIdByUniversalIdentifier[universalIdentifier])) { + fieldIdByUniversalIdentifier[universalIdentifier] = v4(); } } @@ -200,6 +199,7 @@ export const enrichCreateWorkspaceMigrationActionsWithIds = ({ if ( action.metadataName !== 'fieldMetadata' && + action.metadataName !== 'objectMetadata' && !isDefined(idByUniversalIdentifier) && !isDefined(fieldMetadataIdByUniversalIdentifier) && !isDefined(pageLayoutTabIdByUniversalIdentifier) @@ -209,17 +209,18 @@ export const enrichCreateWorkspaceMigrationActionsWithIds = ({ switch (action.metadataName) { case 'objectMetadata': { - const id = isDefined(idByUniversalIdentifier) - ? idByUniversalIdentifier[action.flatEntity.universalIdentifier] - : undefined; - const objectFieldIdByUniversalIdentifier = isDefined( - fieldMetadataIdByUniversalIdentifier, - ) - ? buildFieldIdByUniversalIdentifierForObjectAction({ - action, - fieldMetadataIdByUniversalIdentifier, - }) - : undefined; + const id = + (isDefined(idByUniversalIdentifier) + ? idByUniversalIdentifier[action.flatEntity.universalIdentifier] + : undefined) ?? + action.id ?? + v4(); + const objectFieldIdByUniversalIdentifier = + buildFieldIdByUniversalIdentifierForObjectAction({ + action, + fieldMetadataIdByUniversalIdentifier: + fieldMetadataIdByUniversalIdentifier ?? {}, + }); return { ...action, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts index eb69b39ac1..46f93caac5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts @@ -21,6 +21,7 @@ import { AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspa import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; import { aggregateOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util'; import { computeOrderedMigrationActions } from 'src/engine/workspace-manager/workspace-migration/utils/compute-ordered-migration-actions.util'; +import { computeSearchVectorRebuildTargetUniversalIdentifiers } from 'src/engine/workspace-manager/workspace-migration/utils/compute-search-vector-rebuild-target-universal-identifiers.util'; import { crossEntityTransversalValidation } from 'src/engine/workspace-manager/workspace-migration/utils/cross-entity-transversal-validation.util'; import { mergeOrchestratorFailureReports } from 'src/engine/workspace-manager/workspace-migration/utils/merge-orchestrator-failure-reports.util'; import { WorkspaceMigrationAgentActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service'; @@ -390,11 +391,23 @@ export class WorkspaceMigrationBuildOrchestratorService { }; } + const searchVectorUniversalIdentifiersToRebuild = + computeSearchVectorRebuildTargetUniversalIdentifiers({ + orchestratorActionsReport, + fromFlatSearchFieldMetadataMaps: + fromToAllFlatEntityMaps.flatSearchFieldMetadataMaps?.from, + toFlatSearchFieldMetadataMaps: + optimisticAllFlatEntityMaps.flatSearchFieldMetadataMaps, + toFlatFieldMetadataMaps: + optimisticAllFlatEntityMaps.flatFieldMetadataMaps, + }); + const { aggregatedOrchestratorActionsReport } = aggregateOrchestratorActionsReport({ orchestratorActionsReport, flatFieldMetadataMaps: optimisticAllFlatEntityMaps.flatFieldMetadataMaps, + searchVectorUniversalIdentifiersToRebuild, }); return { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts index f01c039078..38a650c36d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts @@ -4,4 +4,5 @@ import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manag export type AggregateOrchestratorActionsReportArgs = { orchestratorActionsReport: OrchestratorActionsReport; flatFieldMetadataMaps?: MetadataUniversalFlatEntityMaps<'fieldMetadata'>; + searchVectorUniversalIdentifiersToRebuild?: Set; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap index 9afcfe8106..27a4580941 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap @@ -14,6 +14,7 @@ exports[`ALL_UNIVERSAL_FLAT_ENTITY_FOREIGN_KEY_AGGREGATOR_PROPERTIES should matc "kanbanAggregateOperationViewUniversalIdentifiers", "calendarViewUniversalIdentifiers", "mainGroupByFieldMetadataViewUniversalIdentifiers", + "searchFieldMetadataUniversalIdentifiers", ], "fieldPermission": [], "frontComponent": [], diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap index cf9ffe3584..c88d38c613 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/__tests__/__snapshots__/universal-flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap @@ -37,6 +37,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a crea "relationTargetFieldMetadataUniversalIdentifier": null, "relationTargetObjectMetadataId": null, "relationTargetObjectMetadataUniversalIdentifier": null, + "searchFieldMetadataIds": [], + "searchFieldMetadataUniversalIdentifiers": [], "settings": null, "standardOverrides": null, "type": "TEXT", @@ -102,6 +104,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele "relationTargetFieldMetadataUniversalIdentifier": null, "relationTargetObjectMetadataId": null, "relationTargetObjectMetadataUniversalIdentifier": null, + "searchFieldMetadataIds": [], + "searchFieldMetadataUniversalIdentifiers": [], "settings": null, "standardOverrides": null, "type": "TEXT", @@ -181,6 +185,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create "relationTargetFieldMetadataUniversalIdentifier": null, "relationTargetObjectMetadataId": null, "relationTargetObjectMetadataUniversalIdentifier": null, + "searchFieldMetadataIds": [], + "searchFieldMetadataUniversalIdentifiers": [], "settings": null, "standardOverrides": null, "type": "TEXT", @@ -232,6 +238,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create "relationTargetFieldMetadataUniversalIdentifier": null, "relationTargetObjectMetadataId": null, "relationTargetObjectMetadataUniversalIdentifier": null, + "searchFieldMetadataIds": [], + "searchFieldMetadataUniversalIdentifiers": [], "settings": null, "standardOverrides": null, "type": "TEXT", diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts index 0e822604b9..2b864ba942 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-and-related-entity-maps-through-mutation-or-throw.util.ts @@ -11,6 +11,7 @@ import { type MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modu import { type MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { type UniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-maps.type'; import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util'; @@ -22,6 +23,7 @@ type AddUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutat metadataName: T; universalFlatEntity: MetadataUniversalFlatEntity; universalFlatEntityAndRelatedMapsToMutate: MetadataUniversalFlatEntityAndRelatedUniversalFlatEntityMaps; + skipMissingRelatedEntities?: boolean; }; export const addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrow = @@ -29,6 +31,7 @@ export const addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThro metadataName, universalFlatEntity, universalFlatEntityAndRelatedMapsToMutate, + skipMissingRelatedEntities = false, }: AddUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThroughMutationOrThrowArgs) => { const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName); @@ -96,6 +99,18 @@ export const addUniversalFlatEntityToUniversalFlatEntityAndRelatedEntityMapsThro continue; } + if (skipMissingRelatedEntities) { + const maybeRelatedUniversalFlatEntity = + findFlatEntityByUniversalIdentifier({ + universalIdentifier: universalForeignKeyValue, + flatEntityMaps: relatedUniversalFlatEntityMaps, + }); + + if (!isDefined(maybeRelatedUniversalFlatEntity)) { + continue; + } + } + const relatedUniversalFlatEntity = findFlatEntityByUniversalIdentifierOrThrow({ universalIdentifier: universalForeignKeyValue, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts index 17c809330a..7f98e375f8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util.ts @@ -13,6 +13,10 @@ import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/fl import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +export type PreallocatedIdByUniversalIdentifierByMetadataName = Partial< + Record> +>; + type ManyToOneRelationsConfig = (typeof ALL_MANY_TO_ONE_METADATA_RELATIONS)[T]; @@ -74,6 +78,7 @@ export const resolveUniversalRelationIdentifiersToIds = < metadataName, universalForeignKeyValues, flatEntityMaps, + preallocatedIdByUniversalIdentifierByMetadataName, }: { metadataName: T; universalForeignKeyValues: Record; @@ -81,6 +86,7 @@ export const resolveUniversalRelationIdentifiersToIds = < T, TProvidedKeys >; + preallocatedIdByUniversalIdentifierByMetadataName?: PreallocatedIdByUniversalIdentifierByMetadataName; }): ResolvedForeignKeyIds => { const relationEntries = ALL_MANY_TO_ONE_METADATA_RELATIONS[metadataName]; const result: Record = {}; @@ -131,6 +137,18 @@ export const resolveUniversalRelationIdentifiersToIds = < continue; } + const preallocatedId = isDefined(universalIdentifierValue) + ? preallocatedIdByUniversalIdentifierByMetadataName?.[ + targetMetadataName + ]?.[universalIdentifierValue] + : undefined; + + if (isDefined(preallocatedId)) { + result[foreignKey] = preallocatedId; + + continue; + } + const targetEntity = findFlatEntityByUniversalIdentifier< MetadataFlatEntity >({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts index 147e2d61c4..864c16740a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts @@ -4,15 +4,22 @@ import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata- import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; import { type UniversalUpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; export const aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions = ({ orchestratorActionsReport, flatFieldMetadataMaps, + searchVectorUniversalIdentifiersToRebuild, }: AggregateOrchestratorActionsReportArgs): OrchestratorActionsReport => { assertIsDefinedOrThrow(flatFieldMetadataMaps); + const rebuildTargetUniversalIdentifiers = + searchVectorUniversalIdentifiersToRebuild ?? new Set(); + + const coveredVectorUniversalIdentifiers = new Set(); + const updateFieldActions = orchestratorActionsReport.fieldMetadata.update; const { searchVectorUpdateFieldActions, otherUpdateFieldActions } = @@ -30,11 +37,22 @@ export const aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFie flatFieldMetadata.name === SEARCH_VECTOR_FIELD.name; if (isSearchVectorUpdateFieldAction) { + coveredVectorUniversalIdentifiers.add( + updateFieldAction.universalIdentifier, + ); + + const searchVectorUpdateFieldAction = + rebuildTargetUniversalIdentifiers.has( + updateFieldAction.universalIdentifier, + ) + ? { ...updateFieldAction, rebuildSearchVector: true } + : updateFieldAction; + return { ...acc, searchVectorUpdateFieldActions: [ ...acc.searchVectorUpdateFieldActions, - updateFieldAction, + searchVectorUpdateFieldAction, ], }; } @@ -53,11 +71,31 @@ export const aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFie }, ); + const synthesizedSearchVectorUpdateFieldActions: UniversalUpdateFieldAction[] = + [...rebuildTargetUniversalIdentifiers].flatMap( + (vectorUniversalIdentifier) => + coveredVectorUniversalIdentifiers.has(vectorUniversalIdentifier) + ? [] + : [ + { + type: WORKSPACE_MIGRATION_ACTION_TYPE.update, + metadataName: 'fieldMetadata', + universalIdentifier: vectorUniversalIdentifier, + update: {}, + rebuildSearchVector: true, + }, + ], + ); + return { ...orchestratorActionsReport, fieldMetadata: { ...orchestratorActionsReport.fieldMetadata, - update: [...otherUpdateFieldActions, ...searchVectorUpdateFieldActions], + update: [ + ...otherUpdateFieldActions, + ...searchVectorUpdateFieldActions, + ...synthesizedSearchVectorUpdateFieldActions, + ], }, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts index ac09a621f1..bc06ce8c18 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts @@ -6,6 +6,7 @@ import { aggregateRelationFieldPairs } from 'src/engine/workspace-manager/worksp export const aggregateOrchestratorActionsReport = ({ orchestratorActionsReport, flatFieldMetadataMaps, + searchVectorUniversalIdentifiersToRebuild, }: AggregateOrchestratorActionsReportArgs) => { const aggregatedOrchestratorActionsReport = [ aggregateNonRelationFieldsIntoObjectActions, @@ -16,6 +17,7 @@ export const aggregateOrchestratorActionsReport = ({ aggregator({ orchestratorActionsReport: currentOrchestratorActionsReport, flatFieldMetadataMaps, + searchVectorUniversalIdentifiersToRebuild, }), orchestratorActionsReport, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-ordered-migration-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-ordered-migration-actions.util.ts index 6be0002d4e..4127949a6d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-ordered-migration-actions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-ordered-migration-actions.util.ts @@ -5,8 +5,12 @@ export const computeOrderedMigrationActions = ( aggregatedOrchestratorActionsReport: OrchestratorActionsReport, ): AllUniversalWorkspaceMigrationAction[] => { return [ - // Object and fields and indexes ...aggregatedOrchestratorActionsReport.searchFieldMetadata.delete, + ...aggregatedOrchestratorActionsReport.searchFieldMetadata.create, + ...aggregatedOrchestratorActionsReport.searchFieldMetadata.update, + /// + + // Object and fields and indexes ...aggregatedOrchestratorActionsReport.index.delete, ...aggregatedOrchestratorActionsReport.fieldMetadata.delete, ...aggregatedOrchestratorActionsReport.objectMetadata.delete, @@ -16,8 +20,6 @@ export const computeOrderedMigrationActions = ( ...aggregatedOrchestratorActionsReport.fieldMetadata.update, ...aggregatedOrchestratorActionsReport.index.create, ...aggregatedOrchestratorActionsReport.index.update.flat(), - ...aggregatedOrchestratorActionsReport.searchFieldMetadata.create, - ...aggregatedOrchestratorActionsReport.searchFieldMetadata.update, /// // Views diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-search-vector-rebuild-target-universal-identifiers.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-search-vector-rebuild-target-universal-identifiers.util.ts new file mode 100644 index 0000000000..c102e461d6 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/compute-search-vector-rebuild-target-universal-identifiers.util.ts @@ -0,0 +1,91 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; +import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type'; + +export const computeSearchVectorRebuildTargetUniversalIdentifiers = ({ + orchestratorActionsReport, + fromFlatSearchFieldMetadataMaps, + toFlatSearchFieldMetadataMaps, + toFlatFieldMetadataMaps, +}: { + orchestratorActionsReport: OrchestratorActionsReport; + fromFlatSearchFieldMetadataMaps?: MetadataUniversalFlatEntityMaps<'searchFieldMetadata'>; + toFlatSearchFieldMetadataMaps: MetadataUniversalFlatEntityMaps<'searchFieldMetadata'>; + toFlatFieldMetadataMaps: MetadataUniversalFlatEntityMaps<'fieldMetadata'>; +}): Set => { + const searchFieldMetadataActions = + orchestratorActionsReport.searchFieldMetadata; + + const emptyFlatSearchFieldMetadataMaps: MetadataUniversalFlatEntityMaps<'searchFieldMetadata'> = + { byUniversalIdentifier: {} }; + + const renamedFieldSearchFieldMetadataUniversalIdentifiers = + orchestratorActionsReport.fieldMetadata.update + .filter((updateAction) => isDefined(updateAction.update.name)) + .flatMap( + (updateAction) => + findFlatEntityByUniversalIdentifier({ + flatEntityMaps: toFlatFieldMetadataMaps, + universalIdentifier: updateAction.universalIdentifier, + })?.searchFieldMetadataUniversalIdentifiers ?? [], + ); + + const candidateFieldMetadataVectorUniversalIdentifiers = new Set( + [ + ...searchFieldMetadataActions.create.map( + (createAction) => + createAction.flatEntity.tsVectorFieldMetadataUniversalIdentifier, + ), + ...searchFieldMetadataActions.update.map( + (updateAction) => + findFlatEntityByUniversalIdentifier({ + flatEntityMaps: toFlatSearchFieldMetadataMaps, + universalIdentifier: updateAction.universalIdentifier, + })?.tsVectorFieldMetadataUniversalIdentifier, + ), + ...searchFieldMetadataActions.delete.map( + (deleteAction) => + findFlatEntityByUniversalIdentifier({ + flatEntityMaps: + fromFlatSearchFieldMetadataMaps ?? + emptyFlatSearchFieldMetadataMaps, + universalIdentifier: deleteAction.universalIdentifier, + })?.tsVectorFieldMetadataUniversalIdentifier, + ), + ...renamedFieldSearchFieldMetadataUniversalIdentifiers.map( + (searchFieldMetadataUniversalIdentifier) => + findFlatEntityByUniversalIdentifier({ + flatEntityMaps: toFlatSearchFieldMetadataMaps, + universalIdentifier: searchFieldMetadataUniversalIdentifier, + })?.tsVectorFieldMetadataUniversalIdentifier, + ), + ].filter(isDefined), + ); + + const fieldUniversalIdentifiersBeingCreatedOrDeleted = new Set([ + ...orchestratorActionsReport.fieldMetadata.create.map( + (createFieldAction) => createFieldAction.flatEntity.universalIdentifier, + ), + ...orchestratorActionsReport.objectMetadata.create.flatMap( + (createObjectAction) => + createObjectAction.universalFlatFieldMetadatas.map( + (universalFlatFieldMetadata) => + universalFlatFieldMetadata.universalIdentifier, + ), + ), + ...orchestratorActionsReport.fieldMetadata.delete.map( + (deleteFieldAction) => deleteFieldAction.universalIdentifier, + ), + ]); + + return new Set( + [...candidateFieldMetadataVectorUniversalIdentifiers].filter( + (vectorUniversalIdentifier) => + !fieldUniversalIdentifiersBeingCreatedOrDeleted.has( + vectorUniversalIdentifier, + ), + ), + ); +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts index 2f50626a66..df1e5d008e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts @@ -23,7 +23,9 @@ export type UniversalCreateFieldAction = }; export type UniversalUpdateFieldAction = - BaseUniversalUpdateWorkspaceMigrationAction<'fieldMetadata'>; + BaseUniversalUpdateWorkspaceMigrationAction<'fieldMetadata'> & { + rebuildSearchVector?: boolean; + }; export type UniversalDeleteFieldAction = BaseUniversalDeleteWorkspaceMigrationAction<'fieldMetadata'>; @@ -35,7 +37,9 @@ export type FlatCreateFieldAction = }; export type FlatUpdateFieldAction = - BaseFlatUpdateWorkspaceMigrationAction<'fieldMetadata'>; + BaseFlatUpdateWorkspaceMigrationAction<'fieldMetadata'> & { + rebuildSearchVector?: boolean; + }; export type FlatDeleteFieldAction = BaseFlatDeleteWorkspaceMigrationAction<'fieldMetadata'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-search-field-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-search-field-metadata-validator.service.ts index 0dd8d06a68..f3569a277a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-search-field-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-search-field-metadata-validator.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; +import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; @@ -70,6 +71,39 @@ export class FlatSearchFieldMetadataValidatorService { }); } + const flatTsVectorFieldMetadata = findFlatEntityByUniversalIdentifier({ + universalIdentifier: + flatSearchFieldMetadataToValidate.tsVectorFieldMetadataUniversalIdentifier, + flatEntityMaps: flatFieldMetadataMaps, + }); + + if (!isDefined(flatTsVectorFieldMetadata)) { + validationResult.errors.push({ + code: SearchFieldMetadataExceptionCode.TS_VECTOR_FIELD_METADATA_NOT_FOUND, + message: t`TS_VECTOR field metadata not found`, + userFriendlyMessage: msg`Search vector field not found`, + }); + } else { + if (flatTsVectorFieldMetadata.type !== FieldMetadataType.TS_VECTOR) { + validationResult.errors.push({ + code: SearchFieldMetadataExceptionCode.INVALID_TS_VECTOR_FIELD_METADATA, + message: t`TS_VECTOR field metadata must be of type TS_VECTOR`, + userFriendlyMessage: msg`Search vector field must be a search vector`, + }); + } + + if ( + flatTsVectorFieldMetadata.objectMetadataUniversalIdentifier !== + flatSearchFieldMetadataToValidate.objectMetadataUniversalIdentifier + ) { + validationResult.errors.push({ + code: SearchFieldMetadataExceptionCode.INVALID_TS_VECTOR_FIELD_METADATA, + message: t`TS_VECTOR field metadata must belong to the same object`, + userFriendlyMessage: msg`Search vector field must belong to the same object`, + }); + } + } + const flatObjectMetadata = findFlatEntityByUniversalIdentifier({ universalIdentifier: flatSearchFieldMetadataToValidate.objectMetadataUniversalIdentifier, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts index 2eb490bf9c..fd42d0f5fc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts @@ -15,12 +15,14 @@ import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/ import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findManyFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { deriveSearchVectorAsExpressionForTsVectorField } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; @@ -124,6 +126,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct metadataName: 'fieldMetadata', entityId: flatFieldMetadata.id, update, + rebuildSearchVector: action.rebuildSearchVector, }; } @@ -161,7 +164,11 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct const { flatAction, queryRunner, - allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, + allFlatEntityMaps: { + flatObjectMetadataMaps, + flatFieldMetadataMaps, + flatSearchFieldMetadataMaps, + }, workspaceId, } = context; const { entityId, update } = flatAction; @@ -239,49 +246,6 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct } if (isDefined(update.settings)) { - // Handle asExpression/generatedType change (for TS_VECTOR fields) - if ( - isFlatFieldMetadataOfType( - optimisticFlatFieldMetadata, - FieldMetadataType.TS_VECTOR, - ) - ) { - const fromSettings = - optimisticFlatFieldMetadata.settings as FieldMetadataSettingsMapping['TS_VECTOR']; - const toSettings = - update.settings as FieldMetadataSettingsMapping['TS_VECTOR']; - - if ( - isDefined(toSettings?.asExpression) && - (toSettings.asExpression !== fromSettings?.asExpression || - toSettings.generatedType !== fromSettings?.generatedType) - ) { - await this.workspaceSchemaManagerService.columnManager.dropColumns({ - queryRunner, - schemaName, - tableName, - columnNames: [optimisticFlatFieldMetadata.name], - }); - await this.workspaceSchemaManagerService.columnManager.addColumns({ - queryRunner, - schemaName, - tableName, - columnDefinitions: [ - { - name: optimisticFlatFieldMetadata.name, - type: 'tsvector', - ...toSettings, - }, - ], - }); - - optimisticFlatFieldMetadata = { - ...optimisticFlatFieldMetadata, - settings: toSettings, - }; - } - } - // Handle onDelete change (for morph/relation fields) order matters if (isMorphOrRelationFlatFieldMetadata(optimisticFlatFieldMetadata)) { const fromSettings = optimisticFlatFieldMetadata.settings; @@ -357,6 +321,54 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct } } } + + if ( + flatAction.rebuildSearchVector === true && + isFlatFieldMetadataOfType( + optimisticFlatFieldMetadata, + FieldMetadataType.TS_VECTOR, + ) + ) { + const indexedFieldById = new Map( + findManyFlatEntityByIdInFlatEntityMaps({ + flatEntityMaps: flatFieldMetadataMaps, + flatEntityIds: flatObjectMetadata.fieldIds, + }).map((indexedFlatFieldMetadata) => [ + indexedFlatFieldMetadata.id, + { + name: indexedFlatFieldMetadata.name, + type: indexedFlatFieldMetadata.type, + }, + ]), + ); + + const searchVectorAsExpression = + deriveSearchVectorAsExpressionForTsVectorField({ + tsVectorFieldMetadataId: optimisticFlatFieldMetadata.id, + flatSearchFieldMetadataMaps, + indexedFieldById, + }); + + const columnDefinitions = generateColumnDefinitions({ + flatFieldMetadata: optimisticFlatFieldMetadata, + flatObjectMetadata, + workspaceId, + searchVectorAsExpression, + }); + + await this.workspaceSchemaManagerService.columnManager.dropColumns({ + queryRunner, + schemaName, + tableName, + columnNames: [optimisticFlatFieldMetadata.name], + }); + await this.workspaceSchemaManagerService.columnManager.addColumns({ + queryRunner, + schemaName, + tableName, + columnDefinitions, + }); + } } private async handleFieldNameUpdate({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts index f769258bb8..7f8b8b884c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts @@ -135,6 +135,7 @@ export const fromUniversalFlatFieldMetadataToFlatFieldMetadata = ({ mainGroupByFieldMetadataViewIds: [], kanbanAggregateOperationViewIds: [], viewSortIds: [], + searchFieldMetadataIds: [], ...emptyUniversalForeignKeyAggregators, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts index e547632a80..7531193b76 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; +import { FieldMetadataType } from 'twenty-shared/types'; import { v4 } from 'uuid'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; @@ -7,6 +8,8 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { ALL_METADATA_ENTITY_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-entity-by-metadata-name.constant'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { deriveSearchVectorAsExpressionForTsVectorField } from 'src/engine/metadata-modules/flat-search-field-metadata/utils/derive-search-vector-as-expression-for-ts-vector-field.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { FlatCreateObjectAction, @@ -117,7 +120,7 @@ export class CreateObjectActionHandlerService extends WorkspaceMigrationRunnerAc async executeForWorkspaceSchema( context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { flatAction, queryRunner, workspaceId } = context; + const { flatAction, queryRunner, workspaceId, allFlatEntityMaps } = context; const { flatEntity: flatObjectMetadata, flatFieldMetadatas } = flatAction; const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ @@ -125,11 +128,29 @@ export class CreateObjectActionHandlerService extends WorkspaceMigrationRunnerAc objectMetadata: flatObjectMetadata, }); + const indexedFieldById = new Map( + flatFieldMetadatas.map((flatFieldMetadata) => [ + flatFieldMetadata.id, + { name: flatFieldMetadata.name, type: flatFieldMetadata.type }, + ]), + ); + const columnDefinitions = flatFieldMetadatas.flatMap((flatFieldMetadata) => generateColumnDefinitions({ flatFieldMetadata, flatObjectMetadata, workspaceId, + searchVectorAsExpression: isFlatFieldMetadataOfType( + flatFieldMetadata, + FieldMetadataType.TS_VECTOR, + ) + ? deriveSearchVectorAsExpressionForTsVectorField({ + tsVectorFieldMetadataId: flatFieldMetadata.id, + flatSearchFieldMetadataMaps: + allFlatEntityMaps.flatSearchFieldMetadataMaps, + indexedFieldById, + }) + : undefined, }), ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/search-field-metadata/services/create-search-field-metadata-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/search-field-metadata/services/create-search-field-metadata-action-handler.service.ts index 01946b39ab..094b813f00 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/search-field-metadata/services/create-search-field-metadata-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/search-field-metadata/services/create-search-field-metadata-action-handler.service.ts @@ -4,11 +4,11 @@ import { v4 } from 'uuid'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; import { FlatCreateSearchFieldMetadataAction, UniversalCreateSearchFieldMetadataAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/search-field-metadata/types/workspace-migration-search-field-metadata-action.type'; -import { resolveUniversalRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; import { WorkspaceMigrationActionRunnerArgs, WorkspaceMigrationActionRunnerContext, @@ -24,12 +24,14 @@ export class CreateSearchFieldMetadataActionHandlerService extends WorkspaceMigr allFlatEntityMaps, flatApplication, workspaceId, + preallocatedIdByUniversalIdentifierByMetadataName, }: WorkspaceMigrationActionRunnerArgs): Promise { - const { objectMetadataId, fieldMetadataId } = + const { objectMetadataId, fieldMetadataId, tsVectorFieldMetadataId } = resolveUniversalRelationIdentifiersToIds({ flatEntityMaps: allFlatEntityMaps, metadataName: action.metadataName, universalForeignKeyValues: action.flatEntity, + preallocatedIdByUniversalIdentifierByMetadataName, }); return { @@ -38,6 +40,7 @@ export class CreateSearchFieldMetadataActionHandlerService extends WorkspaceMigr ...action.flatEntity, objectMetadataId, fieldMetadataId, + tsVectorFieldMetadataId, id: action.id ?? v4(), applicationId: flatApplication.id, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts index a36516dba1..ba59817138 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts @@ -23,6 +23,7 @@ import { WorkspaceMigrationRunnerExceptionCode, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception'; import { WorkspaceMigrationRunnerActionHandlerRegistryService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/registry/workspace-migration-runner-action-handler-registry.service'; +import { buildPreallocatedIdByUniversalIdentifierFromActions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/build-preallocated-id-by-universal-identifier-from-actions.util'; import { type AfterCommitSideEffect } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/after-commit-side-effect.type'; import { type MetadataEvent } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; @@ -281,6 +282,9 @@ export class WorkspaceMigrationRunnerService { }); } + const preallocatedIdByUniversalIdentifierByMetadataName = + buildPreallocatedIdByUniversalIdentifierFromActions(actions); + this.logger.perfTime('Runner', 'Transaction execution'); await queryRunner.connect(); @@ -313,6 +317,7 @@ export class WorkspaceMigrationRunnerService { allFlatEntityMaps, queryRunner, workspaceId, + preallocatedIdByUniversalIdentifierByMetadataName, }, }, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts index 930fcd18f4..80c12593d8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts @@ -2,6 +2,7 @@ import { type QueryRunner } from 'typeorm'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type PreallocatedIdByUniversalIdentifierByMetadataName } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; import { type AllFlatWorkspaceMigrationAction, type AllUniversalWorkspaceMigrationAction, @@ -15,6 +16,7 @@ export type WorkspaceMigrationActionRunnerArgs< allFlatEntityMaps: AllFlatEntityMaps; workspaceId: string; flatApplication: FlatApplication; + preallocatedIdByUniversalIdentifierByMetadataName?: PreallocatedIdByUniversalIdentifierByMetadataName; }; export type WorkspaceMigrationActionRunnerContext< diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/build-preallocated-id-by-universal-identifier-from-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/build-preallocated-id-by-universal-identifier-from-actions.util.ts new file mode 100644 index 0000000000..63ffd8c9bb --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/build-preallocated-id-by-universal-identifier-from-actions.util.ts @@ -0,0 +1,57 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { type PreallocatedIdByUniversalIdentifierByMetadataName } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-relation-identifiers-to-ids.util'; +import { type AllUniversalWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; + +export const buildPreallocatedIdByUniversalIdentifierFromActions = ( + actions: AllUniversalWorkspaceMigrationAction[], +): PreallocatedIdByUniversalIdentifierByMetadataName => { + const objectMetadata: Record = {}; + const fieldMetadata: Record = {}; + + for (const action of actions) { + if (action.type !== 'create') { + continue; + } + + if (action.metadataName === 'objectMetadata') { + if (isDefined(action.id)) { + objectMetadata[action.flatEntity.universalIdentifier] = action.id; + } + + const fieldIdByUniversalIdentifier = + action.fieldIdByUniversalIdentifier ?? {}; + + for (const universalFlatFieldMetadata of action.universalFlatFieldMetadatas) { + const fieldId = + fieldIdByUniversalIdentifier[ + universalFlatFieldMetadata.universalIdentifier + ]; + + if (isDefined(fieldId)) { + fieldMetadata[universalFlatFieldMetadata.universalIdentifier] = + fieldId; + } + } + + continue; + } + + if (action.metadataName === 'fieldMetadata') { + if (isDefined(action.id)) { + fieldMetadata[action.flatEntity.universalIdentifier] = action.id; + } + + if ( + isDefined(action.relatedUniversalFlatFieldMetadata) && + isDefined(action.relatedFieldId) + ) { + fieldMetadata[ + action.relatedUniversalFlatFieldMetadata.universalIdentifier + ] = action.relatedFieldId; + } + } + } + + return { objectMetadata, fieldMetadata }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts index 0e7d38da23..22b35841d5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts @@ -99,6 +99,7 @@ export const generateCompositeColumnDefinition = ({ const generateTsVectorColumnDefinition = ( flatFieldMetadata: FlatFieldMetadata, + searchVectorAsExpression?: string, ): WorkspaceSchemaColumnDefinition => { const columnName = computeColumnName(flatFieldMetadata.name); @@ -108,8 +109,8 @@ const generateTsVectorColumnDefinition = ( isNullable: true, isArray: false, default: null, - asExpression: flatFieldMetadata.settings?.asExpression ?? undefined, - generatedType: flatFieldMetadata.settings?.generatedType ?? undefined, + asExpression: searchVectorAsExpression ?? undefined, + generatedType: 'STORED', isPrimary: false, }; }; @@ -177,10 +178,12 @@ export const generateColumnDefinitions = ({ flatFieldMetadata, flatObjectMetadata, workspaceId, + searchVectorAsExpression, }: { flatFieldMetadata: FlatFieldMetadata; flatObjectMetadata: FlatObjectMetadata; workspaceId: string; + searchVectorAsExpression?: string; }): WorkspaceSchemaColumnDefinition[] => { const { tableName, schemaName } = getWorkspaceSchemaContextForMigration({ workspaceId, @@ -203,7 +206,12 @@ export const generateColumnDefinitions = ({ if ( isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.TS_VECTOR) ) { - return [generateTsVectorColumnDefinition(flatFieldMetadata)]; + return [ + generateTsVectorColumnDefinition( + flatFieldMetadata, + searchVectorAsExpression, + ), + ]; } if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts index 77d0ef6847..607085baa4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts @@ -47,6 +47,18 @@ export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = ({ return allFlatEntityMaps; } + case 'searchFieldMetadata': { + addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ + flatEntity: flatAction.flatEntity, + flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, + metadataName: flatAction.metadataName, + // searchFieldMetadata is created before its parent object/fields, which + // therefore aren't in the maps yet to back-link to. + skipMissingRelatedEntities: true, + }); + + return allFlatEntityMaps; + } case 'view': case 'viewField': case 'viewGroup': @@ -74,8 +86,7 @@ export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = ({ case 'fieldPermission': case 'webhook': case 'applicationVariable': - case 'connectionProvider': - case 'searchFieldMetadata': { + case 'connectionProvider': { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ flatEntity: flatAction.flatEntity, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, diff --git a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts index a91f083057..59f6859bfe 100644 --- a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts +++ b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts @@ -28,6 +28,7 @@ export const getMockFieldMetadataEntity = < viewFields: [], kanbanAggregateOperationViews: [], viewSorts: [], + searchFieldMetadatas: [], morphId: null, fieldPermissions: [], icon: null, diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap index 76ba10724c..04c7117dbc 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Sync application should fail due to object system fields integrity should fail when trying to delete a system field after a successful sync 1`] = ` { @@ -79,34 +79,9 @@ exports[`Sync application should fail due to object system fields integrity when "extensions": { "code": "METADATA_VALIDATION_FAILED", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Field type TS_VECTOR must have an expression. This may have failed to be built because record identifier field does not exist or is not of a searchable type.", - "userFriendlyMessage": "Field type TS_VECTOR must have an expression. This may have failed to be built because record identifier field does not exist or is not of a searchable type.", - }, - ], - "flatEntityMinimalInformation": { - "name": "searchVector", - "objectMetadataUniversalIdentifier": Any, - "universalIdentifier": Any, - }, - "metadataName": "fieldMetadata", - "status": "fail", - "type": "create", - }, - ], "objectMetadata": [ { "errors": [ - { - "code": "MISSING_SYSTEM_FIELD", - "message": "System field searchVector is missing", - "userFriendlyMessage": "System field searchVector is missing", - "value": "searchVector", - }, { "code": "INVALID_OBJECT_INPUT", "message": "labelIdentifierFieldMetadataUniversalIdentifier validation failed: field type not compatible", @@ -123,13 +98,12 @@ exports[`Sync application should fail due to object system fields integrity when }, ], }, - "message": "Validation failed for 1 fieldMetadata, 1 objectMetadata", + "message": "Validation failed for 1 objectMetadata", "summary": { - "fieldMetadata": 1, "objectMetadata": 1, - "totalErrors": 2, + "totalErrors": 1, }, - "userFriendlyMessage": "Many validation errors", + "userFriendlyMessage": "Field cannot be used as label identifier due to its type: should be of type UUID, text or full name", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/successful-sync-application-workspace-migration.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/successful-sync-application-workspace-migration.integration-spec.ts.snap index 1e02effefa..f872e20662 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/successful-sync-application-workspace-migration.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/successful-sync-application-workspace-migration.integration-spec.ts.snap @@ -69,6 +69,7 @@ exports[`syncApplication should delete old field and create equivalent one when "syncApplication": { "actions": [ { + "fieldIdByUniversalIdentifier": Any, "flatEntity": { "applicationUniversalIdentifier": Any, "color": null, @@ -96,6 +97,7 @@ exports[`syncApplication should delete old field and create equivalent one when "universalIdentifier": Any, "updatedAt": Any, }, + "id": Any, "metadataName": "objectMetadata", "type": "create", "universalFlatFieldMetadatas": [ @@ -314,10 +316,7 @@ exports[`syncApplication should delete old field and create equivalent one when "standardOverrides": null, "type": "TS_VECTOR", "universalIdentifier": Any, - "universalSettings": { - "asExpression": "to_tsvector('simple', COALESCE("id"::text, ''))", - "generatedType": "STORED", - }, + "universalSettings": null, "updatedAt": Any, }, { @@ -415,6 +414,8 @@ exports[`syncApplication should delete old field and create equivalent one when "relationTargetFieldMetadataUniversalIdentifier": null, "relationTargetObjectMetadataId": null, "relationTargetObjectMetadataUniversalIdentifier": null, + "searchFieldMetadataIds": [], + "searchFieldMetadataUniversalIdentifiers": [], "settings": null, "standardOverrides": null, "type": "TEXT", @@ -475,6 +476,7 @@ exports[`syncApplication should return workspace migration actions on initial sy "syncApplication": { "actions": [ { + "fieldIdByUniversalIdentifier": Any, "flatEntity": { "applicationUniversalIdentifier": Any, "color": null, @@ -502,6 +504,7 @@ exports[`syncApplication should return workspace migration actions on initial sy "universalIdentifier": Any, "updatedAt": Any, }, + "id": Any, "metadataName": "objectMetadata", "type": "create", "universalFlatFieldMetadatas": [ @@ -720,10 +723,7 @@ exports[`syncApplication should return workspace migration actions on initial sy "standardOverrides": null, "type": "TS_VECTOR", "universalIdentifier": Any, - "universalSettings": { - "asExpression": "to_tsvector('simple', COALESCE("id"::text, ''))", - "generatedType": "STORED", - }, + "universalSettings": null, "updatedAt": Any, }, { diff --git a/packages/twenty-server/test/integration/metadata/suites/application/failing-sync-application-search-vector-expression-validation.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/application/failing-sync-application-search-vector-expression-validation.integration-spec.ts deleted file mode 100644 index 0bcaca96d6..0000000000 --- a/packages/twenty-server/test/integration/metadata/suites/application/failing-sync-application-search-vector-expression-validation.integration-spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { buildBaseManifest } from 'test/integration/metadata/suites/application/utils/build-base-manifest.util'; -import { buildDefaultObjectManifest } from 'test/integration/metadata/suites/application/utils/build-default-object-manifest.util'; -import { cleanupApplicationAndAppRegistration } from 'test/integration/metadata/suites/application/utils/cleanup-application-and-app-registration.util'; -import { setupApplicationForSync } from 'test/integration/metadata/suites/application/utils/setup-application-for-sync.util'; -import { syncApplication } from 'test/integration/metadata/suites/application/utils/sync-application.util'; -import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; -import { type Manifest, type ObjectManifest } from 'twenty-shared/application'; -import { v4 as uuidv4 } from 'uuid'; - -const TEST_APP_ID = uuidv4(); -const TEST_ROLE_ID = uuidv4(); - -describe('Sync application - search vector expression is validated', () => { - const RUN_SUFFIX = `${Date.now()}`; - - beforeAll(async () => { - await setupApplicationForSync({ - applicationUniversalIdentifier: TEST_APP_ID, - name: 'Test SearchVector Expression App', - description: 'App for testing search vector expression validation', - sourcePath: 'test-search-vector-expression', - }); - }, 60000); - - afterAll(async () => { - await cleanupApplicationAndAppRegistration({ - applicationUniversalIdentifier: TEST_APP_ID, - }); - }); - - it('rejects a manifest carrying a malformed searchVector expression', async () => { - const defaultObject = buildDefaultObjectManifest({ - nameSingular: `searchVectorManifestObject${RUN_SUFFIX}`, - namePlural: `searchVectorManifestObjects${RUN_SUFFIX}`, - labelSingular: 'Search Vector Manifest Object', - labelPlural: 'Search Vector Manifest Objects', - description: - 'Object whose manifest carries a malformed searchVector expression', - }); - - const invalidAsExpression = `to_tsvector('simple', coalesce("id"::text, '')`; - - const objectWithInvalidSearchVector: ObjectManifest = { - ...defaultObject, - fields: defaultObject.fields.map((field) => - field.name === 'searchVector' - ? ({ - ...field, - universalSettings: { - asExpression: invalidAsExpression, - generatedType: 'STORED', - }, - } as (typeof defaultObject.fields)[number]) - : field, - ), - }; - - const manifest: Manifest = buildBaseManifest({ - appId: TEST_APP_ID, - roleId: TEST_ROLE_ID, - overrides: { - objects: [objectWithInvalidSearchVector], - fields: [], - }, - }); - - const { errors } = await syncApplication({ - manifest, - expectToFail: true, - }); - - jestExpectToBeDefined(errors); - }, 60000); -}); diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/create-and-delete-field-metadata-search-vector-side-effect.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/create-and-delete-field-metadata-search-vector-side-effect.integration-spec.ts index 65bf5ef30d..633b39578d 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/create-and-delete-field-metadata-search-vector-side-effect.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/create-and-delete-field-metadata-search-vector-side-effect.integration-spec.ts @@ -5,13 +5,9 @@ import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-m import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util'; import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; -import { findManyObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; -import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType } from 'twenty-shared/types'; -import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; - // ISO search surface: a custom object's searchVector indexes the name field only. Creating or // deleting an additional searchable field must NOT change the search surface through the API. describe('Field metadata create/delete - search vector ISO surface', () => { @@ -24,46 +20,6 @@ describe('Field metadata create/delete - search vector ISO surface', () => { const RECORD_NAME_VALUE = 'SearchSurfaceNameToken11'; const RECORD_EXTRA_VALUE = 'SearchSurfaceExtraToken22'; - const getSearchVectorAsExpression = async (): Promise => { - const { objects } = await findManyObjectMetadata({ - expectToFail: false, - input: { - filter: { id: { eq: testObjectMetadataId } }, - paging: { first: 1 }, - }, - gqlFields: ` - id - nameSingular - fieldsList { - id - name - type - settings - } - `, - }); - - const testObject = objects[0]; - - jestExpectToBeDefined(testObject); - jestExpectToBeDefined(testObject.fieldsList); - - const searchVectorField = testObject.fieldsList.find( - (field: FieldMetadataDTO) => field.type === FieldMetadataType.TS_VECTOR, - ); - - jestExpectToBeDefined(searchVectorField); - - const settings = searchVectorField.settings as { - asExpression?: string; - }; - - jestExpectToBeDefined(settings); - jestExpectToBeDefined(settings.asExpression); - - return settings.asExpression; - }; - beforeAll(async () => { const { data: { @@ -117,10 +73,6 @@ describe('Field metadata create/delete - search vector ISO surface', () => { extraFieldMetadataId = extraFieldId; - const asExpressionAfterCreate = await getSearchVectorAsExpression(); - - expect(asExpressionAfterCreate).not.toContain(EXTRA_FIELD_NAME); - await createManyOperation({ objectMetadataSingularName: OBJECT_NAME_SINGULAR, objectMetadataPluralName: OBJECT_NAME_PLURAL, @@ -155,7 +107,7 @@ describe('Field metadata create/delete - search vector ISO surface', () => { expect(searchByExtraField.data.search.edges.length).toBe(0); }); - it('should keep the search vector unchanged after the extra field is deleted', async () => { + it('should keep the search surface unchanged after the extra field is deleted', async () => { // Custom fields must be deactivated before deletion. await updateOneFieldMetadata({ input: { @@ -171,8 +123,13 @@ describe('Field metadata create/delete - search vector ISO surface', () => { expectToFail: false, }); - const asExpressionAfterDelete = await getSearchVectorAsExpression(); + const searchByName = await search({ + searchInput: RECORD_NAME_VALUE, + includedObjectNameSingulars: [OBJECT_NAME_SINGULAR], + limit: 10, + expectToFail: false, + }); - expect(asExpressionAfterDelete).not.toContain(EXTRA_FIELD_NAME); + expect(searchByName.data.search.edges.length).toBe(1); }); }); diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-expression-validation.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-expression-validation.integration-spec.ts deleted file mode 100644 index 0b6fa44d08..0000000000 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-expression-validation.integration-spec.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; -import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util'; -import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; -import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; -import { findManyObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata.util'; -import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; -import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; - -describe('Field metadata update - search vector expression is validated', () => { - let testObjectMetadataId: string; - let labelIdentifierFieldMetadataId: string; - let searchVectorFieldMetadataId: string; - let originalAsExpression: string; - - const RUN_SUFFIX = `${Date.now()}`; - const OBJECT_NAME_SINGULAR = `searchVectorObject${RUN_SUFFIX}`; - const OBJECT_NAME_PLURAL = `searchVectorObjects${RUN_SUFFIX}`; - const LABEL_FIELD_NAME = `searchVectorTitle${RUN_SUFFIX}`; - - const getSearchVectorField = async () => { - const { objects } = await findManyObjectMetadata({ - expectToFail: false, - input: { - filter: { id: { eq: testObjectMetadataId } }, - paging: { first: 1 }, - }, - gqlFields: ` - id - nameSingular - fieldsList { - id - name - type - settings - } - `, - }); - - const testObject = objects[0]; - - jestExpectToBeDefined(testObject); - jestExpectToBeDefined(testObject.fieldsList); - - const searchVectorField = testObject.fieldsList.find( - (field: FieldMetadataDTO) => field.type === FieldMetadataType.TS_VECTOR, - ); - - jestExpectToBeDefined(searchVectorField); - - return searchVectorField as FieldMetadataDTO; - }; - - beforeAll(async () => { - const { - data: { - createOneObject: { id: objectMetadataId }, - }, - } = await createOneObjectMetadata({ - expectToFail: false, - input: { - nameSingular: OBJECT_NAME_SINGULAR, - namePlural: OBJECT_NAME_PLURAL, - labelSingular: 'Search Vector Object', - labelPlural: 'Search Vector Objects', - icon: 'IconSearch', - isLabelSyncedWithName: false, - }, - }); - - testObjectMetadataId = objectMetadataId; - - const { - data: { - createOneField: { id: fieldMetadataId }, - }, - } = await createOneFieldMetadata({ - expectToFail: false, - input: { - name: LABEL_FIELD_NAME, - label: 'Search Vector Title', - type: FieldMetadataType.TEXT, - objectMetadataId: testObjectMetadataId, - isLabelSyncedWithName: false, - }, - gqlFields: `id name label`, - }); - - labelIdentifierFieldMetadataId = fieldMetadataId; - - await updateOneObjectMetadata({ - input: { - idToUpdate: testObjectMetadataId, - updatePayload: { - labelIdentifierFieldMetadataId, - }, - }, - expectToFail: false, - }); - - const searchVectorField = await getSearchVectorField(); - - searchVectorFieldMetadataId = searchVectorField.id; - originalAsExpression = searchVectorField.settings?.asExpression ?? ''; - }); - - afterAll(async () => { - await updateOneObjectMetadata({ - expectToFail: false, - input: { - idToUpdate: testObjectMetadataId, - updatePayload: { isActive: false }, - }, - }); - await deleteOneObjectMetadata({ - expectToFail: false, - input: { idToDelete: testObjectMetadataId }, - }); - }); - - it('rejects a malformed searchVector expression and leaves the stored expression unchanged', async () => { - const invalidAsExpression = `to_tsvector('simple', coalesce("${LABEL_FIELD_NAME}", '')`; - - const { errors } = await updateOneFieldMetadata({ - input: { - idToUpdate: searchVectorFieldMetadataId, - updatePayload: { - settings: { - asExpression: invalidAsExpression, - generatedType: 'STORED', - }, - }, - }, - gqlFields: `id name settings`, - expectToFail: true, - }); - - jestExpectToBeDefined(errors); - - const searchVectorFieldAfter = await getSearchVectorField(); - - expect(searchVectorFieldAfter.settings?.asExpression).toBe( - originalAsExpression, - ); - }); -}); diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-side-effect.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-side-effect.integration-spec.ts index cc54c365d5..a0f63f5c64 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-side-effect.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata-search-vector-side-effect.integration-spec.ts @@ -6,14 +6,13 @@ import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object import { findManyObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; -import { FieldMetadataType } from 'twenty-shared/types'; import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; // ISO search surface: renaming an indexed field (the name field, the default search field of a -// custom object) must recompute the searchVector asExpression so global search keeps working, -// since the expression embeds the field's column name. -describe('Field metadata update - search vector rename recompute', () => { +// custom object) must rebuild the searchVector column so global search keeps working, +// since the generated expression embeds the field's column name. +describe('Field metadata update - search vector rename rebuild', () => { let testObjectMetadataId: string; let nameFieldMetadataId: string; let createdRecordId: string; @@ -23,46 +22,6 @@ describe('Field metadata update - search vector rename recompute', () => { const RENAMED_NAME_FIELD = 'searchableLabelColumn'; const RECORD_NAME_VALUE = 'RenameRecomputeSearchToken33'; - const getSearchVectorAsExpression = async (): Promise => { - const { objects } = await findManyObjectMetadata({ - expectToFail: false, - input: { - filter: { id: { eq: testObjectMetadataId } }, - paging: { first: 1 }, - }, - gqlFields: ` - id - nameSingular - fieldsList { - id - name - type - settings - } - `, - }); - - const testObject = objects[0]; - - jestExpectToBeDefined(testObject); - jestExpectToBeDefined(testObject.fieldsList); - - const searchVectorField = testObject.fieldsList.find( - (field: FieldMetadataDTO) => field.type === FieldMetadataType.TS_VECTOR, - ); - - jestExpectToBeDefined(searchVectorField); - - const settings = searchVectorField.settings as { - asExpression?: string; - }; - - jestExpectToBeDefined(settings); - jestExpectToBeDefined(settings.asExpression); - - return settings.asExpression; - }; - beforeAll(async () => { const { data: { @@ -129,7 +88,7 @@ describe('Field metadata update - search vector rename recompute', () => { }); }); - it('should recompute the search vector and keep search working when the indexed name field is renamed', async () => { + it('should rebuild the search vector and keep search working when the indexed name field is renamed', async () => { await updateOneFieldMetadata({ input: { idToUpdate: nameFieldMetadataId, @@ -143,10 +102,6 @@ describe('Field metadata update - search vector rename recompute', () => { expectToFail: false, }); - const asExpression = await getSearchVectorAsExpression(); - - expect(asExpression).toContain(RENAMED_NAME_FIELD); - const searchResult = await search({ searchInput: RECORD_NAME_VALUE, includedObjectNameSingulars: [OBJECT_NAME_SINGULAR], diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap index d434a3aa13..e722262a35 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap @@ -411,6 +411,11 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -1087,6 +1092,11 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -1774,6 +1784,11 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -2450,6 +2465,11 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -3161,6 +3181,11 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -3837,6 +3862,11 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -4513,6 +4543,11 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -5200,6 +5235,11 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -5900,6 +5940,11 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -6582,6 +6627,11 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -7282,6 +7332,11 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -7958,6 +8013,11 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -8669,6 +8729,11 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -9345,6 +9410,11 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", @@ -10021,6 +10091,11 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res "message": "Field metadata not found", "userFriendlyMessage": "Field metadata not found", }, + { + "code": "TS_VECTOR_FIELD_METADATA_NOT_FOUND", + "message": "TS_VECTOR field metadata not found", + "userFriendlyMessage": "Search vector field not found", + }, { "code": "OBJECT_METADATA_NOT_FOUND", "message": "Object metadata not found", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/update-one-object-metadata-serach-vector-side-effect.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/object-metadata/update-one-object-metadata-serach-vector-side-effect.integration-spec.ts index 1819c28cc2..dba9b85df6 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/update-one-object-metadata-serach-vector-side-effect.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/update-one-object-metadata-serach-vector-side-effect.integration-spec.ts @@ -3,13 +3,9 @@ import { search } from 'test/integration/graphql/utils/search.util'; import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; -import { findManyObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; -import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType } from 'twenty-shared/types'; -import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; - describe('Object metadata update - search vector side effect', () => { let testObjectMetadataId: string; let testFieldMetadataId: string; @@ -105,60 +101,6 @@ describe('Object metadata update - search vector side effect', () => { expectToFail: false, }); - const { objects } = await findManyObjectMetadata({ - expectToFail: false, - input: { - filter: { - id: { eq: testObjectMetadataId }, - }, - paging: { first: 1 }, - }, - gqlFields: ` - id - nameSingular - fieldsList { - id - name - type - settings - } - `, - }); - - expect(objects).toBeDefined(); - expect(objects.length).toBe(1); - - const testObject = objects[0]; - - jestExpectToBeDefined(testObject); - jestExpectToBeDefined(testObject.fieldsList); - - const searchVectorField = testObject.fieldsList.find( - (field: FieldMetadataDTO) => field.type === FieldMetadataType.TS_VECTOR, - ); - - jestExpectToBeDefined(searchVectorField); - - const settings = searchVectorField.settings as { - asExpression?: string; - generatedType?: string; - }; - - jestExpectToBeDefined(settings); - expect(settings.asExpression).toBeDefined(); - // Relabeling is additive: the new label identifier joins the search surface while the - // previously provisioned name row is preserved. - expect(settings.asExpression).toContain(NEW_LABEL_IDENTIFIER_FIELD_NAME); - expect(settings.asExpression).toContain('name'); - - // Position-ordered derivation appends the new label identifier last: the provisioned - // name row (position 0) stays first, the relabel row (max position + 1) comes after. - const asExpression = settings.asExpression as string; - - expect(asExpression.indexOf('"name"')).toBeLessThan( - asExpression.indexOf(`"${NEW_LABEL_IDENTIFIER_FIELD_NAME}"`), - ); - // The record is now reachable through the new label identifier value. const searchByNewLabelField = await search({ searchInput: RECORD_FIELD_VALUE, diff --git a/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts b/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts index 665d6cf0d1..2d8b5aafd4 100644 --- a/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts +++ b/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts @@ -34,7 +34,8 @@ export const extractRecordIdsAndDatesAsExpectAny = ( ) { return { ...acc, - [key]: expect.any(String), + [key]: + typeof value === 'object' ? expect.any(Object) : expect.any(String), }; } diff --git a/packages/twenty-shared/src/types/FieldMetadataSettings.ts b/packages/twenty-shared/src/types/FieldMetadataSettings.ts index 1e122a2f28..cf19be800f 100644 --- a/packages/twenty-shared/src/types/FieldMetadataSettings.ts +++ b/packages/twenty-shared/src/types/FieldMetadataSettings.ts @@ -62,11 +62,6 @@ type FieldMetadataFilesSettings = { maxNumberOfValues: number; }; -type FieldMetadataTsVectorSettings = { - asExpression?: string; - generatedType?: 'STORED' | 'VIRTUAL'; -}; - export type FieldMetadataSettingsMapping = { [FieldMetadataType.NUMBER]: FieldMetadataNumberSettings | null; [FieldMetadataType.CURRENCY]: FieldMetadataCurrencySettings | null; @@ -76,7 +71,7 @@ export type FieldMetadataSettingsMapping = { [FieldMetadataType.RELATION]: FieldMetadataRelationSettings; [FieldMetadataType.ADDRESS]: FieldMetadataAddressSettings | null; [FieldMetadataType.MORPH_RELATION]: FieldMetadataRelationSettings; - [FieldMetadataType.TS_VECTOR]: FieldMetadataTsVectorSettings | null; + [FieldMetadataType.TS_VECTOR]: null; [FieldMetadataType.PHONES]: FieldMetadataMultiItemSettings | null; [FieldMetadataType.EMAILS]: FieldMetadataMultiItemSettings | null; [FieldMetadataType.LINKS]: FieldMetadataMultiItemSettings | null;