Skip to main content
Glama
new-submission.ts3.55 kB
import { createTrigger, Property, TriggerStrategy, AppConnectionValueForAuthProperty, } from '@activepieces/pieces-framework'; import { DedupeStrategy, Polling, pollingHelper, HttpMethod, } from '@activepieces/pieces-common'; import dayjs from 'dayjs'; import { featheryAuth } from '../common/auth'; import { featheryCommon } from '../common/client'; const polling: Polling<AppConnectionValueForAuthProperty<typeof featheryAuth>, { form_id: string }> = { strategy: DedupeStrategy.TIMEBASED, items: async ({ auth, propsValue, lastFetchEpochMS }) => { const { form_id } = propsValue; const queryParams = new URLSearchParams(); queryParams.append('form_id', form_id); // Filter by submissions after last fetch if (lastFetchEpochMS) { queryParams.append('start_time', new Date(lastFetchEpochMS).toISOString()); } const response = await featheryCommon.apiCall<{ count: number; results: Array<{ values: Array<{ id: string; type: string; created_at: string; updated_at: string; value: unknown; hidden: boolean; display_text: string; internal_id: string; }>; user_id: string; submission_start: string; last_submitted: string; }>; }>({ method: HttpMethod.GET, url: `/form/submission/?${queryParams.toString()}`, apiKey: auth.secret_text, }); return response.results.map((submission) => ({ epochMilliSeconds: dayjs(submission.last_submitted).valueOf(), data: submission, })); }, }; export const newSubmissionTrigger = createTrigger({ auth: featheryAuth, name: 'new_submission', displayName: 'New Form Submission', description: 'Triggers when a user submits data through your form.', props: { form_id: Property.Dropdown({ displayName: 'Form', description: 'Select the form to monitor for submissions.', required: true, refreshers: [], auth: featheryAuth, options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your account first', options: [], }; } const forms = await featheryCommon.apiCall< Array<{ id: string; name: string; active: boolean }> >({ method: HttpMethod.GET, url: '/form/', apiKey: auth.secret_text, }); return { disabled: false, options: forms.map((form) => ({ label: form.name, value: form.id, })), }; }, }), }, type: TriggerStrategy.POLLING, sampleData: { values: [ { id: 'email_field', type: 'email', created_at: '2024-10-28T07:56:09.391398Z', updated_at: '2024-10-28T16:39:32.577794Z', value: 'user@example.com', hidden: false, display_text: '', internal_id: 'ef5ed054-73de-4463-ba61-82c36aca5afc', }, ], user_id: '131e7132-dg6d-4a8c-9d70-cgd493c2a368', submission_start: '2024-10-30T02:07:32Z', last_submitted: '2024-10-30T02:07:32Z', }, async onEnable(context) { await pollingHelper.onEnable(polling, context); }, async onDisable(context) { await pollingHelper.onDisable(polling, context); }, async run(context) { return await pollingHelper.poll(polling, context); }, async test(context) { return await pollingHelper.test(polling, context); }, });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server