Add relations in database event trigger output data (#11820)

## Done
- add relations in dropdown variables
- add relations in worklfow run inputs
- use objectMetadataMaps in workflow folder

## To do
- does not work with rest api calls, will be fixed after
https://github.com/twentyhq/twenty/pull/11349 is merged
- waiting for crud action relation fields
https://github.com/twentyhq/core-team-issues/issues/509
This commit is contained in:
martmull
2025-05-27 20:46:15 +02:00
committed by GitHub
parent 01b40e173b
commit 196d8c97a4
30 changed files with 568 additions and 302 deletions

View File

@ -321,8 +321,8 @@ export class GraphqlQueryCreateManyResolverService extends GraphqlQueryBaseResol
);
this.apiEventEmitterService.emitUpdateEvents({
existingRecords: [existingRecord],
records: [record],
existingRecords: structuredClone([existingRecord]),
records: structuredClone([record]),
updatedFields: Object.keys(formattedPartialRecordToUpdate),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
@ -366,7 +366,7 @@ export class GraphqlQueryCreateManyResolverService extends GraphqlQueryBaseResol
}
this.apiEventEmitterService.emitCreateEvents({
records: formattedInsertedRecords,
records: structuredClone(formattedInsertedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -54,7 +54,7 @@ export class GraphqlQueryCreateOneResolverService extends GraphqlQueryBaseResolv
);
this.apiEventEmitterService.emitCreateEvents({
records: upsertedRecords,
records: structuredClone(upsertedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -56,7 +56,7 @@ export class GraphqlQueryDeleteManyResolverService extends GraphqlQueryBaseResol
);
this.apiEventEmitterService.emitDeletedEvents({
records: formattedDeletedRecords,
records: structuredClone(formattedDeletedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -48,12 +48,6 @@ export class GraphqlQueryDeleteOneResolverService extends GraphqlQueryBaseResolv
objectMetadataMaps,
);
this.apiEventEmitterService.emitDeletedEvents({
records: formattedDeletedRecords,
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (formattedDeletedRecords.length === 0) {
throw new GraphqlQueryRunnerException(
'Record not found',
@ -63,6 +57,12 @@ export class GraphqlQueryDeleteOneResolverService extends GraphqlQueryBaseResolv
const deletedRecord = formattedDeletedRecords[0];
this.apiEventEmitterService.emitDeletedEvents({
records: structuredClone(formattedDeletedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (executionArgs.graphqlQuerySelectedFieldsResult.relations) {
await this.processNestedRelationsHelper.processNestedRelations({
objectMetadataMaps,

View File

@ -54,7 +54,7 @@ export class GraphqlQueryDestroyManyResolverService extends GraphqlQueryBaseReso
);
this.apiEventEmitterService.emitDestroyEvents({
records: deletedRecords,
records: structuredClone(deletedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -54,7 +54,7 @@ export class GraphqlQueryDestroyOneResolverService extends GraphqlQueryBaseResol
);
this.apiEventEmitterService.emitDestroyEvents({
records: deletedRecords,
records: structuredClone(deletedRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -56,7 +56,7 @@ export class GraphqlQueryRestoreManyResolverService extends GraphqlQueryBaseReso
);
this.apiEventEmitterService.emitRestoreEvents({
records: formattedRestoredRecords,
records: structuredClone(formattedRestoredRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});

View File

@ -48,12 +48,6 @@ export class GraphqlQueryRestoreOneResolverService extends GraphqlQueryBaseResol
objectMetadataMaps,
);
this.apiEventEmitterService.emitRestoreEvents({
records: formattedRestoredRecords,
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (formattedRestoredRecords.length === 0) {
throw new GraphqlQueryRunnerException(
'Record not found',
@ -63,6 +57,12 @@ export class GraphqlQueryRestoreOneResolverService extends GraphqlQueryBaseResol
const restoredRecord = formattedRestoredRecords[0];
this.apiEventEmitterService.emitRestoreEvents({
records: structuredClone(formattedRestoredRecords),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (executionArgs.graphqlQuerySelectedFieldsResult.relations) {
await this.processNestedRelationsHelper.processNestedRelations({
objectMetadataMaps,

View File

@ -90,8 +90,8 @@ export class GraphqlQueryUpdateManyResolverService extends GraphqlQueryBaseResol
);
this.apiEventEmitterService.emitUpdateEvents({
existingRecords: formattedExistingRecords,
records: formattedUpdatedRecords,
existingRecords: structuredClone(formattedExistingRecords),
records: structuredClone(formattedUpdatedRecords),
updatedFields: Object.keys(executionArgs.args.data),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
@ -101,7 +101,10 @@ export class GraphqlQueryUpdateManyResolverService extends GraphqlQueryBaseResol
await this.processNestedRelationsHelper.processNestedRelations({
objectMetadataMaps,
parentObjectMetadataItem: objectMetadataItemWithFieldMaps,
parentObjectRecords: formattedUpdatedRecords,
parentObjectRecords: [
...formattedExistingRecords,
...formattedUpdatedRecords,
],
relations: executionArgs.graphqlQuerySelectedFieldsResult.relations,
limit: QUERY_MAX_RECORDS,
authContext,

View File

@ -74,14 +74,6 @@ export class GraphqlQueryUpdateOneResolverService extends GraphqlQueryBaseResolv
objectMetadataMaps,
);
this.apiEventEmitterService.emitUpdateEvents({
existingRecords: formattedExistingRecords,
records: formattedUpdatedRecords,
updatedFields: Object.keys(executionArgs.args.data),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (formattedUpdatedRecords.length === 0) {
throw new GraphqlQueryRunnerException(
'Record not found',
@ -90,12 +82,21 @@ export class GraphqlQueryUpdateOneResolverService extends GraphqlQueryBaseResolv
}
const updatedRecord = formattedUpdatedRecords[0];
const existingRecord = formattedExistingRecords[0];
this.apiEventEmitterService.emitUpdateEvents({
existingRecords: structuredClone(formattedExistingRecords),
records: structuredClone(formattedUpdatedRecords),
updatedFields: Object.keys(executionArgs.args.data),
authContext,
objectMetadataItem: objectMetadataItemWithFieldMaps,
});
if (executionArgs.graphqlQuerySelectedFieldsResult.relations) {
await this.processNestedRelationsHelper.processNestedRelations({
objectMetadataMaps,
parentObjectMetadataItem: objectMetadataItemWithFieldMaps,
parentObjectRecords: [updatedRecord],
parentObjectRecords: [existingRecord, updatedRecord],
relations: executionArgs.graphqlQuerySelectedFieldsResult.relations,
limit: QUERY_MAX_RECORDS,
authContext,