Skip to content

Commit

Permalink
Update zapier trigger payload (twentyhq#8464)
Browse files Browse the repository at this point in the history
- fixes zapier tests
  • Loading branch information
martmull authored Nov 12, 2024
1 parent 31f0376 commit 269eaf4
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { JwtService, JwtSignOptions, JwtVerifyOptions } from '@nestjs/jwt';

import { createHash } from 'crypto';
Expand All @@ -10,6 +10,7 @@ import {
AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { isDefined } from 'src/utils/is-defined';

export type WorkspaceTokenType =
| 'ACCESS'
Expand Down Expand Up @@ -53,9 +54,16 @@ export class JwtWrapperService {
json: true,
});

if (!isDefined(payload)) {
throw new AuthException('No payload', AuthExceptionCode.UNAUTHENTICATED);
}

// TODO: check if this is really needed
if (type !== 'FILE' && !payload.sub) {
throw new UnauthorizedException('No payload sub');
throw new AuthException(
'No payload sub',
AuthExceptionCode.UNAUTHENTICATED,
);
}

try {
Expand Down
25 changes: 23 additions & 2 deletions packages/twenty-zapier/src/creates/crud_record.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,36 @@ const computeQueryParameters = (
}
};

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 ${operation}${capitalize(nameSingular)} {
${operation}${capitalize(nameSingular)}(
mutation ${queryOperation}${capitalize(nameSingular)} {
${queryOperation}${capitalize(nameSingular)}(
${computeQueryParameters(operation, data)}
)
{id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ describe('triggers.list_record_ids', () => {
);
expect(result).toBeDefined();
expect(result.length).toBeGreaterThan(1);
expect(result[0].id).toBeDefined();
expect(result[0].record.id).toBeDefined();
});
});
49 changes: 25 additions & 24 deletions packages/twenty-zapier/src/test/triggers/trigger_record.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,18 @@ describe('triggers.trigger_record.created', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
expect(checkDbResult.data.webhooks.edges[0].node.operation).toEqual(
'create.company',
expect(checkDbResult.data.webhooks.edges[0].node.operations[0]).toEqual(
'company.created',
);
});
test('should succeed to unsubscribe', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'create';
bundle.inputData.operation = DatabaseEventAction.CREATED;
bundle.targetUrl = 'https://test.com';
const result = await appTester(
App.triggers[triggerRecordKey].operation.performSubscribe,
Expand All @@ -54,7 +54,7 @@ describe('triggers.trigger_record.created', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
Expand Down Expand Up @@ -83,27 +83,27 @@ describe('triggers.trigger_record.created', () => {
);
expect(results.length).toEqual(1);
const company = results[0];
expect(company.id).toEqual('d6ccb1d1-a90b-4822-a992-a0dd946592c9');
expect(company.record.id).toEqual('d6ccb1d1-a90b-4822-a992-a0dd946592c9');
});
it('should load companies from list', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'create';
bundle.inputData.operation = DatabaseEventAction.CREATED;
const results = await appTester(
App.triggers[triggerRecordKey].operation.performList,
bundle,
);
expect(results.length).toBeGreaterThan(1);
const firstCompany = results[0];
expect(firstCompany).toBeDefined();
expect(firstCompany.record).toBeDefined();
});
});

describe('triggers.trigger_record.update', () => {
test('should succeed to subscribe', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'update';
bundle.inputData.operation = DatabaseEventAction.UPDATED;
bundle.targetUrl = 'https://test.com';
const result = await appTester(
App.triggers[triggerRecordKey].operation.performSubscribe,
Expand All @@ -116,18 +116,18 @@ describe('triggers.trigger_record.update', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
expect(checkDbResult.data.webhooks.edges[0].node.operation).toEqual(
'update.company',
expect(checkDbResult.data.webhooks.edges[0].node.operations[0]).toEqual(
'company.updated',
);
});
test('should succeed to unsubscribe', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'update';
bundle.inputData.operation = DatabaseEventAction.UPDATED;
bundle.targetUrl = 'https://test.com';
const result = await appTester(
App.triggers[triggerRecordKey].operation.performSubscribe,
Expand All @@ -146,7 +146,7 @@ describe('triggers.trigger_record.update', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
Expand All @@ -155,22 +155,23 @@ describe('triggers.trigger_record.update', () => {
it('should load companies from list', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'update';
bundle.inputData.operation = DatabaseEventAction.UPDATED;
const results = await appTester(
App.triggers[triggerRecordKey].operation.performList,
bundle,
);
expect(results.length).toBeGreaterThan(1);
const firstCompany = results[0];
expect(firstCompany).toBeDefined();
expect(firstCompany.record).toBeDefined();
expect(firstCompany.updatedFields).toBeDefined();
});
});

describe('triggers.trigger_record.delete', () => {
test('should succeed to subscribe', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'delete';
bundle.inputData.operation = DatabaseEventAction.DELETED;
bundle.targetUrl = 'https://test.com';
const result = await appTester(
App.triggers[triggerRecordKey].operation.performSubscribe,
Expand All @@ -183,18 +184,18 @@ describe('triggers.trigger_record.delete', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
expect(checkDbResult.data.webhooks.edges[0].node.operation).toEqual(
'delete.company',
expect(checkDbResult.data.webhooks.edges[0].node.operations[0]).toEqual(
'company.deleted',
);
});
test('should succeed to unsubscribe', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'delete';
bundle.inputData.operation = DatabaseEventAction.DELETED;
bundle.targetUrl = 'https://test.com';
const result = await appTester(
App.triggers[triggerRecordKey].operation.performSubscribe,
Expand All @@ -213,7 +214,7 @@ describe('triggers.trigger_record.delete', () => {
requestDb(
z,
bundle,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operation}}}}`,
`query webhook {webhooks(filter: {id: {eq: "${result.id}"}}){edges {node {id operations}}}}`,
),
bundle,
);
Expand All @@ -222,15 +223,15 @@ describe('triggers.trigger_record.delete', () => {
it('should load companies from list', async () => {
const bundle = getBundle({});
bundle.inputData.nameSingular = 'company';
bundle.inputData.operation = 'delete';
bundle.inputData.operation = DatabaseEventAction.DELETED;
const results = await appTester(
App.triggers[triggerRecordKey].operation.performList,
bundle,
);
expect(results.length).toBeGreaterThan(1);
const firstCompany = results[0];
expect(firstCompany).toBeDefined();
expect(firstCompany.id).toBeDefined();
expect(firstCompany.record.id).toBeDefined();
expect(Object.keys(firstCompany).length).toEqual(1);
});
});
14 changes: 2 additions & 12 deletions packages/twenty-zapier/src/triggers/list_record_ids.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,4 @@
import { Bundle, ZObject } from 'zapier-platform-core';

import { ObjectData } from '../utils/data.types';
import { listSample } from '../utils/triggers/triggers.utils';

const listRecordIdsRequest = async (
z: ZObject,
bundle: Bundle,
): Promise<ObjectData[]> => {
return listSample(z, bundle, true);
};
import { performList } from '../utils/triggers/triggers.utils';

export const listRecordIdsKey = 'list_record_ids';

Expand All @@ -21,6 +11,6 @@ export default {
key: listRecordIdsKey,
noun: 'Object',
operation: {
perform: listRecordIdsRequest,
perform: performList,
},
};
2 changes: 0 additions & 2 deletions packages/twenty-zapier/src/utils/data.types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
export type InputData = { [x: string]: any };

export type ObjectData = { id: string } | { [x: string]: any };

export type NodeField = {
type: FieldMetadataType;
name: string;
Expand Down
10 changes: 4 additions & 6 deletions packages/twenty-zapier/src/utils/triggers/triggers.utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Bundle, ZObject } from 'zapier-platform-core';

import { ObjectData } from '../../utils/data.types';
import handleQueryParams from '../../utils/handleQueryParams';
import requestDb, {
requestDbViaRestApi,
Expand All @@ -11,7 +10,6 @@ export enum DatabaseEventAction {
CREATED = 'created',
UPDATED = 'updated',
DELETED = 'deleted',
DESTROYED = 'destroyed',
}

export const performSubscribe = async (z: ZObject, bundle: Bundle) => {
Expand Down Expand Up @@ -81,7 +79,7 @@ const getNamePluralFromNameSingular = async (
export const performList = async (
z: ZObject,
bundle: Bundle,
): Promise<ObjectData[]> => {
): Promise<{ record: Record<string, any>; updatedFields?: string[] }[]> => {
const nameSingular = bundle.inputData.nameSingular;
const namePlural = await getNamePluralFromNameSingular(
z,
Expand All @@ -92,9 +90,9 @@ export const performList = async (
return results.map((result) => ({
record: result,
...(bundle.inputData.operation === DatabaseEventAction.UPDATED && {
updatedFields: Object.keys(result).filter((key) => key !== 'id')?.[0] || [
'updatedField',
],
updatedFields: [
Object.keys(result).filter((key) => key !== 'id')?.[0],
] || ['updatedField'],
}),
}));
};

0 comments on commit 269eaf4

Please sign in to comment.