Rework relations (#3431)

* Rework relations

* Fix tests
This commit is contained in:
Charles Bochet
2024-01-15 12:07:23 +01:00
committed by GitHub
parent 8c96acc2a3
commit 16a24c5f0c
60 changed files with 392 additions and 463 deletions

View File

@ -4,9 +4,9 @@ import { FieldMetadataInterface } from 'src/metadata/field-metadata/interfaces/f
import { ObjectMetadataInterface } from 'src/metadata/field-metadata/interfaces/object-metadata.interface';
export interface WorkspaceQueryRunnerOptions {
targetTableName: string;
workspaceId: string;
info: GraphQLResolveInfo;
objectMetadataItem: ObjectMetadataInterface;
fieldMetadataCollection: FieldMetadataInterface[];
objectMetadataCollection: ObjectMetadataInterface[];
}

View File

@ -1,6 +1,7 @@
import { Inject, Injectable, Logger } from '@nestjs/common';
import { MessageQueueJob } from 'src/integrations/message-queue/interfaces/message-queue-job.interface';
import { ObjectMetadataInterface } from 'src/metadata/field-metadata/interfaces/object-metadata.interface';
import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service';
import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service';
@ -20,7 +21,7 @@ export enum CallWebhookJobsJobOperation {
export type CallWebhookJobsJobData = {
workspaceId: string;
objectNameSingular: string;
objectMetadataItem: ObjectMetadataInterface;
recordData: any;
operation: CallWebhookJobsJobOperation;
};
@ -43,7 +44,7 @@ export class CallWebhookJobsJob
const objectMetadataItem =
await this.objectMetadataService.findOneOrFailWithinWorkspace(
data.workspaceId,
{ where: { nameSingular: data.objectNameSingular } },
{ where: { nameSingular: data.objectMetadataItem.nameSingular } },
);
const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(

View File

@ -39,6 +39,8 @@ export const parseResult = (obj: any): any => {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = parseResult(obj[key]);
} else if (key === '__typename') {
result[key] = obj[key].replace(/^_*/, '');
} else if (isSpecialKey(key)) {
handleSpecialKey(result, key, obj[key]);
} else {

View File

@ -22,6 +22,7 @@ import {
UpdateManyResolverArgs,
UpdateOneResolverArgs,
} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { ObjectMetadataInterface } from 'src/metadata/field-metadata/interfaces/object-metadata.interface';
import { WorkspaceQueryBuilderFactory } from 'src/workspace/workspace-query-builder/workspace-query-builder.factory';
import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service';
@ -35,6 +36,7 @@ import {
import { parseResult } from 'src/workspace/workspace-query-runner/utils/parse-result.util';
import { ExceptionHandlerService } from 'src/integrations/exception-handler/exception-handler.service';
import { handleExceptionAndConvertToGraphQLError } from 'src/filters/utils/global-exception-handler.util';
import { computeObjectTargetTable } from 'src/workspace/utils/compute-object-target-table.util';
import { WorkspaceQueryRunnerOptions } from './interfaces/query-runner-optionts.interface';
import {
@ -63,7 +65,7 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<IConnection<Record> | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const start = performance.now();
const query = await this.workspaceQueryBuilderFactory.findMany(
@ -76,7 +78,11 @@ export class WorkspaceQueryRunnerService {
console.log(`query time: ${end - start} ms`);
return this.parseResult<IConnection<Record>>(result, targetTableName, '');
return this.parseResult<IConnection<Record>>(
result,
objectMetadataItem,
'',
);
} catch (exception) {
const error = handleExceptionAndConvertToGraphQLError(
exception,
@ -98,7 +104,7 @@ export class WorkspaceQueryRunnerService {
if (!args.filter || Object.keys(args.filter).length === 0) {
throw new BadRequestException('Missing filter argument');
}
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.findOne(
args,
options,
@ -106,7 +112,7 @@ export class WorkspaceQueryRunnerService {
const result = await this.execute(query, workspaceId);
const parsedResult = this.parseResult<IConnection<Record>>(
result,
targetTableName,
objectMetadataItem,
'',
);
@ -126,16 +132,17 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<Record[] | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.createMany(
args,
options,
);
const result = await this.execute(query, workspaceId);
const parsedResults = this.parseResult<PGGraphQLMutation<Record>>(
result,
targetTableName,
objectMetadataItem,
'insertInto',
)?.records;
@ -170,7 +177,7 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<Record | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.updateOne(
args,
options,
@ -179,7 +186,7 @@ export class WorkspaceQueryRunnerService {
const parsedResults = this.parseResult<PGGraphQLMutation<Record>>(
result,
targetTableName,
objectMetadataItem,
'update',
)?.records;
@ -205,7 +212,7 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<Record | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.deleteOne(
args,
options,
@ -214,7 +221,7 @@ export class WorkspaceQueryRunnerService {
const parsedResults = this.parseResult<PGGraphQLMutation<Record>>(
result,
targetTableName,
objectMetadataItem,
'deleteFrom',
)?.records;
@ -240,7 +247,7 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<Record[] | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.updateMany(
args,
options,
@ -249,7 +256,7 @@ export class WorkspaceQueryRunnerService {
const parsedResults = this.parseResult<PGGraphQLMutation<Record>>(
result,
targetTableName,
objectMetadataItem,
'update',
)?.records;
@ -278,7 +285,7 @@ export class WorkspaceQueryRunnerService {
options: WorkspaceQueryRunnerOptions,
): Promise<Record[] | undefined> {
try {
const { workspaceId, targetTableName } = options;
const { workspaceId, objectMetadataItem } = options;
const query = await this.workspaceQueryBuilderFactory.deleteMany(
args,
options,
@ -287,7 +294,7 @@ export class WorkspaceQueryRunnerService {
const parsedResults = this.parseResult<PGGraphQLMutation<Record>>(
result,
targetTableName,
objectMetadataItem,
'deleteFrom',
)?.records;
@ -334,18 +341,20 @@ export class WorkspaceQueryRunnerService {
private parseResult<Result>(
graphqlResult: PGGraphQLResult | undefined,
targetTableName: string,
objectMetadataItem: ObjectMetadataInterface,
command: string,
): Result {
const entityKey = `${command}${targetTableName}Collection`;
const entityKey = `${command}${computeObjectTargetTable(
objectMetadataItem,
)}Collection`;
const result = graphqlResult?.[0]?.resolve?.data?.[entityKey];
const errors = graphqlResult?.[0]?.resolve?.errors;
if (!result) {
throw new InternalServerErrorException(
`GraphQL errors on ${command}${targetTableName}: ${JSON.stringify(
errors,
)}`,
`GraphQL errors on ${command}${
objectMetadataItem.nameSingular
}: ${JSON.stringify(errors)}`,
);
}
@ -354,13 +363,13 @@ export class WorkspaceQueryRunnerService {
async executeAndParse<Result>(
query: string,
targetTableName: string,
objectMetadataItem: ObjectMetadataInterface,
command: string,
workspaceId: string,
): Promise<Result> {
const result = await this.execute(query, workspaceId);
return this.parseResult(result, targetTableName, command);
return this.parseResult(result, objectMetadataItem, command);
}
async triggerWebhooks<Record>(
@ -378,7 +387,7 @@ export class WorkspaceQueryRunnerService {
recordData: jobData,
workspaceId: options.workspaceId,
operation,
objectNameSingular: options.targetTableName,
objectMetadataItem: options.objectMetadataItem,
},
{ retryLimit: 3 },
);