Skip to main content
Glama
new-contact.ts3.78 kB
import { AppConnectionValueForAuthProperty, createTrigger, Property, TriggerStrategy, } from '@activepieces/pieces-framework'; import { AuthenticationType, DedupeStrategy, httpClient, HttpMethod, Polling, pollingHelper, } from '@activepieces/pieces-common'; import { freeAgentAuth } from '../../index'; const props = { status: Property.StaticDropdown({ displayName: 'Contact Status', description: 'Filter contacts by status', required: false, options: { options: [ { label: 'All Contacts', value: 'all' }, { label: 'Active', value: 'active' }, { label: 'Clients', value: 'clients' }, { label: 'Suppliers', value: 'suppliers' }, { label: 'Active Projects', value: 'active_projects' }, { label: 'Completed Projects', value: 'completed_projects' }, { label: 'Open Clients', value: 'open_clients' }, { label: 'Open Suppliers', value: 'open_suppliers' }, { label: 'Hidden', value: 'hidden' }, ], }, defaultValue: 'all', }), }; type PropsValue = { status?: string; }; const polling: Polling< AppConnectionValueForAuthProperty<typeof freeAgentAuth>, PropsValue > = { strategy: DedupeStrategy.TIMEBASED, items: async ({ auth, propsValue, lastFetchEpochMS }) => { const { status } = propsValue; let url = 'https://api.freeagent.com/v2/contacts?'; if (status && status !== 'all') { url += `view=${status}&`; } if (lastFetchEpochMS > 0) { const updatedSince = new Date(lastFetchEpochMS).toISOString(); url += `updated_since=${encodeURIComponent(updatedSince)}&`; } url = url.replace(/&$/, ''); const response = await httpClient.sendRequest({ method: HttpMethod.GET, url, authentication: { type: AuthenticationType.BEARER_TOKEN, token: auth.access_token, }, }); const contacts = response.body['contacts'] || []; return contacts.map((contact: { created_at: string }) => ({ epochMilliSeconds: new Date(contact.created_at).getTime(), data: contact, })); }, }; export const freeAgentNewContactTrigger = createTrigger({ auth: freeAgentAuth, name: 'new_contact', displayName: 'New Contact', description: 'Triggers when a new contact is created', type: TriggerStrategy.POLLING, props, sampleData: { url: 'https://api.freeagent.com/v2/contacts/2', first_name: 'test', last_name: 'me', organisation_name: 'Acme Ltd', email: 'test@example.com', billing_email: 'billing@example.com', phone_number: '12345678', mobile: '9876543210', address1: '11 George Street', address2: 'South Court', address3: 'Flat 6', town: 'London', region: 'Southwark', postcode: 'SE1 6HA', country: 'United Kingdom', contact_name_on_invoices: true, default_payment_terms_in_days: 30, locale: 'en', status: 'Active', created_at: '2011-09-14T16:00:41Z', updated_at: '2011-09-16T09:34:41Z', }, async onEnable(context) { await pollingHelper.onEnable(polling, { auth: context.auth, store: context.store, propsValue: context.propsValue, }); }, async onDisable(context) { await pollingHelper.onDisable(polling, { auth: context.auth, store: context.store, propsValue: context.propsValue, }); }, async run(context) { return await pollingHelper.poll(polling, { auth: context.auth, store: context.store, propsValue: context.propsValue, files: context.files, }); }, async test(context) { return await pollingHelper.test(polling, { auth: context.auth, store: context.store, propsValue: context.propsValue, files: context.files, }); }, });

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