import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getGoogleFormsApi, normalizeForm, normalizeFormId, resolveInsertionIndex, toGoogleFormItem, } from "@automate.ax/integration-contracts/google-forms" import { GOOGLE_FORMS_WRITE_REQUIREMENT } from "../lib/scopes" import { FORM_ITEM_INPUT_SCHEMA, FORM_REFERENCE_SCHEMA, FORM_SCHEMA, } from "@automate.ax/integration-contracts/google-forms" /** Adds a question, grid, section, text block, image, or video to a form. */ export const addGoogleFormItem = defineAction("Add Google form item") .describe("Adds an item at a one-based position or appends it.") .account("google", GOOGLE_FORMS_WRITE_REQUIREMENT) .input( z.object({ /** Form ID or standard Google Forms URL. */ form: FORM_REFERENCE_SCHEMA, /** Item to add. */ item: FORM_ITEM_INPUT_SCHEMA, /** One-based insertion position. Omit to append. */ position: z.number().int().positive().optional(), /** Rejects the update unless this is the latest revision ID. */ requiredRevisionId: z.string().min(1).optional(), }), ) .output(FORM_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const formsApi = getGoogleFormsApi(account.secret) const formId = normalizeFormId(input.form) const { data } = await formsApi.forms.batchUpdate({ formId, requestBody: { includeFormInResponse: true, requests: [ { createItem: { item: toGoogleFormItem(input.item), location: { index: await resolveInsertionIndex( formsApi, formId, input.position, ), }, }, }, ], writeControl: input.requiredRevisionId ? { requiredRevisionId: input.requiredRevisionId } : undefined, }, }) if (!data.form) throw new Error("Google Forms did not return the form.") return normalizeForm(data.form) })