import { tallySchema } from "@automate.ax/integration-contracts/tally" import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getTallyApi, TALLY_ACCOUNT, TALLY_API_KEY_ACCOUNT, TALLY_EMPTY_SCHEMA, TALLY_ID_SCHEMA, } from "../lib" const SUBMISSION_INPUT_SCHEMA = z.object({ formId: TALLY_ID_SCHEMA, submissionId: TALLY_ID_SCHEMA, }) /** Lists completed or partial submissions for one Tally form. */ export const listTallyFormSubmissions = defineAction( "List Tally form submissions", ) .describe("Lists form submissions with response and date filters.") .account(TALLY_ACCOUNT, TALLY_API_KEY_ACCOUNT) .input( z.object({ afterId: TALLY_ID_SCHEMA.optional(), endDate: z.iso.datetime({ offset: true }).optional(), filter: z.enum(["all", "completed", "partial"]).optional(), formId: TALLY_ID_SCHEMA, limit: z.number().int().min(1).max(500).optional(), page: z.number().int().positive().optional(), startDate: z.iso.datetime({ offset: true }).optional(), }), ) .output(tallySchema("GetFormsFormIdSubmissionsResponse")) .retry({ replaySafety: "safe" }) .handler(({ account, input: { formId, ...query } }) => getTallyApi(account).request( `forms/${encodeURIComponent(formId)}/submissions`, { query, responseSchema: "GetFormsFormIdSubmissionsResponse" }, ), ) /** Gets one Tally form submission and its question definitions. */ export const getTallyFormSubmission = defineAction("Get Tally form submission") .describe("Gets one submission with all responses and form questions.") .account(TALLY_ACCOUNT, TALLY_API_KEY_ACCOUNT) .input(SUBMISSION_INPUT_SCHEMA) .output(tallySchema("GetFormsFormIdSubmissionsSubmissionIdResponse")) .retry({ replaySafety: "safe" }) .handler(({ account, input }) => getTallyApi(account).request( `forms/${encodeURIComponent(input.formId)}/submissions/${encodeURIComponent(input.submissionId)}`, { responseSchema: "GetFormsFormIdSubmissionsSubmissionIdResponse" }, ), ) /** Moves one Tally form submission to the trash. */ export const deleteTallyFormSubmission = defineAction( "Delete Tally form submission", ) .describe("Moves one form submission to the Tally trash.") .account(TALLY_ACCOUNT, TALLY_API_KEY_ACCOUNT) .input(SUBMISSION_INPUT_SCHEMA) .output(TALLY_EMPTY_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { await getTallyApi(account).requestVoid( `forms/${encodeURIComponent(input.formId)}/submissions/${encodeURIComponent(input.submissionId)}`, { method: "DELETE" }, ) return {} })