import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getGoogleFormsApi, normalizeFormId, } from "@automate.ax/integration-contracts/google-forms" import { GOOGLE_FORMS_WRITE_REQUIREMENT } from "../lib/scopes" import { FORM_REFERENCE_SCHEMA, PUBLISH_SETTINGS_SCHEMA, } from "@automate.ax/integration-contracts/google-forms" /** Publishes, unpublishes, opens, or closes a modern Google Form. */ export const setGoogleFormPublishing = defineAction( "Set Google form publishing", ) .describe("Sets whether a form is visible and accepting responses.") .account("google", GOOGLE_FORMS_WRITE_REQUIREMENT) .input( z .object({ /** Form ID or standard Google Forms URL. */ form: FORM_REFERENCE_SCHEMA, /** Whether respondents can submit responses. */ isAcceptingResponses: z.boolean(), /** Whether the form is published and visible to respondents. */ isPublished: z.boolean(), }) .refine( ({ isAcceptingResponses, isPublished }) => !isAcceptingResponses || isPublished, "A form cannot accept responses while unpublished.", ), ) .output( z.object({ /** Immutable Google Form ID. */ formId: z.string(), /** Updated publishing state. */ publishSettings: PUBLISH_SETTINGS_SCHEMA, }), ) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const { data } = await getGoogleFormsApi( account.secret, ).forms.setPublishSettings({ formId: normalizeFormId(input.form), requestBody: { publishSettings: { publishState: { isAcceptingResponses: input.isAcceptingResponses, isPublished: input.isPublished, }, }, updateMask: "publishState", }, }) return { formId: data.formId ?? normalizeFormId(input.form), publishSettings: { isAcceptingResponses: data.publishSettings?.publishState?.isAcceptingResponses ?? input.isAcceptingResponses, isPublished: data.publishSettings?.publishState?.isPublished ?? input.isPublished, }, } })