Refactor graphql query runner and add mutation resolvers (#7418)

Fixes https://github.com/twentyhq/twenty/issues/6859

This PR adds all the remaining resolvers for
- updateOne/updateMany
- createOne/createMany
- deleteOne/deleteMany
- destroyOne
- restoreMany

Also
- refactored the graphql-query-runner to be able to add other resolvers
without too much boilerplate.
- add missing events that were not sent anymore as well as webhooks
- make resolver injectable so they can inject other services as well
- use objectMetadataMap from cache instead of computing it multiple time
- various fixes (mutation not correctly parsing JSON, relationHelper
fetching data with empty ids set, ...)

Next steps: 
- Wrapping query builder to handle DB events properly
- Move webhook emitters to db event listener
- Add pagination where it's missing (findDuplicates, nested relations,
etc...)
This commit is contained in:
Weiko
2024-10-04 11:58:33 +02:00
committed by GitHub
parent 8afa504b65
commit 511150a2d3
43 changed files with 1696 additions and 775 deletions
@@ -25,7 +25,7 @@ export class GraphqlQueryFilterConditionParser {
public parse(
queryBuilder: SelectQueryBuilder<any>,
objectNameSingular: string,
filter: RecordFilter,
filter: Partial<RecordFilter>,
): SelectQueryBuilder<any> {
if (!filter || Object.keys(filter).length === 0) {
return queryBuilder;
@@ -58,7 +58,6 @@ export class GraphqlQueryFilterFieldParser {
}
const { sql, params } = this.computeWhereConditionParts(
fieldMetadata,
operator,
objectNameSingular,
key,
@@ -73,7 +72,6 @@ export class GraphqlQueryFilterFieldParser {
}
private computeWhereConditionParts(
fieldMetadata: FieldMetadataInterface,
operator: string,
objectNameSingular: string,
key: string,
@@ -185,7 +183,6 @@ export class GraphqlQueryFilterFieldParser {
);
const { sql, params } = this.computeWhereConditionParts(
fieldMetadata,
operator,
objectNameSingular,
fullFieldName,
@@ -9,7 +9,6 @@ import {
RecordFilter,
RecordOrderBy,
} from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface';
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
import { GraphqlQueryFilterConditionParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-filter/graphql-query-filter-condition.parser';
import { GraphqlQueryOrderFieldParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/graphql-query-order.parser';
@@ -17,6 +16,7 @@ import { GraphqlQuerySelectedFieldsParser } from 'src/engine/api/graphql/graphql
import {
FieldMetadataMap,
ObjectMetadataMap,
ObjectMetadataMapItem,
} from 'src/engine/metadata-modules/utils/generate-object-metadata-map.util';
export class GraphqlQueryParser {
@@ -39,10 +39,10 @@ export class GraphqlQueryParser {
);
}
applyFilterToBuilder(
public applyFilterToBuilder(
queryBuilder: SelectQueryBuilder<any>,
objectNameSingular: string,
recordFilter: RecordFilter,
recordFilter: Partial<RecordFilter>,
): SelectQueryBuilder<any> {
return this.filterConditionParser.parse(
queryBuilder,
@@ -51,7 +51,7 @@ export class GraphqlQueryParser {
);
}
applyDeletedAtToBuilder(
public applyDeletedAtToBuilder(
queryBuilder: SelectQueryBuilder<any>,
recordFilter: RecordFilter,
): SelectQueryBuilder<any> {
@@ -88,7 +88,7 @@ export class GraphqlQueryParser {
return false;
};
applyOrderToBuilder(
public applyOrderToBuilder(
queryBuilder: SelectQueryBuilder<any>,
orderBy: RecordOrderBy,
objectNameSingular: string,
@@ -103,8 +103,8 @@ export class GraphqlQueryParser {
return queryBuilder.orderBy(parsedOrderBys as OrderByCondition);
}
parseSelectedFields(
parentObjectMetadata: ObjectMetadataInterface,
public parseSelectedFields(
parentObjectMetadata: ObjectMetadataMapItem,
graphqlSelectedFields: Partial<Record<string, any>>,
): { select: Record<string, any>; relations: Record<string, any> } {
const parentFields =