Files
twenty/packages/twenty-zapier/src/creates/crud_record.ts
martmull 269eaf4422 Update zapier trigger payload (#8464)
- fixes zapier tests
2024-11-12 17:58:36 +01:00

142 lines
3.9 KiB
TypeScript

import { Bundle, ZObject } from 'zapier-platform-core';
import { findObjectNamesSingularKey } from '../triggers/find_object_names_singular';
import { listRecordIdsKey } from '../triggers/list_record_ids';
import { capitalize } from '../utils/capitalize';
import { computeInputFields } from '../utils/computeInputFields';
import { InputData } from '../utils/data.types';
import handleQueryParams from '../utils/handleQueryParams';
import requestDb, { requestSchema } from '../utils/requestDb';
import { DatabaseEventAction } from '../utils/triggers/triggers.utils';
export const recordInputFields = async (
z: ZObject,
bundle: Bundle,
idRequired = false,
) => {
const schema = await requestSchema(z, bundle);
const node = schema.data.objects.edges.filter(
(edge) => edge.node.nameSingular === bundle.inputData.nameSingular,
)[0].node;
return computeInputFields(node, idRequired);
};
const computeFields = async (z: ZObject, bundle: Bundle) => {
const operation = bundle.inputData.crudZapierOperation;
switch (operation) {
case DatabaseEventAction.DELETED:
return [
{
key: 'id',
label: 'Id',
type: 'string',
dynamic: `${listRecordIdsKey}.id`,
required: true,
},
];
case DatabaseEventAction.UPDATED:
return recordInputFields(z, bundle, true);
case DatabaseEventAction.CREATED:
return recordInputFields(z, bundle, false);
default:
return [];
}
};
const computeQueryParameters = (
operation: DatabaseEventAction,
data: InputData,
): string => {
switch (operation) {
case DatabaseEventAction.CREATED:
return `data:{${handleQueryParams(data)}}`;
case DatabaseEventAction.UPDATED:
return `
data:{${handleQueryParams(data)}},
id: "${data.id}"
`;
case DatabaseEventAction.DELETED:
return `
id: "${data.id}"
`;
default:
return '';
}
};
const getOperationFromDatabaseEventAction = (
z: ZObject,
databaseEventAction: DatabaseEventAction,
): 'create' | 'update' | 'delete' => {
switch (databaseEventAction) {
case DatabaseEventAction.CREATED:
return 'create';
case DatabaseEventAction.UPDATED:
return 'update';
case DatabaseEventAction.DELETED:
return 'delete';
default:
throw new z.errors.Error(
`Unknown databaseEventAction: ${databaseEventAction}`,
'Error',
404,
);
}
};
const perform = async (z: ZObject, bundle: Bundle) => {
const data = bundle.inputData;
const operation = data.crudZapierOperation;
const queryOperation = getOperationFromDatabaseEventAction(z, operation);
const nameSingular = data.nameSingular;
delete data.nameSingular;
delete data.crudZapierOperation;
const query = `
mutation ${queryOperation}${capitalize(nameSingular)} {
${queryOperation}${capitalize(nameSingular)}(
${computeQueryParameters(operation, data)}
)
{id}
}`;
return await requestDb(z, bundle, query);
};
export const crudRecordKey = 'crud_record';
export default {
display: {
description: 'Create, Update or Delete a Record in Twenty.',
hidden: false,
label: 'Create, Update or Delete Record',
},
key: crudRecordKey,
noun: 'Record',
operation: {
inputFields: [
{
key: 'nameSingular',
required: true,
label: 'Record Name',
dynamic: `${findObjectNamesSingularKey}.nameSingular.labelSingular`,
altersDynamicFields: true,
},
{
key: 'crudZapierOperation',
required: true,
label: 'Operation',
choices: {
[DatabaseEventAction.CREATED]: DatabaseEventAction.CREATED,
[DatabaseEventAction.UPDATED]: DatabaseEventAction.UPDATED,
[DatabaseEventAction.DELETED]: DatabaseEventAction.DELETED,
},
altersDynamicFields: true,
},
computeFields,
],
sample: {
id: '179ed459-79cf-41d9-ab85-96397fa8e936',
},
perform,
},
};