From f65783f900ad9f3984a2cac43722c5bcb3a64beb Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:11:14 +0200 Subject: [PATCH] [GroupBy] Allow sorting in bar chart (#15097) Closes https://github.com/twentyhq/core-team-issues/issues/1628 From a technical perspective, we can add more ordering options, such as the ability to combine two sorts on the X axis, e.g. sort by Close date ASC and then by Sum ASC, which will sort groups that have the same close date between themselves depending on their sum ASC. @Bonapara could you provide design if you want this to be implemented (quite short on our hand i think - maybe in V2 though)? https://github.com/user-attachments/assets/6ef21fe1-9d8f-43c0-bfa2-f6fc6341cacf --------- Co-authored-by: ehconitin --- .../graph/hooks/useGraphWidgetGroupByQuery.ts | 1 + ...woDimensionalGroupByToBarChartData.test.ts | 114 ++++++++++++++++++ ...QueryVariablesFromBarChartConfiguration.ts | 80 ++++++------ .../widgets/graph/utils/getGroupByOrderBy.ts | 92 ++++++++++++++ .../widgets/graph/utils/getSortedKeys.ts | 18 +++ ...formTwoDimensionalGroupByToBarChartData.ts | 8 +- .../common-base-query-runner.service.ts | 2 +- .../common-find-many-query-runner.service.ts | 3 +- .../common-find-one-query-runner.service.ts | 6 +- .../common-result-getters.service.ts | 7 +- .../api/common/utils/get-page-info.util.ts | 7 +- .../__mocks__/mockPersonRecords.ts | 2 +- .../graphql-query-order.parser.ts | 16 ++- .../convert-order-by-to-find-options-order.ts | 2 +- .../parse-composite-field-for-order.util.ts | 3 +- .../graphql-query.parser.ts | 2 +- ...graphql-query-group-by-resolver.service.ts | 6 +- ...ult-with-group-by-dimension-values.util.ts | 6 +- ...ct-records-to-graphql-connection.helper.ts | 7 +- .../process-nested-relations-v2.helper.ts | 3 +- .../process-nested-relations.helper.ts | 3 +- .../interfaces/base-resolver-service.ts | 2 +- ...phql-query-create-many-resolver.service.ts | 2 +- ...aphql-query-create-one-resolver.service.ts | 3 +- ...phql-query-delete-many-resolver.service.ts | 2 +- ...aphql-query-delete-one-resolver.service.ts | 2 +- ...hql-query-destroy-many-resolver.service.ts | 2 +- ...phql-query-destroy-one-resolver.service.ts | 2 +- ...-query-find-duplicates-resolver.service.ts | 5 +- ...raphql-query-find-many-resolver.service.ts | 3 +- ...graphql-query-find-one-resolver.service.ts | 6 +- ...aphql-query-merge-many-resolver.service.ts | 3 +- ...hql-query-restore-many-resolver.service.ts | 2 +- ...phql-query-restore-one-resolver.service.ts | 2 +- ...phql-query-update-many-resolver.service.ts | 2 +- ...aphql-query-update-one-resolver.service.ts | 2 +- .../utils/cursors.util.ts | 7 +- .../interfaces/object-record.interface.ts | 52 +------- ...y-result-field-value-a-connection.guard.ts | 3 +- ...field-value-a-nested-record-array.guard.ts | 3 +- ...result-field-value-a-record-array.guard.ts | 3 +- ...query-result-field-value-a-record.guard.ts | 3 +- .../interfaces/query-result-field-value.ts | 3 +- .../query-result-getter-handler.interface.ts | 2 +- .../query-result-getters.factory.ts | 3 +- .../factories/query-runner-args.factory.ts | 7 +- .../workspace-query-hook.explorer.ts | 2 +- .../workspace-resolvers-builder.interface.ts | 6 +- .../rest-api-find-duplicates.handler.ts | 2 +- .../handlers/rest-api-find-many.handler.ts | 3 +- .../handlers/rest-api-find-one.handler.ts | 2 +- .../core/interfaces/rest-api-base.handler.ts | 6 +- .../__tests__/order-by-input.factory.spec.ts | 2 +- .../input-factories/order-by-input.factory.ts | 6 +- .../parse-order-by-rest-request.util.spec.ts | 2 +- .../add-default-order-by-id.util.ts | 7 +- .../parse-order-by-rest-request.util.ts | 7 +- ...posite-field-where-condition.utils.spec.ts | 7 +- .../compute-cursor-arg-filter.utils.spec.ts | 4 +- ...r-composite-field-where-condition.utils.ts | 3 +- .../build-cursor-where-condition.utils.ts | 2 +- .../utils/build-duplicate-conditions.utils.ts | 6 +- .../api/utils/is-ascending-order.utils.ts | 2 +- .../utils/validate-and-get-order-by.utils.ts | 8 +- .../object-record-changed-properties.util.ts | 3 +- .../utils/object-record-changed-values.ts | 4 +- .../utils/__tests__/parameters.utils.spec.ts | 3 +- .../open-api/utils/parameters.utils.ts | 3 +- .../services/find-records.service.ts | 2 +- .../services/record-position.service.ts | 3 +- .../search/services/search.service.ts | 7 +- .../records-with-object-metadata-item.ts | 2 +- .../subscriptions/dtos/on-db-event.dto.ts | 3 +- .../timeline-activity.repository.ts | 3 +- .../services/timeline-activity.service.ts | 5 +- ...orkflow-database-event-trigger.listener.ts | 3 +- ...ested-relation-queries.integration-spec.ts | 3 +- .../utils/create-one-operation.util.ts | 3 +- .../graphql/utils/find-one-operation.util.ts | 3 +- .../utils/update-one-operation.util.ts | 5 +- .../twenty-shared/src/types/ObjectRecord.ts | 8 ++ .../src/types/ObjectRecordGroupBy.ts | 37 ++++++ packages/twenty-shared/src/types/index.ts | 9 ++ 83 files changed, 453 insertions(+), 247 deletions(-) create mode 100644 packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts create mode 100644 packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getGroupByOrderBy.ts create mode 100644 packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getSortedKeys.ts create mode 100644 packages/twenty-shared/src/types/ObjectRecord.ts create mode 100644 packages/twenty-shared/src/types/ObjectRecordGroupBy.ts diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/hooks/useGraphWidgetGroupByQuery.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/hooks/useGraphWidgetGroupByQuery.ts index 49d7aee413..378cce5e1a 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/graph/hooks/useGraphWidgetGroupByQuery.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/hooks/useGraphWidgetGroupByQuery.ts @@ -54,6 +54,7 @@ export const useGraphWidgetGroupByQuery = ({ const variables = generateGroupByQueryVariablesFromBarChartConfiguration({ objectMetadataItem, barChartConfiguration: configuration, + aggregateOperation, }); const apolloCoreClient = useApolloCoreClient(); diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts new file mode 100644 index 0000000000..8db5e91f73 --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts @@ -0,0 +1,114 @@ +import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { type GroupByRawResult } from '@/page-layout/widgets/graph/types/GroupByRawResult'; +import { FieldMetadataType } from '~/generated-metadata/graphql'; +import { + ExtendedAggregateOperations, + GraphOrderBy, + GraphType, + type BarChartConfiguration, +} from '~/generated/graphql'; +import { transformTwoDimensionalGroupByToBarChartData } from '../transformTwoDimensionalGroupByToBarChartData'; + +describe('transformTwoDimensionalGroupByToBarChartData', () => { + const mockGroupByFieldX = { + id: 'field-x', + name: 'createdAt', + type: FieldMetadataType.DATE, + label: 'Created At', + } as FieldMetadataItem; + + const mockGroupByFieldY = { + id: 'field-y', + name: 'stage', + type: FieldMetadataType.SELECT, + label: 'Stage', + } as FieldMetadataItem; + + const mockAggregateField = { + id: 'field-aggregate', + name: 'amount', + type: FieldMetadataType.NUMBER, + label: 'Amount', + } as FieldMetadataItem; + + const mockObjectMetadataItem = { + id: 'object-1', + nameSingular: 'opportunity', + namePlural: 'opportunities', + fields: [mockGroupByFieldX, mockGroupByFieldY, mockAggregateField], + } as ObjectMetadataItem; + + const mockConfiguration: BarChartConfiguration = { + __typename: 'BarChartConfiguration', + graphType: GraphType.VERTICAL_BAR, + aggregateFieldMetadataId: 'field-aggregate', + aggregateOperation: ExtendedAggregateOperations.SUM, + primaryAxisGroupByFieldMetadataId: 'field-x', + secondaryAxisGroupByFieldMetadataId: 'field-y', + secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, + }; + + it('should order keys correctly despite unordered raw results', () => { + // This test demonstrates the key ordering issue described in the user query + // Raw results where "CUSTOMER" appears before "NEW" in the data stream despite orderBy, + // bc there is no "NEW" group before october 21st and the results are primarily ordered by date ASC + // but we want them ordered alphabetically-reversed + const rawResults: GroupByRawResult[] = [ + { + groupByDimensionValues: ['2025-10-16T00:00:00.000Z', 'SCREENING'], + sumAmount: 75000000000, + }, + { + groupByDimensionValues: ['2025-10-16T00:00:00.000Z', 'PROPOSAL'], + sumAmount: 380000000000, + }, + { + groupByDimensionValues: ['2025-10-17T00:00:00.000Z', 'CUSTOMER'], + sumAmount: 720000000000, + }, + { + groupByDimensionValues: ['2025-10-21T00:00:00.000Z', 'PROPOSAL'], + sumAmount: 580000000000, + }, + { + groupByDimensionValues: ['2025-10-21T00:00:00.000Z', 'NEW'], + sumAmount: 125000000000, + }, + ]; + + const result = transformTwoDimensionalGroupByToBarChartData({ + rawResults, + groupByFieldX: mockGroupByFieldX, + groupByFieldY: mockGroupByFieldY, + aggregateField: mockAggregateField, + configuration: mockConfiguration, + aggregateOperation: 'sumAmount', + objectMetadataItem: mockObjectMetadataItem, + }); + + expect(result.keys).toEqual(['SCREENING', 'PROPOSAL', 'NEW', 'CUSTOMER']); + expect(result.series).toEqual([ + { key: 'SCREENING', label: 'SCREENING' }, + { key: 'PROPOSAL', label: 'PROPOSAL' }, + { key: 'NEW', label: 'NEW' }, + { key: 'CUSTOMER', label: 'CUSTOMER' }, + ]); + + expect(result.data).toHaveLength(3); + expect(result.data[0]).toEqual({ + createdAt: 'Oct 16, 2025', + SCREENING: 75000000000, + PROPOSAL: 380000000000, + }); + expect(result.data[1]).toEqual({ + createdAt: 'Oct 17, 2025', + CUSTOMER: 720000000000, + }); + expect(result.data[2]).toEqual({ + createdAt: 'Oct 21, 2025', + PROPOSAL: 580000000000, + NEW: 125000000000, + }); + }); +}); diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/generateGroupByQueryVariablesFromBarChartConfiguration.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/generateGroupByQueryVariablesFromBarChartConfiguration.ts index 6e2d226ccb..d8d22c5095 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/generateGroupByQueryVariablesFromBarChartConfiguration.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/generateGroupByQueryVariablesFromBarChartConfiguration.ts @@ -1,29 +1,23 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { assertUnreachable, isDefined } from 'twenty-shared/utils'; -import { type BarChartConfiguration, GraphOrderBy } from '~/generated/graphql'; +import { getGroupByOrderBy } from '@/page-layout/widgets/graph/utils/getGroupByOrderBy'; +import { + type AggregateOrderByWithGroupByField, + type ObjectRecordOrderByForCompositeField, + type ObjectRecordOrderByForScalarField, + type ObjectRecordOrderByWithGroupByDateField, +} from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; +import { type BarChartConfiguration } from '~/generated/graphql'; import { buildGroupByFieldObject } from './buildGroupByFieldObject'; -const _mapOrderByToDirection = (orderByEnum: GraphOrderBy) => { - switch (orderByEnum) { - case GraphOrderBy.FIELD_ASC: - return 'AscNullsLast'; - case GraphOrderBy.FIELD_DESC: - return 'DescNullsLast'; - case GraphOrderBy.VALUE_ASC: - return 'AscNullsLast'; - case GraphOrderBy.VALUE_DESC: - return 'DescNullsLast'; - default: - assertUnreachable(orderByEnum); - } -}; - export const generateGroupByQueryVariablesFromBarChartConfiguration = ({ objectMetadataItem, barChartConfiguration, + aggregateOperation, }: { objectMetadataItem: ObjectMetadataItem; barChartConfiguration: BarChartConfiguration; + aggregateOperation?: string; }) => { const groupByFieldXId = barChartConfiguration.primaryAxisGroupByFieldMetadataId; @@ -71,31 +65,41 @@ export const generateGroupByQueryVariablesFromBarChartConfiguration = ({ ); } - const orderBy: Array> = []; + const orderBy: Array< + | AggregateOrderByWithGroupByField + | ObjectRecordOrderByForScalarField + | ObjectRecordOrderByWithGroupByDateField + | ObjectRecordOrderByForCompositeField + > = []; - // TODO: Add orderBy back in when the backend is ready - // if (isDefined(barChartConfiguration.primaryAxisOrderBy)) { - // orderBy.push({ - // [groupByFieldX.name]: mapOrderByToDirection( - // barChartConfiguration.primaryAxisOrderBy!, - // ), - // }); - // } - - // if ( - // isDefined(groupByFieldY) && - // isDefined(barChartConfiguration.secondaryAxisOrderBy) - // ) { - // orderBy.push({ - // [groupByFieldY.name]: mapOrderByToDirection( - // barChartConfiguration.secondaryAxisOrderBy!, - // ), - // }); - // } + if (isDefined(barChartConfiguration.primaryAxisOrderBy)) { + orderBy.push( + getGroupByOrderBy({ + graphOrderBy: barChartConfiguration.primaryAxisOrderBy, + groupByField: groupByFieldX, + groupBySubFieldName: + barChartConfiguration.primaryAxisGroupBySubFieldName, + aggregateOperation, + }), + ); + } + if ( + isDefined(groupByFieldY) && + isDefined(barChartConfiguration.secondaryAxisOrderBy) + ) { + orderBy.push( + getGroupByOrderBy({ + graphOrderBy: barChartConfiguration.secondaryAxisOrderBy, + groupByField: groupByFieldY, + groupBySubFieldName: + barChartConfiguration.secondaryAxisGroupBySubFieldName, + aggregateOperation, + }), + ); + } return { groupBy, - // TODO: Add filters ...(orderBy.length > 0 && { orderBy }), }; }; diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getGroupByOrderBy.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getGroupByOrderBy.ts new file mode 100644 index 0000000000..bd634a8049 --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getGroupByOrderBy.ts @@ -0,0 +1,92 @@ +import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType'; +import { GRAPH_DEFAULT_DATE_GRANULARITY } from '@/page-layout/widgets/graph/constants/GraphDefaultDateGranularity.constant'; +import { + OrderByDirection, + type AggregateOrderByWithGroupByField, + type ObjectRecordOrderByForCompositeField, + type ObjectRecordOrderByForScalarField, + type ObjectRecordOrderByWithGroupByDateField, +} from 'twenty-shared/types'; +import { + assertUnreachable, + isDefined, + isFieldMetadataDateKind, +} from 'twenty-shared/utils'; +import { GraphOrderBy } from '~/generated/graphql'; + +const mapOrderByToDirection = (orderByEnum: GraphOrderBy): OrderByDirection => { + switch (orderByEnum) { + case GraphOrderBy.FIELD_ASC: + return OrderByDirection.AscNullsLast; + case GraphOrderBy.FIELD_DESC: + return OrderByDirection.DescNullsLast; + case GraphOrderBy.VALUE_ASC: + return OrderByDirection.AscNullsLast; + case GraphOrderBy.VALUE_DESC: + return OrderByDirection.DescNullsLast; + default: + assertUnreachable(orderByEnum); + } +}; + +export const getGroupByOrderBy = ({ + graphOrderBy, + groupByField, + groupBySubFieldName, + aggregateOperation, +}: { + graphOrderBy: GraphOrderBy; + groupByField: FieldMetadataItem; + groupBySubFieldName?: string | null; + aggregateOperation?: string; +}): + | AggregateOrderByWithGroupByField + | ObjectRecordOrderByForScalarField + | ObjectRecordOrderByWithGroupByDateField + | ObjectRecordOrderByForCompositeField => { + switch (graphOrderBy) { + case GraphOrderBy.FIELD_ASC: + case GraphOrderBy.FIELD_DESC: { + if (isCompositeFieldType(groupByField.type)) { + if (!isDefined(groupBySubFieldName)) { + throw new Error( + `Group by subFieldName is required for composite fields (field: ${groupByField.name})`, + ); + } + return { + [groupByField.name]: { + [groupBySubFieldName]: mapOrderByToDirection(graphOrderBy), + }, + }; + } else if (isFieldMetadataDateKind(groupByField.type)) { + return { + [groupByField.name]: { + orderBy: mapOrderByToDirection(graphOrderBy), + granularity: GRAPH_DEFAULT_DATE_GRANULARITY, + }, + }; + } else { + return { + [groupByField.name]: mapOrderByToDirection(graphOrderBy), + }; + } + } + case GraphOrderBy.VALUE_ASC: + case GraphOrderBy.VALUE_DESC: { + if (!isDefined(aggregateOperation)) { + throw new Error( + `Aggregate operation not found (field: ${groupByField.name})`, + ); + } + + return { + aggregate: { + [aggregateOperation]: mapOrderByToDirection(graphOrderBy), + }, + }; + } + default: + assertUnreachable(graphOrderBy); + } +}; diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getSortedKeys.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getSortedKeys.ts new file mode 100644 index 0000000000..4cc1eb564f --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/getSortedKeys.ts @@ -0,0 +1,18 @@ +import { GraphOrderBy } from '~/generated/graphql'; + +export const getSortedKeys = ({ + orderByY, + yValues, +}: { + orderByY?: GraphOrderBy | null; + yValues: string[]; +}) => { + switch (orderByY) { + case GraphOrderBy.FIELD_ASC: + return Array.from(yValues).sort((a, b) => a.localeCompare(b)); + case GraphOrderBy.FIELD_DESC: + return Array.from(yValues).sort((a, b) => b.localeCompare(a)); + default: + return Array.from(yValues); + } +}; diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/transformTwoDimensionalGroupByToBarChartData.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/transformTwoDimensionalGroupByToBarChartData.ts index c5d6181eb2..9ebca27ddf 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/transformTwoDimensionalGroupByToBarChartData.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/transformTwoDimensionalGroupByToBarChartData.ts @@ -8,6 +8,7 @@ import { type GroupByRawResult } from '@/page-layout/widgets/graph/types/GroupBy import { computeAggregateValueFromGroupByResult } from '@/page-layout/widgets/graph/utils/computeAggregateValueFromGroupByResult'; import { formatDimensionValue } from '@/page-layout/widgets/graph/utils/formatDimensionValue'; import { getFieldKey } from '@/page-layout/widgets/graph/utils/getFieldKey'; +import { getSortedKeys } from '@/page-layout/widgets/graph/utils/getSortedKeys'; import { isDefined } from 'twenty-shared/utils'; import { type BarChartConfiguration } from '~/generated/graphql'; @@ -101,7 +102,12 @@ export const transformTwoDimensionalGroupByToBarChartData = ({ dataItem[yValue] = aggregateValue; }); - const keys = Array.from(yValues); + // Sorting needed because yValues may be unordered despite BE orderBy, if there are empty groups + const keys = getSortedKeys({ + orderByY: configuration.secondaryAxisOrderBy, + yValues: Array.from(yValues), + }); + const series: BarChartSeries[] = keys.map((key) => ({ key, label: key, diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-base-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-base-query-runner.service.ts index acd9becd69..87b41a6450 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-base-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-base-query-runner.service.ts @@ -1,9 +1,9 @@ import { Inject, Injectable } from '@nestjs/common'; +import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; -import { ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { CommonSelectedFieldsHandler } from 'src/engine/api/common/common-args-handlers/common-query-selected-fields/common-selected-fields.handler'; import { CommonResultGettersService } from 'src/engine/api/common/common-result-getters/common-result-getters.service'; diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-many-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-many-query-runner.service.ts index b6aa41f990..ceb5f583e1 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-many-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-many-query-runner.service.ts @@ -2,14 +2,13 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'class-validator'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { ObjectRecord, OrderByDirection } from 'twenty-shared/types'; import { FindOptionsRelations, ObjectLiteral } from 'typeorm'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; import { - ObjectRecord, ObjectRecordFilter, ObjectRecordOrderBy, - OrderByDirection, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service'; diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-one-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-one-query-runner.service.ts index bc9ba31050..3aa1c3c3e1 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-one-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-find-one-query-runner.service.ts @@ -1,14 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { FindOptionsRelations, ObjectLiteral } from 'typeorm'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; -import { - ObjectRecord, - ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service'; import { diff --git a/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts b/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts index c1a6012c24..48fd166d0a 100644 --- a/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts @@ -1,9 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + FieldMetadataType, + ObjectRecord, + RelationType, +} from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; import { type QueryResultGetterHandlerInterface } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface'; diff --git a/packages/twenty-server/src/engine/api/common/utils/get-page-info.util.ts b/packages/twenty-server/src/engine/api/common/utils/get-page-info.util.ts index 107f1f8234..e108fd4640 100644 --- a/packages/twenty-server/src/engine/api/common/utils/get-page-info.util.ts +++ b/packages/twenty-server/src/engine/api/common/utils/get-page-info.util.ts @@ -1,7 +1,6 @@ -import { - type ObjectRecord, - type ObjectRecordOrderBy, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type CommonPageInfo } from 'src/engine/api/common/types/common-page-info.type'; import { diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonRecords.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonRecords.ts index b5ce438700..02e4d9bc11 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonRecords.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonRecords.ts @@ -1,4 +1,4 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; export const mockPersonRecords: Partial[] = [ { diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser.ts index e486e2535a..edd3b89ce1 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser.ts @@ -1,19 +1,17 @@ import { isObject } from 'class-validator'; import { + type AggregateOrderByWithGroupByField, FieldMetadataType, ObjectRecordGroupByDateGranularity, -} from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - -import { - OrderByDirection, - type AggregateOrderByWithGroupByField, - type ObjectRecordOrderBy, type ObjectRecordOrderByForCompositeField, type ObjectRecordOrderByForScalarField, type ObjectRecordOrderByWithGroupByDateField, + OrderByDirection, type OrderByWithGroupBy, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +} from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { GraphqlQueryRunnerException, @@ -28,8 +26,8 @@ import { import { getGroupByExpression } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/get-group-by-expression.util'; import { ProcessAggregateHelper } from 'src/engine/api/graphql/graphql-query-runner/helpers/process-aggregate.helper'; import { - getAvailableAggregationsFromObjectFields, type AggregationField, + getAvailableAggregationsFromObjectFields, } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-available-aggregations-from-object-fields.util'; import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/convert-order-by-to-find-options-order.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/convert-order-by-to-find-options-order.ts index 0c3d2b5e77..dcd26cf4a1 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/convert-order-by-to-find-options-order.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/convert-order-by-to-find-options-order.ts @@ -1,4 +1,4 @@ -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; import { GraphqlQueryRunnerException, diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/parse-composite-field-for-order.util.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/parse-composite-field-for-order.util.ts index add47f6b12..ca67e1031b 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/parse-composite-field-for-order.util.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/parse-composite-field-for-order.util.ts @@ -1,7 +1,6 @@ +import { OrderByDirection } from 'twenty-shared/types'; import { capitalize } from 'twenty-shared/utils'; -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { type OrderByCondition } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser'; import { convertOrderByToFindOptionsOrder } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/convert-order-by-to-find-options-order'; import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser.ts index f58456f8f0..32b99952eb 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser.ts @@ -1,9 +1,9 @@ +import { type OrderByWithGroupBy } from 'twenty-shared/types'; import { type FindOptionsWhere, type ObjectLiteral } from 'typeorm'; import { type ObjectRecordFilter, type ObjectRecordOrderBy, - type OrderByWithGroupBy, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/graphql-query-group-by-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/graphql-query-group-by-resolver.service.ts index 6a74300393..3853626b10 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/graphql-query-group-by-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/graphql-query-group-by-resolver.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { CompositeFieldSubFieldName, + ObjectRecord, PartialFieldMetadataItemOption, RecordFilterGroupLogicalOperator, } from 'twenty-shared/types'; @@ -18,10 +19,7 @@ import { GraphqlQueryBaseResolverService, GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { - ObjectRecord, - ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { IEdge } from 'src/engine/api/graphql/workspace-query-runner/interfaces/edge.interface'; import { IGroupByConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/group-by-connection.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util.ts index e20d8ae6dd..2e8e770cd2 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util.ts @@ -1,7 +1,9 @@ import { t } from '@lingui/core/macro'; -import { ObjectRecordGroupByDateGranularity } from 'twenty-shared/types'; +import { + ObjectRecordGroupByDateGranularity, + type ObjectRecord, +} from 'twenty-shared/types'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type IEdge } from 'src/engine/api/graphql/workspace-query-runner/interfaces/edge.interface'; import { type IGroupByConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/group-by-connection.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/object-records-to-graphql-connection.helper.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/object-records-to-graphql-connection.helper.ts index 6a4dc83734..211ff2334a 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/object-records-to-graphql-connection.helper.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/object-records-to-graphql-connection.helper.ts @@ -1,10 +1,7 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { - type ObjectRecord, - type ObjectRecordOrderBy, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; import { CONNECTION_MAX_DEPTH } from 'src/engine/api/graphql/graphql-query-runner/constants/connection-max-depth.constant'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts index 90dc96d9ca..87460b4e4b 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper.ts @@ -1,9 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { type FindOptionsRelations, type ObjectLiteral } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations.helper.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations.helper.ts index 8256dcdd56..af7ecdb80a 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations.helper.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations.helper.ts @@ -1,9 +1,8 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecord } from 'twenty-shared/types'; import { type FindOptionsRelations, type ObjectLiteral } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { ProcessNestedRelationsV2Helper } from 'src/engine/api/graphql/graphql-query-runner/helpers/process-nested-relations-v2.helper'; import { type AggregationField } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-available-aggregations-from-object-fields.util'; import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts index c051d61999..8de842623b 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts @@ -1,6 +1,7 @@ import { Inject, Injectable } from '@nestjs/common'; import graphqlFields from 'graphql-fields'; +import { type ObjectRecord } from 'twenty-shared/types'; import { assertIsDefinedOrThrow, capitalize, @@ -8,7 +9,6 @@ import { } from 'twenty-shared/utils'; import { type ObjectLiteral } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; import { type IEdge } from 'src/engine/api/graphql/workspace-query-runner/interfaces/edge.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-many-resolver.service.ts index e711437e16..7bf701ee44 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-many-resolver.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { msg } from '@lingui/core/macro'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { capitalize, isDefined } from 'twenty-shared/utils'; import { In, @@ -14,7 +15,6 @@ import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts index 396c904efd..361a6c7ded 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-create-one-resolver.service.ts @@ -1,10 +1,11 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type CreateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-many-resolver.service.ts index 0fb36df399..dac5d78681 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-many-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type DeleteManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-one-resolver.service.ts index d38b767506..f4189337a7 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-delete-one-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type DeleteOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-many-resolver.service.ts index 07243cb6df..b045732caf 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-many-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type DestroyManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-one-resolver.service.ts index 33c0fa581e..e5b6ca3d5e 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-destroy-one-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type DestroyOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-duplicates-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-duplicates-resolver.service.ts index a3f9402c47..94a6ea1b30 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-duplicates-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-duplicates-resolver.service.ts @@ -1,16 +1,13 @@ import { Injectable } from '@nestjs/common'; import isEmpty from 'lodash.isempty'; +import { OrderByDirection, type ObjectRecord } from 'twenty-shared/types'; import { In } from 'typeorm'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { - type ObjectRecord, - OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type FindDuplicatesResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts index 4fae140397..31e5fb356a 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { ObjectRecord, OrderByDirection } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { @@ -8,10 +9,8 @@ import { type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; import { - type ObjectRecord, type ObjectRecordFilter, type ObjectRecordOrderBy, - OrderByDirection, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts index a6899aba73..4d42026ca7 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts @@ -2,15 +2,13 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { - type ObjectRecord, - type ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type FindOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-merge-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-merge-many-resolver.service.ts index 474a5e270b..ae69c6377f 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-merge-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-merge-many-resolver.service.ts @@ -4,7 +4,7 @@ import { MUTATION_MAX_MERGE_RECORDS, QUERY_MAX_RECORDS, } from 'twenty-shared/constants'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { In } from 'typeorm'; import { v4 as uuidv4 } from 'uuid'; @@ -13,7 +13,6 @@ import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type MergeManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { type FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-many-resolver.service.ts index f9ad6fd8f6..f3af4f5d70 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-many-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type RestoreManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-one-resolver.service.ts index f0a6c24e5c..bd8eb2d223 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-restore-one-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type RestoreOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts index c66906b52b..edf8a28367 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type UpdateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts index cd3c1a6369..e5b26556e0 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { type ObjectRecord } from 'twenty-shared/types'; import { GraphqlQueryBaseResolverService, type GraphqlQueryResolverExecutionArgs, } from 'src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type UpdateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/cursors.util.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/cursors.util.ts index 4b40e5150e..630e3c4729 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/cursors.util.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/cursors.util.ts @@ -1,7 +1,6 @@ -import { - type ObjectRecord, - type ObjectRecordOrderBy, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type FindManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface.ts index 8c74336473..90ba536427 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface.ts @@ -1,14 +1,9 @@ -import { type ObjectRecordGroupByDateGranularity } from 'twenty-shared/types'; - -//TODO : Refacto-common - Should be moved to common api layer -export interface ObjectRecord { - id: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - createdAt: string; - updatedAt: string; - deletedAt: string | null; -} +import { + type ObjectRecord, + type ObjectRecordGroupByDateGranularity, + type ObjectRecordOrderByForCompositeField, + type ObjectRecordOrderByForScalarField, +} from 'twenty-shared/types'; export type ObjectRecordFilter = Partial<{ // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -35,45 +30,10 @@ export type ObjectRecordGroupByForDateField = Partial<{ }; }>; -export enum OrderByDirection { - AscNullsFirst = 'AscNullsFirst', - AscNullsLast = 'AscNullsLast', - DescNullsFirst = 'DescNullsFirst', - DescNullsLast = 'DescNullsLast', -} - export type ObjectRecordOrderBy = Array< ObjectRecordOrderByForScalarField | ObjectRecordOrderByForCompositeField >; -export type AggregateOrderByWithGroupByField = { - aggregate: { - [x: string]: OrderByDirection; - }; -}; - -export type ObjectRecordOrderByWithGroupByDateField = { - [Property in keyof ObjectRecord]?: { - orderBy: OrderByDirection; - granularity: ObjectRecordGroupByDateGranularity; - }; -}; - -export type OrderByWithGroupBy = Array< - | ObjectRecordOrderByForScalarField - | ObjectRecordOrderByForCompositeField - | ObjectRecordOrderByWithGroupByDateField - | AggregateOrderByWithGroupByField ->; - -export type ObjectRecordOrderByForScalarField = { - [Property in keyof ObjectRecord]?: OrderByDirection; -}; - -export type ObjectRecordOrderByForCompositeField = { - [Property in keyof ObjectRecord]?: Record; -}; - export type ObjectRecordCursorLeafScalarValue = string | number | boolean; export type ObjectRecordCursorLeafCompositeValue = Record< string, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-connection.guard.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-connection.guard.ts index 2babfffd03..bac1a4d2fb 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-connection.guard.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-connection.guard.ts @@ -1,4 +1,5 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; import { type IEdge } from 'src/engine/api/graphql/workspace-query-runner/interfaces/edge.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-nested-record-array.guard.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-nested-record-array.guard.ts index 3d43845a7b..7764940370 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-nested-record-array.guard.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-nested-record-array.guard.ts @@ -1,4 +1,5 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; export const isQueryResultFieldValueANestedRecordArray = ( diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record-array.guard.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record-array.guard.ts index 8f5a674cb2..d4690d8634 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record-array.guard.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record-array.guard.ts @@ -1,4 +1,5 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; export const isQueryResultFieldValueARecordArray = ( diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record.guard.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record.guard.ts index f355055888..f42cb4d7ec 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record.guard.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/guards/is-query-result-field-value-a-record.guard.ts @@ -1,4 +1,5 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; export const isQueryResultFieldValueARecord = ( diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value.ts index dd756f3b17..8fdcb98bb4 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value.ts @@ -1,4 +1,5 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; + import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; export type QueryResultFieldValue = diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface.ts index 98a7f7dc37..5e757e0000 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface.ts @@ -1,4 +1,4 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; export interface QueryResultGetterHandlerInterface { handle( diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts index cc79b0c8a8..bbd555ecb6 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/query-result-getters.factory.ts @@ -1,9 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; import { type QueryResultGetterHandlerInterface } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface'; import { type IConnection } from 'src/engine/api/graphql/workspace-query-runner/interfaces/connection.interface'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts index 7554f58ae4..d9b39abd63 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts @@ -1,12 +1,9 @@ import { Injectable } from '@nestjs/common'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, ObjectRecord } from 'twenty-shared/types'; import { assertIsDefinedOrThrow, isDefined } from 'twenty-shared/utils'; -import { - type ObjectRecord, - type ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface'; import { type CreateManyResolverArgs, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.explorer.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.explorer.ts index c9e3c3cd8a..5dd2a65708 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.explorer.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.explorer.ts @@ -3,9 +3,9 @@ import { DiscoveryService, ModuleRef, createContextId } from '@nestjs/core'; import { Injector } from '@nestjs/core/injector/injector'; import { type Module } from '@nestjs/core/injector/module'; +import { type ObjectRecord } from 'twenty-shared/types'; import { assertIsDefinedOrThrow } from 'twenty-shared/utils'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value'; import { type WorkspacePostQueryHookInstance, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts b/packages/twenty-server/src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts index b83c805a28..cd1e988a1f 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts @@ -1,11 +1,13 @@ import { type GraphQLFieldResolver } from 'graphql'; - import { type ObjectRecord, + type OrderByWithGroupBy, +} from 'twenty-shared/types'; + +import { type ObjectRecordFilter, type ObjectRecordGroupBy, type ObjectRecordOrderBy, - type OrderByWithGroupBy, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type workspaceResolverBuilderMethodNames } from 'src/engine/api/graphql/workspace-resolver-builder/factories/factories'; diff --git a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-duplicates.handler.ts b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-duplicates.handler.ts index e91e7f9fc0..7b92eb05d8 100644 --- a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-duplicates.handler.ts +++ b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-duplicates.handler.ts @@ -2,9 +2,9 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { type Request } from 'express'; import isEmpty from 'lodash.isempty'; +import { type ObjectRecord } from 'twenty-shared/types'; import { In } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { type FormatResult, RestApiBaseHandler, diff --git a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-many.handler.ts b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-many.handler.ts index 2c5dcc0f03..394fa3bdd8 100644 --- a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-many.handler.ts +++ b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-many.handler.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { ObjectRecord } from 'twenty-shared/types'; + import { PageInfo, RestApiBaseHandler, diff --git a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-one.handler.ts b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-one.handler.ts index 5c6df547f6..72c9f8bfd7 100644 --- a/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-one.handler.ts +++ b/packages/twenty-server/src/engine/api/rest/core/handlers/rest-api-find-one.handler.ts @@ -1,8 +1,8 @@ import { BadRequestException, Injectable } from '@nestjs/common'; +import { ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { RestApiBaseHandler } from 'src/engine/api/rest/core/interfaces/rest-api-base.handler'; import { CommonFindOneQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-find-one-query-runner.service'; diff --git a/packages/twenty-server/src/engine/api/rest/core/interfaces/rest-api-base.handler.ts b/packages/twenty-server/src/engine/api/rest/core/interfaces/rest-api-base.handler.ts index fae621a772..6cf87062c6 100644 --- a/packages/twenty-server/src/engine/api/rest/core/interfaces/rest-api-base.handler.ts +++ b/packages/twenty-server/src/engine/api/rest/core/interfaces/rest-api-base.handler.ts @@ -4,16 +4,14 @@ import chunk from 'lodash.chunk'; import isEmpty from 'lodash.isempty'; import { FieldMetadataType, + ObjectRecord, type RestrictedFieldsPermissions, } from 'twenty-shared/types'; import { capitalize, isDefined } from 'twenty-shared/utils'; import { In, type ObjectLiteral } from 'typeorm'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; -import { - type ObjectRecord, - type ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { GraphqlQueryParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser'; import { encodeCursor } from 'src/engine/api/graphql/graphql-query-runner/utils/cursors.util'; diff --git a/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/order-by-input.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/order-by-input.factory.spec.ts index f316727bc1..72f425c923 100644 --- a/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/order-by-input.factory.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/order-by-input.factory.spec.ts @@ -1,6 +1,6 @@ import { Test, type TestingModule } from '@nestjs/testing'; -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; import { objectMetadataMapItemMock, diff --git a/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts index 01f70b3cb6..c9836e69c8 100644 --- a/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts @@ -1,11 +1,9 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { type Request } from 'express'; +import { OrderByDirection } from 'twenty-shared/types'; -import { - type ObjectRecordOrderBy, - OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { checkFields } from 'src/engine/api/rest/core/query-builder/utils/check-fields.utils'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; diff --git a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/__tests__/parse-order-by-rest-request.util.spec.ts b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/__tests__/parse-order-by-rest-request.util.spec.ts index c385f0d962..5589286f47 100644 --- a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/__tests__/parse-order-by-rest-request.util.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/__tests__/parse-order-by-rest-request.util.spec.ts @@ -1,4 +1,4 @@ -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; import { parseOrderByRestRequest } from 'src/engine/api/rest/input-request-parsers/order-by-parser-utils/parse-order-by-rest-request.util'; diff --git a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/add-default-order-by-id.util.ts b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/add-default-order-by-id.util.ts index 9715769026..78a7db7b22 100644 --- a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/add-default-order-by-id.util.ts +++ b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/add-default-order-by-id.util.ts @@ -1,7 +1,6 @@ -import { - type ObjectRecordOrderBy, - OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; export const addDefaultOrderById = (orderBy: ObjectRecordOrderBy) => { const hasIdOrder = orderBy.some((o) => Object.keys(o).includes('id')); diff --git a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/parse-order-by-rest-request.util.ts b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/parse-order-by-rest-request.util.ts index 1408359c2a..a913985d68 100644 --- a/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/parse-order-by-rest-request.util.ts +++ b/packages/twenty-server/src/engine/api/rest/input-request-parsers/order-by-parser-utils/parse-order-by-rest-request.util.ts @@ -2,10 +2,9 @@ import { BadRequestException } from '@nestjs/common'; -import { - type ObjectRecordOrderBy, - OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/input-factories/order-by-input.factory'; import { addDefaultOrderById } from 'src/engine/api/rest/input-request-parsers/order-by-parser-utils/add-default-order-by-id.util'; diff --git a/packages/twenty-server/src/engine/api/utils/__tests__/build-cursor-composite-field-where-condition.utils.spec.ts b/packages/twenty-server/src/engine/api/utils/__tests__/build-cursor-composite-field-where-condition.utils.spec.ts index 7e27505aa7..2c499c0214 100644 --- a/packages/twenty-server/src/engine/api/utils/__tests__/build-cursor-composite-field-where-condition.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/utils/__tests__/build-cursor-composite-field-where-condition.utils.spec.ts @@ -1,10 +1,7 @@ import { type EachTestingContext } from 'twenty-shared/testing'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, OrderByDirection } from 'twenty-shared/types'; -import { - type ObjectRecordOrderBy, - OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { buildCursorCompositeFieldWhereCondition } from 'src/engine/api/utils/build-cursor-composite-field-where-condition.utils'; diff --git a/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts b/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts index 9b2c04ebff..773491cac5 100644 --- a/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts @@ -1,6 +1,4 @@ -import { FieldMetadataType } from 'twenty-shared/types'; - -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { FieldMetadataType, OrderByDirection } from 'twenty-shared/types'; import { GraphqlQueryRunnerException } from 'src/engine/api/graphql/graphql-query-runner/errors/graphql-query-runner.exception'; import { computeCursorArgFilter } from 'src/engine/api/utils/compute-cursor-arg-filter.utils'; diff --git a/packages/twenty-server/src/engine/api/utils/build-cursor-composite-field-where-condition.utils.ts b/packages/twenty-server/src/engine/api/utils/build-cursor-composite-field-where-condition.utils.ts index 04edf13919..f5a0be6443 100644 --- a/packages/twenty-server/src/engine/api/utils/build-cursor-composite-field-where-condition.utils.ts +++ b/packages/twenty-server/src/engine/api/utils/build-cursor-composite-field-where-condition.utils.ts @@ -1,8 +1,7 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { - type ObjectRecord, type ObjectRecordCursorLeafCompositeValue, type ObjectRecordFilter, type ObjectRecordOrderBy, diff --git a/packages/twenty-server/src/engine/api/utils/build-cursor-where-condition.utils.ts b/packages/twenty-server/src/engine/api/utils/build-cursor-where-condition.utils.ts index c44da44387..cadf79f282 100644 --- a/packages/twenty-server/src/engine/api/utils/build-cursor-where-condition.utils.ts +++ b/packages/twenty-server/src/engine/api/utils/build-cursor-where-condition.utils.ts @@ -1,7 +1,7 @@ +import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { - type ObjectRecord, type ObjectRecordCursorLeafCompositeValue, type ObjectRecordCursorLeafScalarValue, type ObjectRecordOrderBy, diff --git a/packages/twenty-server/src/engine/api/utils/build-duplicate-conditions.utils.ts b/packages/twenty-server/src/engine/api/utils/build-duplicate-conditions.utils.ts index 617a819096..b5f154c52c 100644 --- a/packages/twenty-server/src/engine/api/utils/build-duplicate-conditions.utils.ts +++ b/packages/twenty-server/src/engine/api/utils/build-duplicate-conditions.utils.ts @@ -1,9 +1,7 @@ import isEmpty from 'lodash.isempty'; +import { type ObjectRecord } from 'twenty-shared/types'; -import { - type ObjectRecord, - type ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { settings } from 'src/engine/constants/settings'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; diff --git a/packages/twenty-server/src/engine/api/utils/is-ascending-order.utils.ts b/packages/twenty-server/src/engine/api/utils/is-ascending-order.utils.ts index 196f337200..b7389f2f11 100644 --- a/packages/twenty-server/src/engine/api/utils/is-ascending-order.utils.ts +++ b/packages/twenty-server/src/engine/api/utils/is-ascending-order.utils.ts @@ -1,4 +1,4 @@ -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; export const isAscendingOrder = (direction: OrderByDirection): boolean => direction === OrderByDirection.AscNullsFirst || diff --git a/packages/twenty-server/src/engine/api/utils/validate-and-get-order-by.utils.ts b/packages/twenty-server/src/engine/api/utils/validate-and-get-order-by.utils.ts index eb920a80cc..d600d7de69 100644 --- a/packages/twenty-server/src/engine/api/utils/validate-and-get-order-by.utils.ts +++ b/packages/twenty-server/src/engine/api/utils/validate-and-get-order-by.utils.ts @@ -1,12 +1,12 @@ -import { isDefined } from 'twenty-shared/utils'; - import { type ObjectRecord, - type ObjectRecordOrderBy, type ObjectRecordOrderByForCompositeField, type ObjectRecordOrderByForScalarField, OrderByDirection, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +} from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { GraphqlQueryRunnerException, diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util.ts index a53d0826b2..3c22e7fcb5 100644 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util.ts +++ b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util.ts @@ -1,6 +1,5 @@ import deepEqual from 'deep-equal'; - -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; import { type BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-values.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-values.ts index e226d44ee4..dd4c18a519 100644 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-values.ts +++ b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/object-record-changed-values.ts @@ -1,7 +1,5 @@ import deepEqual from 'deep-equal'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/parameters.utils.spec.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/parameters.utils.spec.ts index 4437a6c627..81fb0344ea 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/parameters.utils.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/parameters.utils.spec.ts @@ -2,8 +2,7 @@ import { QUERY_DEFAULT_LIMIT_RECORDS, QUERY_MAX_RECORDS, } from 'twenty-shared/constants'; - -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; import { computeDepthParameters, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/parameters.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/parameters.utils.ts index e0885d33ca..4a264fa38f 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/parameters.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/parameters.utils.ts @@ -3,8 +3,7 @@ import { QUERY_DEFAULT_LIMIT_RECORDS, QUERY_MAX_RECORDS, } from 'twenty-shared/constants'; - -import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { OrderByDirection } from 'twenty-shared/types'; export const computeLimitParameters = ( fromMetadata = false, diff --git a/packages/twenty-server/src/engine/core-modules/record-crud/services/find-records.service.ts b/packages/twenty-server/src/engine/core-modules/record-crud/services/find-records.service.ts index f896703eaf..80f39bf902 100644 --- a/packages/twenty-server/src/engine/core-modules/record-crud/services/find-records.service.ts +++ b/packages/twenty-server/src/engine/core-modules/record-crud/services/find-records.service.ts @@ -1,12 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; import { QUERY_MAX_RECORDS } from 'twenty-shared/constants'; +import { OrderByDirection } from 'twenty-shared/types'; import { type ObjectLiteral } from 'typeorm'; import { type ObjectRecordFilter, type ObjectRecordOrderBy, - OrderByDirection, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { GraphqlQueryParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser'; diff --git a/packages/twenty-server/src/engine/core-modules/record-position/services/record-position.service.ts b/packages/twenty-server/src/engine/core-modules/record-position/services/record-position.service.ts index 8d783431ec..b994f235a6 100644 --- a/packages/twenty-server/src/engine/core-modules/record-position/services/record-position.service.ts +++ b/packages/twenty-server/src/engine/core-modules/record-position/services/record-position.service.ts @@ -1,10 +1,9 @@ import { Injectable } from '@nestjs/common'; import { isNumber } from '@sniptt/guards'; +import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; export type RecordPositionServiceCreateArgs = { diff --git a/packages/twenty-server/src/engine/core-modules/search/services/search.service.ts b/packages/twenty-server/src/engine/core-modules/search/services/search.service.ts index 91b1e7989a..5202573a90 100644 --- a/packages/twenty-server/src/engine/core-modules/search/services/search.service.ts +++ b/packages/twenty-server/src/engine/core-modules/search/services/search.service.ts @@ -2,14 +2,11 @@ import { Injectable } from '@nestjs/common'; import { isNonEmptyString } from '@sniptt/guards'; import chunk from 'lodash.chunk'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, ObjectRecord } from 'twenty-shared/types'; import { getLogoUrlFromDomainName } from 'twenty-shared/utils'; import { Brackets, type ObjectLiteral } from 'typeorm'; -import { - type ObjectRecord, - type ObjectRecordFilter, -} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; import { GraphqlQueryParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser'; import { diff --git a/packages/twenty-server/src/engine/core-modules/search/types/records-with-object-metadata-item.ts b/packages/twenty-server/src/engine/core-modules/search/types/records-with-object-metadata-item.ts index 8cd5c99379..f9beee15ea 100644 --- a/packages/twenty-server/src/engine/core-modules/search/types/records-with-object-metadata-item.ts +++ b/packages/twenty-server/src/engine/core-modules/search/types/records-with-object-metadata-item.ts @@ -1,4 +1,4 @@ -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; diff --git a/packages/twenty-server/src/engine/subscriptions/dtos/on-db-event.dto.ts b/packages/twenty-server/src/engine/subscriptions/dtos/on-db-event.dto.ts index d3de16c8ca..630d00dd20 100644 --- a/packages/twenty-server/src/engine/subscriptions/dtos/on-db-event.dto.ts +++ b/packages/twenty-server/src/engine/subscriptions/dtos/on-db-event.dto.ts @@ -1,8 +1,7 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import GraphQLJSON from 'graphql-type-json'; - -import { ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { ObjectRecord } from 'twenty-shared/types'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; diff --git a/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts b/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts index c7f5c0e13c..8704d4ee1a 100644 --- a/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts +++ b/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts @@ -1,10 +1,9 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'class-validator'; +import { type ObjectRecord } from 'twenty-shared/types'; import { In, MoreThan } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { objectRecordDiffMerge } from 'src/engine/core-modules/event-emitter/utils/object-record-diff-merge'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { type TimelineActivityPayload } from 'src/modules/timeline/types/timeline-activity-payload'; diff --git a/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts b/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts index fb5ae69970..38518231dd 100644 --- a/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts +++ b/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts @@ -1,18 +1,17 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { In } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { type ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; import { parseEventNameOrThrow } from 'src/engine/workspace-event-emitter/utils/parse-event-name'; import { TimelineActivityRepository } from 'src/modules/timeline/repositories/timeline-activity.repository'; import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity'; import { type TimelineActivityPayload } from 'src/modules/timeline/types/timeline-activity-payload'; -import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; type ActivityType = 'note' | 'task'; diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts index 05802930b5..ce16475a13 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts @@ -1,10 +1,9 @@ import { Injectable, Logger } from '@nestjs/common'; +import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { In, Raw } from 'typeorm'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; diff --git a/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts index 76ca0a3650..501bee5cc7 100644 --- a/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/object-generated/nested-relation-queries.integration-spec.ts @@ -13,8 +13,7 @@ import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graph import { performCreateManyOperation } from 'test/integration/graphql/utils/perform-create-many-operation.utils'; import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util'; import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util'; - -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; diff --git a/packages/twenty-server/test/integration/graphql/utils/create-one-operation.util.ts b/packages/twenty-server/test/integration/graphql/utils/create-one-operation.util.ts index c73893e685..6bc8e6a298 100644 --- a/packages/twenty-server/test/integration/graphql/utils/create-one-operation.util.ts +++ b/packages/twenty-server/test/integration/graphql/utils/create-one-operation.util.ts @@ -3,10 +3,9 @@ import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graph import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; +import { type ObjectRecord } from 'twenty-shared/types'; import { capitalize } from 'twenty-shared/utils'; -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; - type CreateOneOperationArgs = PerformMetadataQueryParams & { objectMetadataSingularName: string; }; diff --git a/packages/twenty-server/test/integration/graphql/utils/find-one-operation.util.ts b/packages/twenty-server/test/integration/graphql/utils/find-one-operation.util.ts index fbceeeb1e1..5cef303d35 100644 --- a/packages/twenty-server/test/integration/graphql/utils/find-one-operation.util.ts +++ b/packages/twenty-server/test/integration/graphql/utils/find-one-operation.util.ts @@ -2,8 +2,7 @@ import { findOneOperationFactory } from 'test/integration/graphql/utils/find-one import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; - -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; +import { type ObjectRecord } from 'twenty-shared/types'; type FindOneOperationArgs = Parameters[0] & { expectToFail?: boolean; diff --git a/packages/twenty-server/test/integration/graphql/utils/update-one-operation.util.ts b/packages/twenty-server/test/integration/graphql/utils/update-one-operation.util.ts index 42c78a1701..a1508bc9a2 100644 --- a/packages/twenty-server/test/integration/graphql/utils/update-one-operation.util.ts +++ b/packages/twenty-server/test/integration/graphql/utils/update-one-operation.util.ts @@ -1,11 +1,10 @@ import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; +import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util'; import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; +import { type ObjectRecord } from 'twenty-shared/types'; import { capitalize } from 'twenty-shared/utils'; -import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util'; - -import { type ObjectRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; type UpdateOneOperationArgs = PerformMetadataQueryParams & { objectMetadataSingularName: string; diff --git a/packages/twenty-shared/src/types/ObjectRecord.ts b/packages/twenty-shared/src/types/ObjectRecord.ts new file mode 100644 index 0000000000..87d5d9e618 --- /dev/null +++ b/packages/twenty-shared/src/types/ObjectRecord.ts @@ -0,0 +1,8 @@ +export interface ObjectRecord { + id: string; + + [key: string]: any; + createdAt: string; + updatedAt: string; + deletedAt: string | null; +} diff --git a/packages/twenty-shared/src/types/ObjectRecordGroupBy.ts b/packages/twenty-shared/src/types/ObjectRecordGroupBy.ts new file mode 100644 index 0000000000..134ae25730 --- /dev/null +++ b/packages/twenty-shared/src/types/ObjectRecordGroupBy.ts @@ -0,0 +1,37 @@ +import { type ObjectRecord } from '@/types/ObjectRecord'; +import { type ObjectRecordGroupByDateGranularity } from '@/types/ObjectRecordGroupByDateGranularity'; + +export enum OrderByDirection { + AscNullsFirst = 'AscNullsFirst', + AscNullsLast = 'AscNullsLast', + DescNullsFirst = 'DescNullsFirst', + DescNullsLast = 'DescNullsLast', +} + +export type AggregateOrderByWithGroupByField = { + aggregate: { + [x: string]: OrderByDirection; + }; +}; + +export type ObjectRecordOrderByWithGroupByDateField = { + [Property in keyof ObjectRecord]?: { + orderBy: OrderByDirection; + granularity: ObjectRecordGroupByDateGranularity; + }; +}; + +export type OrderByWithGroupBy = Array< + | ObjectRecordOrderByForScalarField + | ObjectRecordOrderByForCompositeField + | ObjectRecordOrderByWithGroupByDateField + | AggregateOrderByWithGroupByField +>; + +export type ObjectRecordOrderByForScalarField = { + [Property in keyof ObjectRecord]?: OrderByDirection; +}; + +export type ObjectRecordOrderByForCompositeField = { + [Property in keyof ObjectRecord]?: Record; +}; diff --git a/packages/twenty-shared/src/types/index.ts b/packages/twenty-shared/src/types/index.ts index 15bde652d8..d4f4d1134f 100644 --- a/packages/twenty-shared/src/types/index.ts +++ b/packages/twenty-shared/src/types/index.ts @@ -34,6 +34,15 @@ export type { Nullable } from './Nullable'; export type { NullablePartial } from './NullablePartial'; export type { ObjectPermissions } from './ObjectPermissions'; export type { ObjectPermissionsDeprecated } from './ObjectPermissionsDeprecated'; +export type { ObjectRecord } from './ObjectRecord'; +export type { + AggregateOrderByWithGroupByField, + ObjectRecordOrderByWithGroupByDateField, + OrderByWithGroupBy, + ObjectRecordOrderByForScalarField, + ObjectRecordOrderByForCompositeField, +} from './ObjectRecordGroupBy'; +export { OrderByDirection } from './ObjectRecordGroupBy'; export { ObjectRecordGroupByDateGranularity } from './ObjectRecordGroupByDateGranularity'; export type { ObjectsPermissions } from './ObjectsPermissions'; export type { ObjectsPermissionsByRoleId } from './ObjectsPermissionsByRoleId';