From 7df4d1c10437104b05b906918bcfb81812b60a51 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 11:02:48 +0200 Subject: [PATCH 1/8] Remove filter from metadata api --- .../rest/services/rest-api-metadata.service.ts | 15 +++------------ .../core-modules/open-api/open-api.service.ts | 4 ---- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts b/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts index b16bc50f03ed..3790c2bfc8a9 100644 --- a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts +++ b/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts @@ -110,21 +110,12 @@ export class RestApiMetadataService { } } - generateFindManyQuery(objectNameSingular: string, objectNamePlural: string) { + generateFindManyQuery(objectNamePlural: string) { const fields = this.fetchMetadataFields(objectNamePlural); - let filterType = ''; - let filterValue = ''; - - if (objectNamePlural !== 'relations') { - filterType = `($filter: ${objectNameSingular}Filter)`; - filterValue = 'filter: $filter,'; - } - return ` - query FindMany${capitalize(objectNamePlural)}${filterType} { + query FindMany${capitalize(objectNamePlural)} { ${objectNamePlural}( - ${filterValue} paging: { first: 1000 } ) { edges { @@ -161,7 +152,7 @@ export class RestApiMetadataService { const query = id ? this.generateFindOneQuery(objectNameSingular, objectNamePlural) - : this.generateFindManyQuery(objectNameSingular, objectNamePlural); + : this.generateFindManyQuery(objectNamePlural); const data: Query = { query, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts index 7ca67df1a80a..680f34c726e2 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts @@ -133,10 +133,6 @@ export class OpenApiService { get: { tags: [item.namePlural], summary: `Find Many ${item.namePlural}`, - parameters: - item.namePlural !== 'relations' - ? [{ $ref: '#/components/parameters/filter' }] - : undefined, responses: { '200': getFindManyResponse200(item), '400': { $ref: '#/components/responses/400' }, From 00da24bc4a6d9975166df32727627cd4c08827fd Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 12:06:32 +0200 Subject: [PATCH 2/8] Add limit, before and after parameters --- .../input-factories/limit-input.factory.ts | 4 +-- .../src/engine/api/rest/rest-api.module.ts | 12 ++++++- .../services/rest-api-metadata.service.ts | 31 ++++++++++++++++--- .../api/rest/types/query-variables.type.ts | 5 +++ .../core-modules/open-api/open-api.service.ts | 9 ++++-- .../open-api/utils/components.utils.ts | 9 +++--- .../open-api/utils/parameters.utils.ts | 8 +++-- .../open-api/utils/responses.utils.ts | 9 ++++-- 8 files changed, 67 insertions(+), 20 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts b/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts index 26d958d3a390..d7ccaddc0904 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts @@ -4,9 +4,9 @@ import { Request } from 'express'; @Injectable() export class LimitInputFactory { - create(request: Request): number { + create(request: Request, defaultLimit = 60): number { if (!request.query.limit) { - return 60; + return defaultLimit; } const limit = +request.query.limit; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api.module.ts b/packages/twenty-server/src/engine/api/rest/rest-api.module.ts index 16141805d5e9..01343ee3a4b8 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api.module.ts +++ b/packages/twenty-server/src/engine/api/rest/rest-api.module.ts @@ -9,6 +9,9 @@ import { RestApiMetadataController } from 'src/engine/api/rest/controllers/rest- import { RestApiMetadataService } from 'src/engine/api/rest/services/rest-api-metadata.service'; import { RestApiCoreBatchController } from 'src/engine/api/rest/controllers/rest-api-core-batch.controller'; import { RestApiService } from 'src/engine/api/rest/services/rest-api.service'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; +import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; @Module({ imports: [CoreQueryBuilderModule, AuthModule, HttpModule], @@ -17,7 +20,14 @@ import { RestApiService } from 'src/engine/api/rest/services/rest-api.service'; RestApiCoreBatchController, RestApiCoreController, ], - providers: [RestApiMetadataService, RestApiCoreService, RestApiService], + providers: [ + RestApiMetadataService, + RestApiCoreService, + RestApiService, + StartingAfterInputFactory, + EndingBeforeInputFactory, + LimitInputFactory, + ], exports: [RestApiMetadataService], }) export class RestApiModule {} diff --git a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts b/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts index 3790c2bfc8a9..4442136ef8dc 100644 --- a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts +++ b/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts @@ -8,12 +8,18 @@ import { GraphqlApiType, RestApiService, } from 'src/engine/api/rest/services/rest-api.service'; +import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; @Injectable() export class RestApiMetadataService { constructor( private readonly tokenService: TokenService, private readonly restApiService: RestApiService, + private readonly startingAfterInputFactory: StartingAfterInputFactory, + private readonly endingBeforeInputFactory: EndingBeforeInputFactory, + private readonly limitInputFactory: LimitInputFactory, ) {} fetchMetadataFields(objectNamePlural: string) { @@ -114,15 +120,22 @@ export class RestApiMetadataService { const fields = this.fetchMetadataFields(objectNamePlural); return ` - query FindMany${capitalize(objectNamePlural)} { + query FindMany${capitalize(objectNamePlural)}( + $paging: CursorPaging! + ) { ${objectNamePlural}( - paging: { first: 1000 } + paging: $paging ) { edges { node { id ${fields} - } + } + } + pageInfo { + hasNextPage + startCursor + endCursor } } } @@ -144,6 +157,16 @@ export class RestApiMetadataService { `; } + generateFindManyVariables(request) { + return { + paging: { + first: this.limitInputFactory.create(request, 1000), + after: this.startingAfterInputFactory.create(request), + before: this.endingBeforeInputFactory.create(request), + }, + }; + } + async get(request) { await this.tokenService.validateToken(request); @@ -156,7 +179,7 @@ export class RestApiMetadataService { const data: Query = { query, - variables: id ? { id } : request.body, + variables: id ? { id } : this.generateFindManyVariables(request), }; return await this.restApiService.call( diff --git a/packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts index 6907aed8d5ec..7e02682358a7 100644 --- a/packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts +++ b/packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts @@ -7,4 +7,9 @@ export type QueryVariables = { startingAfter?: string; endingBefore?: string; input?: object; + paging?: { + first?: number; + after?: string; + before?: string; + }; }; diff --git a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts index 680f34c726e2..9b164d0fb714 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts @@ -133,8 +133,13 @@ export class OpenApiService { get: { tags: [item.namePlural], summary: `Find Many ${item.namePlural}`, + parameters: [ + { $ref: '#/components/parameters/limit' }, + { $ref: '#/components/parameters/startingAfter' }, + { $ref: '#/components/parameters/endingBefore' }, + ], responses: { - '200': getFindManyResponse200(item), + '200': getFindManyResponse200(item, true), '400': { $ref: '#/components/responses/400' }, '401': { $ref: '#/components/responses/401' }, }, @@ -193,7 +198,7 @@ export class OpenApiService { schema.components = { ...schema.components, // components.securitySchemes is defined in base Schema schemas: computeMetadataSchemaComponents(metadata), - parameters: computeParameterComponents(), + parameters: computeParameterComponents(true), responses: { '400': get400ErrorResponses(), '401': get401ErrorResponses(), diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts index cc459639b490..e8743fb65935 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts @@ -218,10 +218,9 @@ export const computeSchemaComponents = ( ); }; -export const computeParameterComponents = (): Record< - string, - OpenAPIV3_1.ParameterObject -> => { +export const computeParameterComponents = ( + fromMetadata = false, +): Record => { return { idPath: computeIdPathParameter(), startingAfter: computeStartingAfterParameters(), @@ -229,7 +228,7 @@ export const computeParameterComponents = (): Record< filter: computeFilterParameters(), depth: computeDepthParameters(), orderBy: computeOrderByParameters(), - limit: computeLimitParameters(), + limit: computeLimitParameters(fromMetadata), }; }; 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 b07c297e0d8e..7cb955c15c84 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 @@ -7,7 +7,9 @@ import { Conjunctions } from 'src/engine/api/rest/rest-api-core-query-builder/fa import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; import { DEFAULT_CONJUNCTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils'; -export const computeLimitParameters = (): OpenAPIV3_1.ParameterObject => { +export const computeLimitParameters = ( + fromMetadata = false, +): OpenAPIV3_1.ParameterObject => { return { name: 'limit', in: 'query', @@ -16,8 +18,8 @@ export const computeLimitParameters = (): OpenAPIV3_1.ParameterObject => { schema: { type: 'integer', minimum: 0, - maximum: 60, - default: 60, + maximum: fromMetadata ? 1000 : 60, + default: fromMetadata ? 1000 : 60, }, }; }; diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts index 7793a507f842..262683426e94 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts @@ -3,6 +3,7 @@ import { capitalize } from 'src/utils/capitalize'; export const getFindManyResponse200 = ( item: Pick, + fromMetadata = false, ) => { return { description: 'Successful operation', @@ -32,9 +33,11 @@ export const getFindManyResponse200 = ( endCursor: { type: 'string' }, }, }, - totalCount: { - type: 'integer', - }, + ...(!fromMetadata && { + totalCount: { + type: 'integer', + }, + }), }, example: { data: { From 5cd9dcb4f2bc3f14a285ecb014d7a35d3f6f819e Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 14:15:23 +0200 Subject: [PATCH 3/8] Use factory design for metadata rest api --- .../rest-api-core-batch.controller.ts | 2 +- .../controllers/rest-api-core.controller.ts | 2 +- .../core-query-builder.factory.ts | 28 +- .../core-query-builder.module.ts | 4 +- .../factories/create-many-query.factory.ts | 2 +- .../factories/create-one-query.factory.ts | 2 +- .../factories/create-variables.factory.ts | 2 +- .../factories/delete-query.factory.ts | 0 .../factories/delete-variables.factory.ts | 2 +- .../core/query-builder/factories/factories.ts | 25 ++ .../factories/find-many-query.factory.ts | 2 +- .../factories/find-one-query.factory.ts | 2 +- .../factories/get-variables.factory.ts | 12 +- .../factories/update-query.factory.ts | 2 +- .../factories/update-variables.factory.ts | 2 +- .../__tests__/check-fields.utils.spec.ts | 4 +- .../__tests__/compute-depth.utils.spec.ts | 2 +- .../__tests__/get-field-type.utils.spec.ts | 2 +- ...ld-metadata-to-graphql-query.utils.spec.ts | 2 +- .../utils/check-fields.utils.ts | 0 .../utils/check-order-by.utils.ts | 0 .../utils/compute-depth.utils.ts | 0 .../add-default-conjunction.utils.spec.ts | 2 +- .../check-filter-enum-values.spec.ts | 2 +- .../check-filter-query.utils.spec.ts | 2 +- .../format-field-values.utils.spec.ts | 2 +- .../__tests__/parse-base-filter.utils.spec.ts | 2 +- .../parse-filter-content.utils.spec.ts | 2 +- .../__tests__/parse-filter.utils.spec.ts | 2 +- .../add-default-conjunction.utils.ts | 2 +- .../filter-utils/check-filter-enum-values.ts | 0 .../filter-utils/check-filter-query.utils.ts | 0 .../filter-utils/format-field-values.utils.ts | 2 +- .../filter-utils/parse-base-filter.utils.ts | 0 .../parse-filter-content.utils.ts | 0 .../utils}/filter-utils/parse-filter.utils.ts | 14 +- .../utils/get-field-type.utils.ts | 0 ...p-field-metadata-to-graphql-query.utils.ts | 0 .../parse-core-batch-path.utils.spec.ts | 2 +- .../__tests__/parse-core-path.utils.spec.ts | 2 +- .../parse-core-batch-path.utils.ts | 0 .../path-parsers/parse-core-path.utils.ts | 0 .../rest-api-core.service.ts | 4 +- .../rest/{ => core}/types/field-value.type.ts | 0 .../{ => core}/types/query-variables.type.ts | 0 .../engine/api/rest/core/types/query.type.ts | 6 + .../ending-before-input.factory.spec.ts | 2 +- .../__tests__/filter-input.factory.spec.ts | 2 +- .../__tests__/limit-input.factory.spec.ts | 2 +- .../__tests__/order-by-input.factory.spec.ts | 2 +- .../starting-before-input.factory.spec.ts | 2 +- .../ending-before-input.factory.ts | 0 .../api/rest/input-factories/factories.ts | 13 + .../input-factories/filter-input.factory.ts | 8 +- .../input-factories/limit-input.factory.ts | 0 .../input-factories/order-by-input.factory.ts | 2 +- .../starting-after-input.factory.ts | 0 .../create-metadata-query.factory.ts | 22 ++ .../delete-metadata-query.factory.ts | 18 ++ .../find-many-metadata-query.factory.ts | 33 ++ .../find-one-metadata-query.factory.ts | 22 ++ .../get-metadata-variables.factory.ts | 31 ++ .../factories/metadata-factories.ts | 17 + .../update-metadata-query.factory.ts | 22 ++ .../metadata-query-builder.factory.ts | 95 ++++++ .../metadata-query-builder.module.ts | 12 + .../parse-metadata-path.utils.spec.ts | 2 +- .../utils/fetch-metadata-fields.utils.ts | 93 ++++++ .../utils}/parse-metadata-path.utils.ts | 0 .../rest-api-metadata.controller.ts | 2 +- .../metadata/rest-api-metadata.service.ts | 63 ++++ .../types/metadata-query-variables.type.ts | 9 + .../metadata/types/metadata-query.type.ts | 6 + .../core-query-builder.factory.spec.ts | 46 --- .../factories/factories.ts | 33 -- .../src/engine/api/rest/rest-api.module.ts | 28 +- .../rest/{services => }/rest-api.service.ts | 2 +- .../services/__tests__/core.service.spec.ts | 30 -- .../services/rest-api-metadata.service.ts | 304 ------------------ .../src/engine/api/rest/types/query.type.ts | 6 - .../utils/__tests__/parameters.utils.spec.ts | 8 +- .../open-api/utils/parameters.utils.ts | 8 +- 82 files changed, 582 insertions(+), 508 deletions(-) rename packages/twenty-server/src/engine/api/rest/{ => core}/controllers/rest-api-core-batch.controller.ts (86%) rename packages/twenty-server/src/engine/api/rest/{ => core}/controllers/rest-api-core.controller.ts (94%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/core-query-builder.factory.ts (76%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/core-query-builder.module.ts (64%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/create-many-query.factory.ts (92%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/create-one-query.factory.ts (91%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/create-variables.factory.ts (83%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/delete-query.factory.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/delete-variables.factory.ts (67%) create mode 100644 packages/twenty-server/src/engine/api/rest/core/query-builder/factories/factories.ts rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/find-many-query.factory.ts (94%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/find-one-query.factory.ts (91%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/get-variables.factory.ts (56%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/update-query.factory.ts (91%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/factories/update-variables.factory.ts (74%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/__tests__/check-fields.utils.spec.ts (81%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/__tests__/compute-depth.utils.spec.ts (84%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/__tests__/get-field-type.utils.spec.ts (78%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts (91%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/check-fields.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/check-order-by.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/compute-depth.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/add-default-conjunction.utils.spec.ts (81%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/check-filter-enum-values.spec.ts (84%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/check-filter-query.utils.spec.ts (86%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/format-field-values.utils.spec.ts (92%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/parse-base-filter.utils.spec.ts (90%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/parse-filter-content.utils.spec.ts (91%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/__tests__/parse-filter.utils.spec.ts (94%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/add-default-conjunction.utils.ts (67%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/check-filter-enum-values.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/check-filter-query.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/format-field-values.utils.ts (93%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/parse-base-filter.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/parse-filter-content.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories/input-factories => core/query-builder/utils}/filter-utils/parse-filter.utils.ts (65%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/get-field-type.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/map-field-metadata-to-graphql-query.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts (65%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts (86%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/path-parsers/parse-core-batch-path.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder => core/query-builder}/utils/path-parsers/parse-core-path.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{services => core}/rest-api-core.service.ts (88%) rename packages/twenty-server/src/engine/api/rest/{ => core}/types/field-value.type.ts (100%) rename packages/twenty-server/src/engine/api/rest/{ => core}/types/query-variables.type.ts (100%) create mode 100644 packages/twenty-server/src/engine/api/rest/core/types/query.type.ts rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/__tests__/ending-before-input.factory.spec.ts (85%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/__tests__/filter-input.factory.spec.ts (96%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/__tests__/limit-input.factory.spec.ts (90%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/__tests__/order-by-input.factory.spec.ts (96%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/__tests__/starting-before-input.factory.spec.ts (85%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/ending-before-input.factory.ts (100%) create mode 100644 packages/twenty-server/src/engine/api/rest/input-factories/factories.ts rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/filter-input.factory.ts (54%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/limit-input.factory.ts (100%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/order-by-input.factory.ts (95%) rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/factories => }/input-factories/starting-after-input.factory.ts (100%) create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/metadata-factories.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.module.ts rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/utils/path-parsers => metadata/query-builder/utils}/__tests__/parse-metadata-path.utils.spec.ts (90%) create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts rename packages/twenty-server/src/engine/api/rest/{rest-api-core-query-builder/utils/path-parsers => metadata/query-builder/utils}/parse-metadata-path.utils.ts (100%) rename packages/twenty-server/src/engine/api/rest/{controllers => metadata}/rest-api-metadata.controller.ts (94%) create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.service.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts create mode 100644 packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query.type.ts delete mode 100644 packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/__tests__/core-query-builder.factory.spec.ts delete mode 100644 packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/factories.ts rename packages/twenty-server/src/engine/api/rest/{services => }/rest-api.service.ts (95%) delete mode 100644 packages/twenty-server/src/engine/api/rest/services/__tests__/core.service.spec.ts delete mode 100644 packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts delete mode 100644 packages/twenty-server/src/engine/api/rest/types/query.type.ts diff --git a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-core-batch.controller.ts b/packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core-batch.controller.ts similarity index 86% rename from packages/twenty-server/src/engine/api/rest/controllers/rest-api-core-batch.controller.ts rename to packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core-batch.controller.ts index 6f35ed834d29..e77ae4c8912f 100644 --- a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-core-batch.controller.ts +++ b/packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core-batch.controller.ts @@ -2,7 +2,7 @@ import { Controller, Post, Req, Res } from '@nestjs/common'; import { Request, Response } from 'express'; -import { RestApiCoreService } from 'src/engine/api/rest/services/rest-api-core.service'; +import { RestApiCoreService } from 'src/engine/api/rest/core/rest-api-core.service'; import { cleanGraphQLResponse } from 'src/engine/api/rest/utils/clean-graphql-response.utils'; @Controller('rest/batch/*') diff --git a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-core.controller.ts b/packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core.controller.ts similarity index 94% rename from packages/twenty-server/src/engine/api/rest/controllers/rest-api-core.controller.ts rename to packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core.controller.ts index fe2dfacaeaf0..5fd46c49a269 100644 --- a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-core.controller.ts +++ b/packages/twenty-server/src/engine/api/rest/core/controllers/rest-api-core.controller.ts @@ -11,7 +11,7 @@ import { import { Request, Response } from 'express'; -import { RestApiCoreService } from 'src/engine/api/rest/services/rest-api-core.service'; +import { RestApiCoreService } from 'src/engine/api/rest/core/rest-api-core.service'; import { cleanGraphQLResponse } from 'src/engine/api/rest/utils/clean-graphql-response.utils'; @Controller('rest/*') diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts similarity index 76% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts index d7f0d6d185da..bd2bda31d9cf 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts @@ -2,24 +2,24 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { DeleteQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-query.factory'; +import { DeleteQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/delete-query.factory'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { TokenService } from 'src/engine/core-modules/auth/services/token.service'; -import { CreateOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory'; -import { UpdateQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory'; -import { FindOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory'; -import { FindManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory'; -import { DeleteVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory'; -import { CreateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory'; -import { UpdateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory'; -import { GetVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory'; -import { parseCorePath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-path.utils'; -import { computeDepth } from 'src/engine/api/rest/rest-api-core-query-builder/utils/compute-depth.utils'; +import { CreateOneQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-one-query.factory'; +import { UpdateQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/update-query.factory'; +import { FindOneQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-one-query.factory'; +import { FindManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-many-query.factory'; +import { DeleteVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/delete-variables.factory'; +import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory'; +import { UpdateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/update-variables.factory'; +import { GetVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/get-variables.factory'; +import { parseCorePath } from 'src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-path.utils'; +import { computeDepth } from 'src/engine/api/rest/core/query-builder/utils/compute-depth.utils'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { Query } from 'src/engine/api/rest/types/query.type'; +import { Query } from 'src/engine/api/rest/core/types/query.type'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; -import { CreateManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory'; -import { parseCoreBatchPath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-batch-path.utils'; +import { CreateManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-many-query.factory'; +import { parseCoreBatchPath } from 'src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-batch-path.utils'; @Injectable() export class CoreQueryBuilderFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.module.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts similarity index 64% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.module.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts index 8e91f11742d4..38b5ec398c34 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/core-query-builder.module.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; -import { CoreQueryBuilderFactory } from 'src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory'; -import { coreQueryBuilderFactories } from 'src/engine/api/rest/rest-api-core-query-builder/factories/factories'; +import { CoreQueryBuilderFactory } from 'src/engine/api/rest/core/query-builder/core-query-builder.factory'; +import { coreQueryBuilderFactories } from 'src/engine/api/rest/core/query-builder/factories/factories'; import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module'; import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-many-query.factory.ts similarity index 92% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-many-query.factory.ts index 02c8714f44e6..b02bf194bbcc 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-many-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { capitalize } from 'src/utils/capitalize'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; @Injectable() export class CreateManyQueryFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-one-query.factory.ts similarity index 91% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-one-query.factory.ts index a7135605eb41..e8078898935d 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-one-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { capitalize } from 'src/utils/capitalize'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; @Injectable() export class CreateOneQueryFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-variables.factory.ts similarity index 83% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-variables.factory.ts index eb4b20ef1c85..02bc3f9d6acd 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/create-variables.factory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { QueryVariables } from 'src/engine/api/rest/types/query-variables.type'; +import { QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type'; @Injectable() export class CreateVariablesFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/delete-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/delete-query.factory.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/delete-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/delete-query.factory.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/delete-variables.factory.ts similarity index 67% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/delete-variables.factory.ts index c41c2073c2df..a1a5a40bd221 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/delete-variables.factory.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { QueryVariables } from 'src/engine/api/rest/types/query-variables.type'; +import { QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type'; @Injectable() export class DeleteVariablesFactory { diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/factories.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/factories.ts new file mode 100644 index 000000000000..00faf41ca5e9 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/factories.ts @@ -0,0 +1,25 @@ +import { DeleteQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/delete-query.factory'; +import { CreateOneQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-one-query.factory'; +import { UpdateQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/update-query.factory'; +import { FindOneQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-one-query.factory'; +import { FindManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-many-query.factory'; +import { DeleteVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/delete-variables.factory'; +import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory'; +import { UpdateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/update-variables.factory'; +import { GetVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/get-variables.factory'; +import { CreateManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-many-query.factory'; +import { inputFactories } from 'src/engine/api/rest/input-factories/factories'; + +export const coreQueryBuilderFactories = [ + DeleteQueryFactory, + CreateOneQueryFactory, + CreateManyQueryFactory, + UpdateQueryFactory, + FindOneQueryFactory, + FindManyQueryFactory, + DeleteVariablesFactory, + CreateVariablesFactory, + UpdateVariablesFactory, + GetVariablesFactory, + ...inputFactories, +]; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts similarity index 94% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts index 4f3cb7c72dfc..8bdfed1abb06 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { capitalize } from 'src/utils/capitalize'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; @Injectable() export class FindManyQueryFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-one-query.factory.ts similarity index 91% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-one-query.factory.ts index 9286080be123..cc2b498710bc 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-one-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { capitalize } from 'src/utils/capitalize'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; @Injectable() export class FindOneQueryFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts similarity index 56% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts index 8703e67f7f2f..5863f306488a 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts @@ -2,12 +2,12 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; -import { OrderByInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; -import { FilterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory'; -import { QueryVariables } from 'src/engine/api/rest/types/query-variables.type'; -import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; -import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; +import { LimitInputFactory } from 'src/engine/api/rest/input-factories/limit-input.factory'; +import { OrderByInputFactory } from 'src/engine/api/rest/input-factories/order-by-input.factory'; +import { FilterInputFactory } from 'src/engine/api/rest/input-factories/filter-input.factory'; +import { QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/input-factories/ending-before-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/input-factories/starting-after-input.factory'; @Injectable() export class GetVariablesFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-query.factory.ts similarity index 91% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-query.factory.ts index ca7e9cd03d3d..f578b2d18e49 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { capitalize } from 'src/utils/capitalize'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; @Injectable() export class UpdateQueryFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-variables.factory.ts similarity index 74% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-variables.factory.ts index 588288bf92d1..c911faa03a0b 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/update-variables.factory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { QueryVariables } from 'src/engine/api/rest/types/query-variables.type'; +import { QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type'; @Injectable() export class UpdateVariablesFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/check-fields.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/check-fields.utils.spec.ts similarity index 81% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/check-fields.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/check-fields.utils.spec.ts index 4dbbfdde09b8..865eac4bc2b8 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/check-fields.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/check-fields.utils.spec.ts @@ -1,6 +1,6 @@ import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock'; -import { checkFields } from 'src/engine/api/rest/rest-api-core-query-builder/utils/check-fields.utils'; -import { checkArrayFields } from 'src/engine/api/rest/rest-api-core-query-builder/utils/check-order-by.utils'; +import { checkFields } from 'src/engine/api/rest/core/query-builder/utils/check-fields.utils'; +import { checkArrayFields } from 'src/engine/api/rest/core/query-builder/utils/check-order-by.utils'; describe('checkFields', () => { it('should check field types', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/compute-depth.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/compute-depth.utils.spec.ts similarity index 84% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/compute-depth.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/compute-depth.utils.spec.ts index a6909574a6cc..cf68056a3b17 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/compute-depth.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/compute-depth.utils.spec.ts @@ -1,4 +1,4 @@ -import { computeDepth } from 'src/engine/api/rest/rest-api-core-query-builder/utils/compute-depth.utils'; +import { computeDepth } from 'src/engine/api/rest/core/query-builder/utils/compute-depth.utils'; describe('computeDepth', () => { it('should compute depth from query', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/get-field-type.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/get-field-type.utils.spec.ts similarity index 78% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/get-field-type.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/get-field-type.utils.spec.ts index 6c09709c205f..ec6854bc482f 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/get-field-type.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/get-field-type.utils.spec.ts @@ -1,6 +1,6 @@ import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { getFieldType } from 'src/engine/api/rest/rest-api-core-query-builder/utils/get-field-type.utils'; +import { getFieldType } from 'src/engine/api/rest/core/query-builder/utils/get-field-type.utils'; describe('getFieldType', () => { it('should get field type', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts similarity index 91% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts index 76dbe1b732ff..b06c26ec36d4 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts @@ -5,7 +5,7 @@ import { fieldTextMock, objectMetadataItemMock, } from 'src/engine/api/__mocks__/object-metadata-item.mock'; -import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils'; +import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils'; describe('mapFieldMetadataToGraphqlQuery', () => { it('should map properly', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/check-fields.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/check-fields.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/check-fields.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/check-fields.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/check-order-by.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/check-order-by.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/check-order-by.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/check-order-by.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/compute-depth.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/compute-depth.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/compute-depth.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/compute-depth.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/add-default-conjunction.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/add-default-conjunction.utils.spec.ts similarity index 81% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/add-default-conjunction.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/add-default-conjunction.utils.spec.ts index 8adda483599e..1b949c855194 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/add-default-conjunction.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/add-default-conjunction.utils.spec.ts @@ -1,4 +1,4 @@ -import { addDefaultConjunctionIfMissing } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils'; +import { addDefaultConjunctionIfMissing } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils'; describe('addDefaultConjunctionIfMissing', () => { it('should add default conjunction if missing', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-enum-values.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-enum-values.spec.ts similarity index 84% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-enum-values.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-enum-values.spec.ts index 4e4694c11019..8c24bce85846 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-enum-values.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-enum-values.spec.ts @@ -1,4 +1,4 @@ -import { checkFilterEnumValues } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-enum-values'; +import { checkFilterEnumValues } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-enum-values'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { fieldSelectMock, diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-query.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-query.utils.spec.ts similarity index 86% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-query.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-query.utils.spec.ts index fc1f3e81870b..7cba92df6d0e 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/check-filter-query.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/check-filter-query.utils.spec.ts @@ -1,4 +1,4 @@ -import { checkFilterQuery } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-query.utils'; +import { checkFilterQuery } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-query.utils'; describe('checkFilterQuery', () => { it('should check filter query', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/format-field-values.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/format-field-values.utils.spec.ts similarity index 92% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/format-field-values.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/format-field-values.utils.spec.ts index eb94f88b310d..6787ccc3eec8 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/format-field-values.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/format-field-values.utils.spec.ts @@ -1,5 +1,5 @@ import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { formatFieldValue } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/format-field-values.utils'; +import { formatFieldValue } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/format-field-values.utils'; describe('formatFieldValue', () => { it('should format fieldNumber value', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-base-filter.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-base-filter.utils.spec.ts similarity index 90% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-base-filter.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-base-filter.utils.spec.ts index c522b00bde8d..dc41296b7ac7 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-base-filter.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-base-filter.utils.spec.ts @@ -1,4 +1,4 @@ -import { parseBaseFilter } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils'; +import { parseBaseFilter } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils'; describe('parseBaseFilter', () => { it('should parse simple filter string test 1', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter-content.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter-content.utils.spec.ts similarity index 91% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter-content.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter-content.utils.spec.ts index ed0efea1c25b..884c672395d8 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter-content.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter-content.utils.spec.ts @@ -1,4 +1,4 @@ -import { parseFilterContent } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter-content.utils'; +import { parseFilterContent } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter-content.utils'; describe('parseFilterContent', () => { it('should parse query filter test 1', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter.utils.spec.ts similarity index 94% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter.utils.spec.ts index 3dfdd2b75b89..b92b09c96b31 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/__tests__/parse-filter.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/__tests__/parse-filter.utils.spec.ts @@ -1,5 +1,5 @@ import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock'; -import { parseFilter } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils'; +import { parseFilter } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils'; describe('parseFilter', () => { it('should parse string filter test 1', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils.ts similarity index 67% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils.ts index 03f66456e802..f30bf375d2e9 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils.ts @@ -1,4 +1,4 @@ -import { Conjunctions } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils'; +import { Conjunctions } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils'; export const DEFAULT_CONJUNCTION = Conjunctions.and; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-enum-values.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-enum-values.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-enum-values.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-enum-values.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-query.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-query.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-query.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-query.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/format-field-values.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/format-field-values.utils.ts similarity index 93% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/format-field-values.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/format-field-values.utils.ts index eeab31d6745e..79e351f94136 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/format-field-values.utils.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/format-field-values.utils.ts @@ -1,7 +1,7 @@ import { BadRequestException } from '@nestjs/common'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { FieldValue } from 'src/engine/api/rest/types/field-value.type'; +import { FieldValue } from 'src/engine/api/rest/core/types/field-value.type'; export const formatFieldValue = ( value: string, diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter-content.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter-content.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter-content.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter-content.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils.ts similarity index 65% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils.ts index ac8307d873c3..0f8a043b3bf6 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils.ts @@ -2,13 +2,13 @@ import { BadRequestException } from '@nestjs/common'; import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface'; -import { parseFilterContent } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter-content.utils'; -import { parseBaseFilter } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils'; -import { checkFields } from 'src/engine/api/rest/rest-api-core-query-builder/utils/check-fields.utils'; -import { formatFieldValue } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/format-field-values.utils'; -import { FieldValue } from 'src/engine/api/rest/types/field-value.type'; -import { checkFilterEnumValues } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-enum-values'; -import { getFieldType } from 'src/engine/api/rest/rest-api-core-query-builder/utils/get-field-type.utils'; +import { parseFilterContent } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter-content.utils'; +import { parseBaseFilter } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils'; +import { checkFields } from 'src/engine/api/rest/core/query-builder/utils/check-fields.utils'; +import { formatFieldValue } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/format-field-values.utils'; +import { FieldValue } from 'src/engine/api/rest/core/types/field-value.type'; +import { checkFilterEnumValues } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-enum-values'; +import { getFieldType } from 'src/engine/api/rest/core/query-builder/utils/get-field-type.utils'; export enum Conjunctions { or = 'or', diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/get-field-type.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/get-field-type.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/get-field-type.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/get-field-type.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/map-field-metadata-to-graphql-query.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts similarity index 65% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts index 04131521108f..a66400eecb00 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-batch-path.utils.spec.ts @@ -1,4 +1,4 @@ -import { parseCoreBatchPath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-batch-path.utils'; +import { parseCoreBatchPath } from 'src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-batch-path.utils'; describe('parseCoreBatchPath', () => { it('should parse object from request path', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts similarity index 86% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts index 0d20d453afc4..c5c9434160aa 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/__tests__/parse-core-path.utils.spec.ts @@ -1,4 +1,4 @@ -import { parseCorePath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-path.utils'; +import { parseCorePath } from 'src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-path.utils'; describe('parseCorePath', () => { it('should parse object from request path', () => { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-batch-path.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-batch-path.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-batch-path.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-batch-path.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-path.utils.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-path.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-core-path.utils.ts rename to packages/twenty-server/src/engine/api/rest/core/query-builder/utils/path-parsers/parse-core-path.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/services/rest-api-core.service.ts b/packages/twenty-server/src/engine/api/rest/core/rest-api-core.service.ts similarity index 88% rename from packages/twenty-server/src/engine/api/rest/services/rest-api-core.service.ts rename to packages/twenty-server/src/engine/api/rest/core/rest-api-core.service.ts index 126c64e6a352..3b56c76e5148 100644 --- a/packages/twenty-server/src/engine/api/rest/services/rest-api-core.service.ts +++ b/packages/twenty-server/src/engine/api/rest/core/rest-api-core.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { CoreQueryBuilderFactory } from 'src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory'; +import { CoreQueryBuilderFactory } from 'src/engine/api/rest/core/query-builder/core-query-builder.factory'; import { GraphqlApiType, RestApiService, -} from 'src/engine/api/rest/services/rest-api.service'; +} from 'src/engine/api/rest/rest-api.service'; @Injectable() export class RestApiCoreService { diff --git a/packages/twenty-server/src/engine/api/rest/types/field-value.type.ts b/packages/twenty-server/src/engine/api/rest/core/types/field-value.type.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/types/field-value.type.ts rename to packages/twenty-server/src/engine/api/rest/core/types/field-value.type.ts diff --git a/packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/types/query-variables.type.ts rename to packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts diff --git a/packages/twenty-server/src/engine/api/rest/core/types/query.type.ts b/packages/twenty-server/src/engine/api/rest/core/types/query.type.ts new file mode 100644 index 000000000000..92a9cf27ce53 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/core/types/query.type.ts @@ -0,0 +1,6 @@ +import { QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type'; + +export type Query = { + query: string; + variables: QueryVariables; +}; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/ending-before-input.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/ending-before-input.factory.spec.ts similarity index 85% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/ending-before-input.factory.spec.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/__tests__/ending-before-input.factory.spec.ts index 2de86ff7f382..9bef0dbfdc98 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/ending-before-input.factory.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/ending-before-input.factory.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/input-factories/ending-before-input.factory'; describe('EndingBeforeInputFactory', () => { let service: EndingBeforeInputFactory; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/filter-input.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/filter-input.factory.spec.ts similarity index 96% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/filter-input.factory.spec.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/__tests__/filter-input.factory.spec.ts index 12dd66750025..b6366ff7034d 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/filter-input.factory.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/filter-input.factory.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock'; -import { FilterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory'; +import { FilterInputFactory } from 'src/engine/api/rest/input-factories/filter-input.factory'; describe('FilterInputFactory', () => { const objectMetadata = { objectMetadataItem: objectMetadataItemMock }; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/limit-input.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/limit-input.factory.spec.ts similarity index 90% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/limit-input.factory.spec.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/__tests__/limit-input.factory.spec.ts index 16ed18507a0f..2104250f1cda 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/limit-input.factory.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/limit-input.factory.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; +import { LimitInputFactory } from 'src/engine/api/rest/input-factories/limit-input.factory'; describe('LimitInputFactory', () => { let service: LimitInputFactory; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/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 similarity index 96% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/order-by-input.factory.spec.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/__tests__/order-by-input.factory.spec.ts index d7ee7c1e8e1d..63b3179ee68d 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/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 @@ -3,7 +3,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock'; -import { OrderByInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; +import { OrderByInputFactory } from 'src/engine/api/rest/input-factories/order-by-input.factory'; describe('OrderByInputFactory', () => { const objectMetadata = { objectMetadataItem: objectMetadataItemMock }; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/starting-before-input.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/starting-before-input.factory.spec.ts similarity index 85% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/starting-before-input.factory.spec.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/__tests__/starting-before-input.factory.spec.ts index 484cd8da636e..814739584210 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/__tests__/starting-before-input.factory.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/__tests__/starting-before-input.factory.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/input-factories/starting-after-input.factory'; describe('StartingAfterInputFactory', () => { let service: StartingAfterInputFactory; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/ending-before-input.factory.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/ending-before-input.factory.ts diff --git a/packages/twenty-server/src/engine/api/rest/input-factories/factories.ts b/packages/twenty-server/src/engine/api/rest/input-factories/factories.ts new file mode 100644 index 000000000000..bbe17eeca1ba --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/input-factories/factories.ts @@ -0,0 +1,13 @@ +import { StartingAfterInputFactory } from 'src/engine/api/rest/input-factories/starting-after-input.factory'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/input-factories/ending-before-input.factory'; +import { LimitInputFactory } from 'src/engine/api/rest/input-factories/limit-input.factory'; +import { OrderByInputFactory } from 'src/engine/api/rest/input-factories/order-by-input.factory'; +import { FilterInputFactory } from 'src/engine/api/rest/input-factories/filter-input.factory'; + +export const inputFactories = [ + StartingAfterInputFactory, + EndingBeforeInputFactory, + LimitInputFactory, + OrderByInputFactory, + FilterInputFactory, +]; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/filter-input.factory.ts similarity index 54% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/filter-input.factory.ts index 1041212dfbbb..93ed93d51eb4 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/filter-input.factory.ts @@ -2,10 +2,10 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { addDefaultConjunctionIfMissing } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils'; -import { checkFilterQuery } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/check-filter-query.utils'; -import { parseFilter } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils'; -import { FieldValue } from 'src/engine/api/rest/types/field-value.type'; +import { addDefaultConjunctionIfMissing } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils'; +import { checkFilterQuery } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-query.utils'; +import { parseFilter } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils'; +import { FieldValue } from 'src/engine/api/rest/core/types/field-value.type'; @Injectable() export class FilterInputFactory { diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/limit-input.factory.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/limit-input.factory.ts diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts similarity index 95% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts index de073693ccc0..832de44c52f9 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/input-factories/order-by-input.factory.ts @@ -7,7 +7,7 @@ import { RecordOrderBy, } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; -import { checkArrayFields } from 'src/engine/api/rest/rest-api-core-query-builder/utils/check-order-by.utils'; +import { checkArrayFields } from 'src/engine/api/rest/core/query-builder/utils/check-order-by.utils'; export const DEFAULT_ORDER_DIRECTION = OrderByDirection.AscNullsFirst; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory.ts b/packages/twenty-server/src/engine/api/rest/input-factories/starting-after-input.factory.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory.ts rename to packages/twenty-server/src/engine/api/rest/input-factories/starting-after-input.factory.ts diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts new file mode 100644 index 000000000000..d257604f483e --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; + +import { capitalize } from 'src/utils/capitalize'; +import { fetchMetadataFields } from 'src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils'; + +@Injectable() +export class CreateMetadataQueryFactory { + create(objectNameSingular: string, objectNamePlural: string): string { + const objectNameCapitalized = capitalize(objectNameSingular); + + const fields = fetchMetadataFields(objectNamePlural); + + return ` + mutation Create${objectNameCapitalized}($input: CreateOne${objectNameCapitalized}Input!) { + createOne${objectNameCapitalized}(input: $input) { + id + ${fields} + } + } + `; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts new file mode 100644 index 000000000000..c1e09b05bdf9 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; + +import { capitalize } from 'src/utils/capitalize'; + +@Injectable() +export class DeleteMetadataQueryFactory { + create(objectNameSingular: string): string { + const objectNameCapitalized = capitalize(objectNameSingular); + + return ` + mutation Delete${objectNameCapitalized}($input: DeleteOne${objectNameCapitalized}Input!) { + deleteOne${objectNameCapitalized}(input: $input) { + id + } + } + `; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory.ts new file mode 100644 index 000000000000..7434b2eb30b7 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; + +import { capitalize } from 'src/utils/capitalize'; +import { fetchMetadataFields } from 'src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils'; + +@Injectable() +export class FindManyMetadataQueryFactory { + create(objectNamePlural): string { + const fields = fetchMetadataFields(objectNamePlural); + + return ` + query FindMany${capitalize(objectNamePlural)}( + $paging: CursorPaging! + ) { + ${objectNamePlural}( + paging: $paging + ) { + edges { + node { + id + ${fields} + } + } + pageInfo { + hasNextPage + startCursor + endCursor + } + } + } + `; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory.ts new file mode 100644 index 000000000000..98078a29efa4 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; + +import { capitalize } from 'src/utils/capitalize'; +import { fetchMetadataFields } from 'src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils'; + +@Injectable() +export class FindOneMetadataQueryFactory { + create(objectNameSingular: string, objectNamePlural: string): string { + const fields = fetchMetadataFields(objectNamePlural); + + return ` + query FindOne${capitalize(objectNameSingular)}( + $id: UUID!, + ) { + ${objectNameSingular}(id: $id) { + id + ${fields} + } + } + `; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts new file mode 100644 index 000000000000..b8721e25194c --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@nestjs/common'; + +import { Request } from 'express'; + +import { LimitInputFactory } from 'src/engine/api/rest/input-factories/limit-input.factory'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/input-factories/ending-before-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/input-factories/starting-after-input.factory'; +import { MetadataQueryVariables } from 'src/engine/api/rest/metadata/types/metadata-query-variables.type'; + +@Injectable() +export class GetMetadataVariablesFactory { + constructor( + private readonly startingAfterInputFactory: StartingAfterInputFactory, + private readonly endingBeforeInputFactory: EndingBeforeInputFactory, + private readonly limitInputFactory: LimitInputFactory, + ) {} + + create(id: string | undefined, request: Request): MetadataQueryVariables { + if (id) { + return { id }; + } + + return { + paging: { + first: this.limitInputFactory.create(request, 1000), + after: this.startingAfterInputFactory.create(request), + before: this.endingBeforeInputFactory.create(request), + }, + }; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/metadata-factories.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/metadata-factories.ts new file mode 100644 index 000000000000..f8a7f485561c --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/metadata-factories.ts @@ -0,0 +1,17 @@ +import { FindOneMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory'; +import { FindManyMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory'; +import { GetMetadataVariablesFactory } from 'src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory'; +import { inputFactories } from 'src/engine/api/rest/input-factories/factories'; +import { CreateMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory'; +import { UpdateMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory'; +import { DeleteMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory'; + +export const metadataQueryBuilderFactories = [ + FindOneMetadataQueryFactory, + FindManyMetadataQueryFactory, + CreateMetadataQueryFactory, + DeleteMetadataQueryFactory, + UpdateMetadataQueryFactory, + GetMetadataVariablesFactory, + ...inputFactories, +]; diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts new file mode 100644 index 000000000000..8be23818e778 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; + +import { capitalize } from 'src/utils/capitalize'; +import { fetchMetadataFields } from 'src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils'; + +@Injectable() +export class UpdateMetadataQueryFactory { + create(objectNameSingular: string, objectNamePlural: string): string { + const objectNameCapitalized = capitalize(objectNameSingular); + + const fields = fetchMetadataFields(objectNamePlural); + + return ` + mutation Update${objectNameCapitalized}($input: UpdateOne${objectNameCapitalized}Input!) { + updateOne${objectNameCapitalized}(input: $input) { + id + ${fields} + } + } + `; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory.ts new file mode 100644 index 000000000000..ce9b38ce8265 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory.ts @@ -0,0 +1,95 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; + +import { Request } from 'express'; + +import { GetMetadataVariablesFactory } from 'src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory'; +import { FindOneMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/find-one-metadata-query.factory'; +import { FindManyMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/find-many-metadata-query.factory'; +import { parseMetadataPath } from 'src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils'; +import { CreateMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory'; +import { UpdateMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory'; +import { DeleteMetadataQueryFactory } from 'src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory'; +import { MetadataQuery } from 'src/engine/api/rest/metadata/types/metadata-query.type'; + +@Injectable() +export class MetadataQueryBuilderFactory { + constructor( + private readonly findOneQueryFactory: FindOneMetadataQueryFactory, + private readonly findManyQueryFactory: FindManyMetadataQueryFactory, + private readonly createQueryFactory: CreateMetadataQueryFactory, + private readonly updateQueryFactory: UpdateMetadataQueryFactory, + private readonly deleteQueryFactory: DeleteMetadataQueryFactory, + private readonly getMetadataVariablesFactory: GetMetadataVariablesFactory, + ) {} + + async get(request: Request): Promise { + const { id, objectNameSingular, objectNamePlural } = + parseMetadataPath(request); + + return { + query: id + ? this.findOneQueryFactory.create(objectNameSingular, objectNamePlural) + : this.findManyQueryFactory.create(objectNamePlural), + variables: this.getMetadataVariablesFactory.create(id, request), + }; + } + + async create(request: Request): Promise { + const { objectNameSingular, objectNamePlural } = parseMetadataPath(request); + + return { + query: this.createQueryFactory.create( + objectNameSingular, + objectNamePlural, + ), + variables: { + input: { + [objectNameSingular]: request.body, + }, + }, + }; + } + + async update(request: Request): Promise { + const { objectNameSingular, objectNamePlural, id } = + parseMetadataPath(request); + + if (!id) { + throw new BadRequestException( + `update ${objectNameSingular} query invalid. Id missing. eg: /rest/metadata/${objectNameSingular}/0d4389ef-ea9c-4ae8-ada1-1cddc440fb56`, + ); + } + + return { + query: this.updateQueryFactory.create( + objectNameSingular, + objectNamePlural, + ), + variables: { + input: { + update: request.body, + id, + }, + }, + }; + } + + async delete(request: Request): Promise { + const { objectNameSingular, id } = parseMetadataPath(request); + + if (!id) { + throw new BadRequestException( + `delete ${objectNameSingular} query invalid. Id missing. eg: /rest/metadata/${objectNameSingular}/0d4389ef-ea9c-4ae8-ada1-1cddc440fb56`, + ); + } + + return { + query: this.deleteQueryFactory.create(objectNameSingular), + variables: { + input: { + id, + }, + }, + }; + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.module.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.module.ts new file mode 100644 index 000000000000..82bf0fb5674e --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/metadata-query-builder.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; +import { MetadataQueryBuilderFactory } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory'; +import { metadataQueryBuilderFactories } from 'src/engine/api/rest/metadata/query-builder/factories/metadata-factories'; + +@Module({ + imports: [AuthModule], + providers: [...metadataQueryBuilderFactories, MetadataQueryBuilderFactory], + exports: [MetadataQueryBuilderFactory], +}) +export class MetadataQueryBuilderModule {} diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-metadata-path.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/__tests__/parse-metadata-path.utils.spec.ts similarity index 90% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-metadata-path.utils.spec.ts rename to packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/__tests__/parse-metadata-path.utils.spec.ts index 28b1238c2468..ec6284da777d 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/__tests__/parse-metadata-path.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/__tests__/parse-metadata-path.utils.spec.ts @@ -1,4 +1,4 @@ -import { parseMetadataPath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-metadata-path.utils'; +import { parseMetadataPath } from 'src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils'; describe('parseMetadataPath', () => { it('should parse object from request path with uuid', () => { diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts new file mode 100644 index 000000000000..61899096d206 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts @@ -0,0 +1,93 @@ +export const fetchMetadataFields = (objectNamePlural: string) => { + const fields = ` + type + name + label + description + icon + isCustom + isActive + isSystem + isNullable + createdAt + updatedAt + fromRelationMetadata { + id + relationType + toObjectMetadata { + id + dataSourceId + nameSingular + namePlural + isSystem + } + toFieldMetadataId + } + toRelationMetadata { + id + relationType + fromObjectMetadata { + id + dataSourceId + nameSingular + namePlural + isSystem + } + fromFieldMetadataId + } + defaultValue + options + `; + + switch (objectNamePlural) { + case 'objects': + return ` + dataSourceId + nameSingular + namePlural + labelSingular + labelPlural + description + icon + isCustom + isActive + isSystem + createdAt + updatedAt + labelIdentifierFieldMetadataId + imageIdentifierFieldMetadataId + fields(paging: { first: 1000 }) { + edges { + node { + id + ${fields} + } + } + } + `; + case 'fields': + return fields; + case 'relations': + return ` + relationType + fromObjectMetadata { + id + dataSourceId + nameSingular + namePlural + isSystem + } + fromObjectMetadataId + toObjectMetadata { + id + dataSourceId + nameSingular + namePlural + isSystem + } + toObjectMetadataId + fromFieldMetadataId + toFieldMetadataId + `; + } +}; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-metadata-path.utils.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts similarity index 100% rename from packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-metadata-path.utils.ts rename to packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts diff --git a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-metadata.controller.ts b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts similarity index 94% rename from packages/twenty-server/src/engine/api/rest/controllers/rest-api-metadata.controller.ts rename to packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts index fc44d8bc96e5..fc0154081f51 100644 --- a/packages/twenty-server/src/engine/api/rest/controllers/rest-api-metadata.controller.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts @@ -11,7 +11,7 @@ import { import { Request, Response } from 'express'; -import { RestApiMetadataService } from 'src/engine/api/rest/services/rest-api-metadata.service'; +import { RestApiMetadataService } from 'src/engine/api/rest/metadata/rest-api-metadata.service'; import { cleanGraphQLResponse } from 'src/engine/api/rest/utils/clean-graphql-response.utils'; @Controller('rest/metadata/*') diff --git a/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.service.ts b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.service.ts new file mode 100644 index 000000000000..afd0e59efd77 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@nestjs/common'; + +import { Request } from 'express'; + +import { TokenService } from 'src/engine/core-modules/auth/services/token.service'; +import { + GraphqlApiType, + RestApiService, +} from 'src/engine/api/rest/rest-api.service'; +import { MetadataQueryBuilderFactory } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory'; + +@Injectable() +export class RestApiMetadataService { + constructor( + private readonly tokenService: TokenService, + private readonly metadataQueryBuilderFactory: MetadataQueryBuilderFactory, + private readonly restApiService: RestApiService, + ) {} + + async get(request: Request) { + await this.tokenService.validateToken(request); + const data = await this.metadataQueryBuilderFactory.get(request); + + return await this.restApiService.call( + GraphqlApiType.METADATA, + request, + data, + ); + } + + async create(request: Request) { + await this.tokenService.validateToken(request); + const data = await this.metadataQueryBuilderFactory.create(request); + + return await this.restApiService.call( + GraphqlApiType.METADATA, + request, + data, + ); + } + + async update(request: Request) { + await this.tokenService.validateToken(request); + const data = await this.metadataQueryBuilderFactory.update(request); + + return await this.restApiService.call( + GraphqlApiType.METADATA, + request, + data, + ); + } + + async delete(request: Request) { + await this.tokenService.validateToken(request); + const data = await this.metadataQueryBuilderFactory.delete(request); + + return await this.restApiService.call( + GraphqlApiType.METADATA, + request, + data, + ); + } +} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts new file mode 100644 index 000000000000..e2d2cc19d7bf --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts @@ -0,0 +1,9 @@ +export type MetadataQueryVariables = { + id?: string; + input?: object; + paging?: { + first?: number; + after?: string; + before?: string; + }; +}; diff --git a/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query.type.ts b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query.type.ts new file mode 100644 index 000000000000..6a3342482338 --- /dev/null +++ b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query.type.ts @@ -0,0 +1,6 @@ +import { MetadataQueryVariables } from 'src/engine/api/rest/metadata/types/metadata-query-variables.type'; + +export type MetadataQuery = { + query: string; + variables: MetadataQueryVariables; +}; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/__tests__/core-query-builder.factory.spec.ts b/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/__tests__/core-query-builder.factory.spec.ts deleted file mode 100644 index b64197417129..000000000000 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/__tests__/core-query-builder.factory.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; - -import { CoreQueryBuilderFactory } from 'src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory'; -import { DeleteQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-query.factory'; -import { CreateOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory'; -import { CreateManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory'; -import { UpdateQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory'; -import { FindOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory'; -import { FindManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory'; -import { DeleteVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory'; -import { CreateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory'; -import { UpdateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory'; -import { GetVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory'; -import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; -import { TokenService } from 'src/engine/core-modules/auth/services/token.service'; -import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; - -describe('CoreQueryBuilderFactory', () => { - let service: CoreQueryBuilderFactory; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - CoreQueryBuilderFactory, - { provide: DeleteQueryFactory, useValue: {} }, - { provide: CreateOneQueryFactory, useValue: {} }, - { provide: CreateManyQueryFactory, useValue: {} }, - { provide: UpdateQueryFactory, useValue: {} }, - { provide: FindOneQueryFactory, useValue: {} }, - { provide: FindManyQueryFactory, useValue: {} }, - { provide: DeleteVariablesFactory, useValue: {} }, - { provide: CreateVariablesFactory, useValue: {} }, - { provide: UpdateVariablesFactory, useValue: {} }, - { provide: GetVariablesFactory, useValue: {} }, - { provide: ObjectMetadataService, useValue: {} }, - { provide: TokenService, useValue: {} }, - { provide: EnvironmentService, useValue: {} }, - ], - }).compile(); - - service = module.get(CoreQueryBuilderFactory); - }); - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/factories.ts b/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/factories.ts deleted file mode 100644 index d583d2dfdf84..000000000000 --- a/packages/twenty-server/src/engine/api/rest/rest-api-core-query-builder/factories/factories.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { DeleteQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-query.factory'; -import { CreateOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-one-query.factory'; -import { UpdateQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-query.factory'; -import { FindOneQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-one-query.factory'; -import { FindManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/find-many-query.factory'; -import { DeleteVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/delete-variables.factory'; -import { CreateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-variables.factory'; -import { UpdateVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/update-variables.factory'; -import { GetVariablesFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/get-variables.factory'; -import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; -import { OrderByInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; -import { FilterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-input.factory'; -import { CreateManyQueryFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/create-many-query.factory'; -import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; -import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; - -export const coreQueryBuilderFactories = [ - DeleteQueryFactory, - CreateOneQueryFactory, - CreateManyQueryFactory, - UpdateQueryFactory, - FindOneQueryFactory, - FindManyQueryFactory, - DeleteVariablesFactory, - CreateVariablesFactory, - UpdateVariablesFactory, - GetVariablesFactory, - StartingAfterInputFactory, - EndingBeforeInputFactory, - LimitInputFactory, - OrderByInputFactory, - FilterInputFactory, -]; diff --git a/packages/twenty-server/src/engine/api/rest/rest-api.module.ts b/packages/twenty-server/src/engine/api/rest/rest-api.module.ts index 01343ee3a4b8..c459f3286264 100644 --- a/packages/twenty-server/src/engine/api/rest/rest-api.module.ts +++ b/packages/twenty-server/src/engine/api/rest/rest-api.module.ts @@ -1,20 +1,26 @@ import { Module } from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; -import { RestApiCoreController } from 'src/engine/api/rest/controllers/rest-api-core.controller'; -import { RestApiCoreService } from 'src/engine/api/rest/services/rest-api-core.service'; -import { CoreQueryBuilderModule } from 'src/engine/api/rest/rest-api-core-query-builder/core-query-builder.module'; +import { RestApiCoreController } from 'src/engine/api/rest/core/controllers/rest-api-core.controller'; +import { RestApiCoreService } from 'src/engine/api/rest/core/rest-api-core.service'; +import { CoreQueryBuilderModule } from 'src/engine/api/rest/core/query-builder/core-query-builder.module'; import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; -import { RestApiMetadataController } from 'src/engine/api/rest/controllers/rest-api-metadata.controller'; -import { RestApiMetadataService } from 'src/engine/api/rest/services/rest-api-metadata.service'; -import { RestApiCoreBatchController } from 'src/engine/api/rest/controllers/rest-api-core-batch.controller'; -import { RestApiService } from 'src/engine/api/rest/services/rest-api.service'; -import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; -import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; -import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; +import { RestApiMetadataController } from 'src/engine/api/rest/metadata/rest-api-metadata.controller'; +import { RestApiMetadataService } from 'src/engine/api/rest/metadata/rest-api-metadata.service'; +import { RestApiCoreBatchController } from 'src/engine/api/rest/core/controllers/rest-api-core-batch.controller'; +import { RestApiService } from 'src/engine/api/rest/rest-api.service'; +import { EndingBeforeInputFactory } from 'src/engine/api/rest/input-factories/ending-before-input.factory'; +import { LimitInputFactory } from 'src/engine/api/rest/input-factories/limit-input.factory'; +import { StartingAfterInputFactory } from 'src/engine/api/rest/input-factories/starting-after-input.factory'; +import { MetadataQueryBuilderModule } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.module'; @Module({ - imports: [CoreQueryBuilderModule, AuthModule, HttpModule], + imports: [ + CoreQueryBuilderModule, + MetadataQueryBuilderModule, + AuthModule, + HttpModule, + ], controllers: [ RestApiMetadataController, RestApiCoreBatchController, diff --git a/packages/twenty-server/src/engine/api/rest/services/rest-api.service.ts b/packages/twenty-server/src/engine/api/rest/rest-api.service.ts similarity index 95% rename from packages/twenty-server/src/engine/api/rest/services/rest-api.service.ts rename to packages/twenty-server/src/engine/api/rest/rest-api.service.ts index 1107a259812d..d6b4d21640c3 100644 --- a/packages/twenty-server/src/engine/api/rest/services/rest-api.service.ts +++ b/packages/twenty-server/src/engine/api/rest/rest-api.service.ts @@ -4,7 +4,7 @@ import { HttpService } from '@nestjs/axios'; import { Request } from 'express'; import { AxiosResponse } from 'axios'; -import { Query } from 'src/engine/api/rest/types/query.type'; +import { Query } from 'src/engine/api/rest/core/types/query.type'; import { getServerUrl } from 'src/utils/get-server-url'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { RestApiException } from 'src/engine/api/rest/errors/RestApiException'; diff --git a/packages/twenty-server/src/engine/api/rest/services/__tests__/core.service.spec.ts b/packages/twenty-server/src/engine/api/rest/services/__tests__/core.service.spec.ts deleted file mode 100644 index 45fde1dfdc34..000000000000 --- a/packages/twenty-server/src/engine/api/rest/services/__tests__/core.service.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; - -import { RestApiCoreService } from 'src/engine/api/rest/services/rest-api-core.service'; -import { CoreQueryBuilderFactory } from 'src/engine/api/rest/rest-api-core-query-builder/core-query-builder.factory'; -import { RestApiService } from 'src/engine/api/rest/services/rest-api.service'; - -describe('RestApiCoreService', () => { - let service: RestApiCoreService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - RestApiCoreService, - { - provide: CoreQueryBuilderFactory, - useValue: {}, - }, - { - provide: RestApiService, - useValue: {}, - }, - ], - }).compile(); - - service = module.get(RestApiCoreService); - }); - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts b/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts deleted file mode 100644 index 4442136ef8dc..000000000000 --- a/packages/twenty-server/src/engine/api/rest/services/rest-api-metadata.service.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; - -import { Query } from 'src/engine/api/rest/types/query.type'; -import { TokenService } from 'src/engine/core-modules/auth/services/token.service'; -import { capitalize } from 'src/utils/capitalize'; -import { parseMetadataPath } from 'src/engine/api/rest/rest-api-core-query-builder/utils/path-parsers/parse-metadata-path.utils'; -import { - GraphqlApiType, - RestApiService, -} from 'src/engine/api/rest/services/rest-api.service'; -import { LimitInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/limit-input.factory'; -import { StartingAfterInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/starting-after-input.factory'; -import { EndingBeforeInputFactory } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/ending-before-input.factory'; - -@Injectable() -export class RestApiMetadataService { - constructor( - private readonly tokenService: TokenService, - private readonly restApiService: RestApiService, - private readonly startingAfterInputFactory: StartingAfterInputFactory, - private readonly endingBeforeInputFactory: EndingBeforeInputFactory, - private readonly limitInputFactory: LimitInputFactory, - ) {} - - fetchMetadataFields(objectNamePlural: string) { - const fields = ` - type - name - label - description - icon - isCustom - isActive - isSystem - isNullable - createdAt - updatedAt - fromRelationMetadata { - id - relationType - toObjectMetadata { - id - dataSourceId - nameSingular - namePlural - isSystem - } - toFieldMetadataId - } - toRelationMetadata { - id - relationType - fromObjectMetadata { - id - dataSourceId - nameSingular - namePlural - isSystem - } - fromFieldMetadataId - } - defaultValue - options - `; - - switch (objectNamePlural) { - case 'objects': - return ` - dataSourceId - nameSingular - namePlural - labelSingular - labelPlural - description - icon - isCustom - isActive - isSystem - createdAt - updatedAt - labelIdentifierFieldMetadataId - imageIdentifierFieldMetadataId - fields(paging: { first: 1000 }) { - edges { - node { - id - ${fields} - } - } - } - `; - case 'fields': - return fields; - case 'relations': - return ` - relationType - fromObjectMetadata { - id - dataSourceId - nameSingular - namePlural - isSystem - } - fromObjectMetadataId - toObjectMetadata { - id - dataSourceId - nameSingular - namePlural - isSystem - } - toObjectMetadataId - fromFieldMetadataId - toFieldMetadataId - `; - } - } - - generateFindManyQuery(objectNamePlural: string) { - const fields = this.fetchMetadataFields(objectNamePlural); - - return ` - query FindMany${capitalize(objectNamePlural)}( - $paging: CursorPaging! - ) { - ${objectNamePlural}( - paging: $paging - ) { - edges { - node { - id - ${fields} - } - } - pageInfo { - hasNextPage - startCursor - endCursor - } - } - } - `; - } - - generateFindOneQuery(objectNameSingular: string, objectNamePlural: string) { - const fields = this.fetchMetadataFields(objectNamePlural); - - return ` - query FindOne${capitalize(objectNameSingular)}( - $id: UUID!, - ) { - ${objectNameSingular}(id: $id) { - id - ${fields} - } - } - `; - } - - generateFindManyVariables(request) { - return { - paging: { - first: this.limitInputFactory.create(request, 1000), - after: this.startingAfterInputFactory.create(request), - before: this.endingBeforeInputFactory.create(request), - }, - }; - } - - async get(request) { - await this.tokenService.validateToken(request); - - const { objectNameSingular, objectNamePlural, id } = - parseMetadataPath(request); - - const query = id - ? this.generateFindOneQuery(objectNameSingular, objectNamePlural) - : this.generateFindManyQuery(objectNamePlural); - - const data: Query = { - query, - variables: id ? { id } : this.generateFindManyVariables(request), - }; - - return await this.restApiService.call( - GraphqlApiType.METADATA, - request, - data, - ); - } - - async create(request) { - await this.tokenService.validateToken(request); - - const { objectNameSingular: objectName, objectNamePlural } = - parseMetadataPath(request); - const objectNameCapitalized = capitalize(objectName); - - const fields = this.fetchMetadataFields(objectNamePlural); - - const query = ` - mutation Create${objectNameCapitalized}($input: CreateOne${objectNameCapitalized}Input!) { - createOne${objectNameCapitalized}(input: $input) { - id - ${fields} - } - } - `; - - const data: Query = { - query, - variables: { - input: { - [objectName]: request.body, - }, - }, - }; - - return await this.restApiService.call( - GraphqlApiType.METADATA, - request, - data, - ); - } - - async update(request) { - await this.tokenService.validateToken(request); - - const { - objectNameSingular: objectName, - objectNamePlural, - id, - } = parseMetadataPath(request); - const objectNameCapitalized = capitalize(objectName); - - if (!id) { - throw new BadRequestException( - `update ${objectName} query invalid. Id missing. eg: /rest/metadata/${objectName}/0d4389ef-ea9c-4ae8-ada1-1cddc440fb56`, - ); - } - const fields = this.fetchMetadataFields(objectNamePlural); - - const query = ` - mutation Update${objectNameCapitalized}($input: UpdateOne${objectNameCapitalized}Input!) { - updateOne${objectNameCapitalized}(input: $input) { - id - ${fields} - } - } - `; - - const data: Query = { - query, - variables: { - input: { - update: request.body, - id, - }, - }, - }; - - return await this.restApiService.call( - GraphqlApiType.METADATA, - request, - data, - ); - } - - async delete(request) { - await this.tokenService.validateToken(request); - - const { objectNameSingular: objectName, id } = parseMetadataPath(request); - const objectNameCapitalized = capitalize(objectName); - - if (!id) { - throw new BadRequestException( - `delete ${objectName} query invalid. Id missing. eg: /rest/metadata/${objectName}/0d4389ef-ea9c-4ae8-ada1-1cddc440fb56`, - ); - } - - const query = ` - mutation Delete${objectNameCapitalized}($input: DeleteOne${objectNameCapitalized}Input!) { - deleteOne${objectNameCapitalized}(input: $input) { - id - } - } - `; - - const data: Query = { - query, - variables: { - input: { - id, - }, - }, - }; - - return await this.restApiService.call( - GraphqlApiType.METADATA, - request, - data, - ); - } -} diff --git a/packages/twenty-server/src/engine/api/rest/types/query.type.ts b/packages/twenty-server/src/engine/api/rest/types/query.type.ts deleted file mode 100644 index 1af013c8a13c..000000000000 --- a/packages/twenty-server/src/engine/api/rest/types/query.type.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { QueryVariables } from 'src/engine/api/rest/types/query-variables.type'; - -export type Query = { - query: string; - variables: QueryVariables; -}; 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 3fd99913c9c8..fd1cf3dde9af 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 @@ -9,10 +9,10 @@ import { computeOrderByParameters, computeStartingAfterParameters, } from 'src/engine/core-modules/open-api/utils/parameters.utils'; -import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; -import { FilterComparators } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils'; -import { Conjunctions } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils'; -import { DEFAULT_CONJUNCTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils'; +import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/input-factories/order-by-input.factory'; +import { FilterComparators } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils'; +import { Conjunctions } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils'; +import { DEFAULT_CONJUNCTION } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils'; describe('computeParameters', () => { describe('computeLimit', () => { 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 7cb955c15c84..de96442078c8 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 @@ -2,10 +2,10 @@ import { OpenAPIV3_1 } from 'openapi-types'; import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; -import { FilterComparators } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-base-filter.utils'; -import { Conjunctions } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/parse-filter.utils'; -import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/order-by-input.factory'; -import { DEFAULT_CONJUNCTION } from 'src/engine/api/rest/rest-api-core-query-builder/factories/input-factories/filter-utils/add-default-conjunction.utils'; +import { FilterComparators } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-base-filter.utils'; +import { Conjunctions } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils'; +import { DEFAULT_ORDER_DIRECTION } from 'src/engine/api/rest/input-factories/order-by-input.factory'; +import { DEFAULT_CONJUNCTION } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/add-default-conjunction.utils'; export const computeLimitParameters = ( fromMetadata = false, From e0bbe462bc9dc13b55feac3ccdaf1be70f2ab578 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 15:54:14 +0200 Subject: [PATCH 4/8] Fix component naming --- .../src/engine/core-modules/open-api/open-api.service.ts | 2 +- .../core-modules/open-api/utils/components.utils.ts | 6 +++--- .../core-modules/open-api/utils/responses.utils.ts | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts index 9b164d0fb714..ecb9788e85dc 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts @@ -162,7 +162,7 @@ export class OpenApiService { summary: `Find One ${item.nameSingular}`, parameters: [{ $ref: '#/components/parameters/idPath' }], responses: { - '200': getFindOneResponse200(item), + '200': getFindOneResponse200(item, true), '400': { $ref: '#/components/responses/400' }, '401': { $ref: '#/components/responses/401' }, }, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts index e8743fb65935..3bdc3a9fadcd 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts @@ -239,7 +239,7 @@ export const computeMetadataSchemaComponents = ( (schemas, item) => { switch (item.nameSingular) { case 'object': { - schemas[`${capitalize(item.nameSingular)} with Relations`] = { + schemas[`${capitalize(item.nameSingular)}`] = { type: 'object', description: `An object`, properties: { @@ -289,7 +289,7 @@ export const computeMetadataSchemaComponents = ( return schemas; } case 'field': { - schemas[`${capitalize(item.nameSingular)} with Relations`] = { + schemas[`${capitalize(item.nameSingular)}`] = { type: 'object', description: `A field`, properties: { @@ -357,7 +357,7 @@ export const computeMetadataSchemaComponents = ( return schemas; } case 'relation': { - schemas[`${capitalize(item.nameSingular)} with Relations`] = { + schemas[`${capitalize(item.nameSingular)}`] = { type: 'object', description: 'A relation', properties: { diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts index 262683426e94..49264fee0e9f 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts @@ -20,7 +20,7 @@ export const getFindManyResponse200 = ( items: { $ref: `#/components/schemas/${capitalize( item.nameSingular, - )} with Relations`, + )}${!fromMetadata ? ' with Relations' : ''}`, }, }, }, @@ -62,6 +62,7 @@ export const getFindManyResponse200 = ( export const getFindOneResponse200 = ( item: Pick, + fromMetadata = false, ) => { return { description: 'Successful operation', @@ -74,9 +75,9 @@ export const getFindOneResponse200 = ( type: 'object', properties: { [item.nameSingular]: { - $ref: `#/components/schemas/${capitalize( - item.nameSingular, - )} with Relations`, + $ref: `#/components/schemas/${capitalize(item.nameSingular)}${ + !fromMetadata ? ' with Relations' : '' + }`, }, }, }, From 63c4fb0d8998e6596cd881d1c13dd00ba364c107 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 16:13:32 +0200 Subject: [PATCH 5/8] Fix typing --- .../query-builder/factories/create-metadata-query.factory.ts | 4 +++- .../query-builder/factories/update-metadata-query.factory.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts index d257604f483e..67333a146c3a 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/create-metadata-query.factory.ts @@ -11,7 +11,9 @@ export class CreateMetadataQueryFactory { const fields = fetchMetadataFields(objectNamePlural); return ` - mutation Create${objectNameCapitalized}($input: CreateOne${objectNameCapitalized}Input!) { + mutation Create${objectNameCapitalized}($input: CreateOne${objectNameCapitalized}${ + objectNameSingular === 'field' ? 'Metadata' : '' + }Input!) { createOne${objectNameCapitalized}(input: $input) { id ${fields} diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts index 8be23818e778..6be62fc48a9d 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/update-metadata-query.factory.ts @@ -11,7 +11,9 @@ export class UpdateMetadataQueryFactory { const fields = fetchMetadataFields(objectNamePlural); return ` - mutation Update${objectNameCapitalized}($input: UpdateOne${objectNameCapitalized}Input!) { + mutation Update${objectNameCapitalized}($input: UpdateOne${objectNameCapitalized}${ + objectNameSingular === 'field' ? 'Metadata' : '' + }Input!) { updateOne${objectNameCapitalized}(input: $input) { id ${fields} From d14421903dd0d4dfdecf4240798363ab7fa0ff13 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 16:20:33 +0200 Subject: [PATCH 6/8] Remove update relation api route --- .../core-modules/open-api/open-api.service.ts | 24 ++++++++++--------- .../core-modules/open-api/utils/path.utils.ts | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts index ecb9788e85dc..8a3738b2a695 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts @@ -178,18 +178,20 @@ export class OpenApiService { '401': { $ref: '#/components/responses/401' }, }, }, - patch: { - tags: [item.namePlural], - summary: `Update One ${item.namePlural}`, - operationId: `updateOne${capitalize(item.nameSingular)}`, - parameters: [{ $ref: '#/components/parameters/idPath' }], - requestBody: getRequestBody(capitalize(item.nameSingular)), - responses: { - '200': getUpdateOneResponse200(item, true), - '400': { $ref: '#/components/responses/400' }, - '401': { $ref: '#/components/responses/401' }, + ...(item.nameSingular !== 'relation' && { + patch: { + tags: [item.namePlural], + summary: `Update One ${item.nameSingular}`, + operationId: `updateOne${capitalize(item.nameSingular)}`, + parameters: [{ $ref: '#/components/parameters/idPath' }], + requestBody: getRequestBody(capitalize(item.nameSingular)), + responses: { + '200': getUpdateOneResponse200(item, true), + '400': { $ref: '#/components/responses/400' }, + '401': { $ref: '#/components/responses/401' }, + }, }, - }, + }), } as OpenAPIV3_1.PathItemObject; return path; diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/path.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/path.utils.ts index 37b1e217a415..fb73fb5ecb9e 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/path.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/path.utils.ts @@ -105,7 +105,7 @@ export const computeSingleResultPath = ( }, patch: { tags: [item.namePlural], - summary: `Update One ${item.namePlural}`, + summary: `Update One ${item.nameSingular}`, operationId: `UpdateOne${capitalize(item.nameSingular)}`, parameters: [ { $ref: '#/components/parameters/idPath' }, From 749a0a1754852d0afd3b3064bdcc94f017939182 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 16:25:54 +0200 Subject: [PATCH 7/8] Remove useless stuff --- .../src/engine/api/rest/core/types/query-variables.type.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts index 7e02682358a7..6907aed8d5ec 100644 --- a/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts +++ b/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts @@ -7,9 +7,4 @@ export type QueryVariables = { startingAfter?: string; endingBefore?: string; input?: object; - paging?: { - first?: number; - after?: string; - before?: string; - }; }; From e581562879b43cf2fc316238e6150d511dd3a5c0 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 17 Jun 2024 16:47:10 +0200 Subject: [PATCH 8/8] Fix endingBefore --- .../factories/find-many-query.factory.ts | 10 ++++++++-- .../factories/get-variables.factory.ts | 11 ++++++++--- .../rest/core/types/query-variables.type.ts | 3 ++- .../get-metadata-variables.factory.ts | 19 +++++++++++++++---- .../types/metadata-query-variables.type.ts | 1 + 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts index 8bdfed1abb06..401721162d83 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/find-many-query.factory.ts @@ -17,10 +17,16 @@ export class FindManyQueryFactory { $orderBy: [${objectNameSingular}OrderByInput], $startingAfter: String, $endingBefore: String, - $limit: Int = 60 + $first: Int, + $last: Int ) { ${objectNamePlural}( - filter: $filter, orderBy: $orderBy, first: $limit, after: $startingAfter, before: $endingBefore + filter: $filter, + orderBy: $orderBy, + first: $first, + last: $last, + after: $startingAfter, + before: $endingBefore ) { edges { node { diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts index 5863f306488a..5af552d48f70 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/factories/get-variables.factory.ts @@ -28,12 +28,17 @@ export class GetVariablesFactory { return { filter: { id: { eq: id } } }; } + const limit = this.limitInputFactory.create(request); + const endingBefore = this.endingBeforeInputFactory.create(request); + const startingAfter = this.startingAfterInputFactory.create(request); + return { filter: this.filterInputFactory.create(request, objectMetadata), orderBy: this.orderByInputFactory.create(request, objectMetadata), - limit: this.limitInputFactory.create(request), - startingAfter: this.startingAfterInputFactory.create(request), - endingBefore: this.endingBeforeInputFactory.create(request), + first: !endingBefore ? limit : undefined, + last: endingBefore ? limit : undefined, + startingAfter, + endingBefore, }; } } diff --git a/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts index 6907aed8d5ec..97a23c657a48 100644 --- a/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts +++ b/packages/twenty-server/src/engine/api/rest/core/types/query-variables.type.ts @@ -3,7 +3,8 @@ export type QueryVariables = { data?: object | null; filter?: object; orderBy?: object; - limit?: number; + last?: number; + first?: number; startingAfter?: string; endingBefore?: string; input?: object; diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts index b8721e25194c..61149853b0f9 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/get-metadata-variables.factory.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { Request } from 'express'; @@ -20,11 +20,22 @@ export class GetMetadataVariablesFactory { return { id }; } + const limit = this.limitInputFactory.create(request, 1000); + const before = this.endingBeforeInputFactory.create(request); + const after = this.startingAfterInputFactory.create(request); + + if (before && after) { + throw new BadRequestException( + `Only one of 'endingBefore' and 'startingAfter' may be provided`, + ); + } + return { paging: { - first: this.limitInputFactory.create(request, 1000), - after: this.startingAfterInputFactory.create(request), - before: this.endingBeforeInputFactory.create(request), + first: !before ? limit : undefined, + last: before ? limit : undefined, + after, + before, }, }; } diff --git a/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts index e2d2cc19d7bf..edc86f56fb1e 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/types/metadata-query-variables.type.ts @@ -3,6 +3,7 @@ export type MetadataQueryVariables = { input?: object; paging?: { first?: number; + last?: number; after?: string; before?: string; };