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_QUESTION_INPUT_SCHEMA, FORM_REFERENCE_SCHEMA, FORM_SCHEMA, QUESTION_GRADING_INPUT_SCHEMA, } from "@automate.ax/integration-contracts/google-forms" /** Adds a high-level question definition to a form. */ export const addGoogleFormQuestion = defineAction("Add Google form question") .describe("Adds a typed question at a one-based position or appends it.") .account("google", GOOGLE_FORMS_WRITE_REQUIREMENT) .input( z.object({ /** Description displayed beneath the question. */ description: z.string().optional(), /** Form ID or standard Google Forms URL. */ form: FORM_REFERENCE_SCHEMA, /** Optional quiz grading configuration. */ grading: QUESTION_GRADING_INPUT_SCHEMA.optional(), /** One-based insertion position. Omit to append. */ position: z.number().int().positive().optional(), /** Typed question configuration. */ question: FORM_QUESTION_INPUT_SCHEMA, /** Rejects the update unless this is the latest revision ID. */ requiredRevisionId: z.string().min(1).optional(), /** Question title visible to respondents. */ title: z.string().trim().min(1), }), ) .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({ description: input.description, grading: input.grading, question: input.question, title: input.title, type: "question", }), 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) })