import { JOB_NIMBUS_CONTACT_SCHEMA, jobNimbusPageSchema, } from "@automate.ax/integration-contracts/jobnimbus" import * as z from "zod" import { defineAction } from "../../../automation/actions" import { JOB_NIMBUS_ACCOUNT, getJobNimbusApi, JOB_NIMBUS_ADDRESS_FIELDS, JOB_NIMBUS_ID_SCHEMA, JOB_NIMBUS_LIST_FIELDS, JOB_NIMBUS_MUTATION_FIELDS, JOB_NIMBUS_WORKFLOW_INPUT_FIELDS, hasJobNimbusUpdate, jobNimbusListQuery, jobNimbusMutationQuery, } from "./lib" const CONTACT_FIELDS = { ...JOB_NIMBUS_ADDRESS_FIELDS, ...JOB_NIMBUS_WORKFLOW_INPUT_FIELDS, company: z.string().nullable().optional(), displayName: z.string().nullable().optional(), email: z.email().nullable().optional(), faxNumber: z.string().nullable().optional(), firstName: z.string().nullable().optional(), homePhone: z.string().nullable().optional(), lastName: z.string().nullable().optional(), mobilePhone: z.string().nullable().optional(), website: z.string().nullable().optional(), workPhone: z.string().nullable().optional(), } const CREATE_CONTACT_SCHEMA = z .object({ ...CONTACT_FIELDS, ...JOB_NIMBUS_MUTATION_FIELDS, recordTypeName: z.string().trim().min(1), statusName: z.string().trim().min(1), }) .refine( ({ company, displayName, firstName, lastName }) => Boolean(company || displayName || firstName || lastName), { message: "Provide company, displayName, firstName, or lastName for the contact.", }, ) /** Lists JobNimbus contacts with documented offset and filter controls. */ export const listJobNimbusContacts = defineAction("List JobNimbus contacts") .describe("Lists JobNimbus contacts with offset pagination and filters.") .account(JOB_NIMBUS_ACCOUNT) .input(z.object(JOB_NIMBUS_LIST_FIELDS)) .output(jobNimbusPageSchema(JOB_NIMBUS_CONTACT_SCHEMA)) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => getJobNimbusApi(account.secret, "public").request("contacts", { query: jobNimbusListQuery(input), responseSchema: jobNimbusPageSchema(JOB_NIMBUS_CONTACT_SCHEMA), }), ) /** Retrieves one JobNimbus contact by JNID. */ export const getJobNimbusContact = defineAction("Get JobNimbus contact") .describe("Retrieves one JobNimbus contact by ID.") .account(JOB_NIMBUS_ACCOUNT) .input( z.object({ actor: z.email().optional(), contactId: JOB_NIMBUS_ID_SCHEMA }), ) .output(JOB_NIMBUS_CONTACT_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => getJobNimbusApi(account.secret, "public").request( `contacts/${encodeURIComponent(input.contactId)}`, { query: { actor: input.actor }, responseSchema: JOB_NIMBUS_CONTACT_SCHEMA, }, ), ) /** Creates a JobNimbus contact in a configured contact workflow. */ export const createJobNimbusContact = defineAction("Create JobNimbus contact") .describe("Creates a JobNimbus contact in a configured workflow and status.") .account(JOB_NIMBUS_ACCOUNT) .input(CREATE_CONTACT_SCHEMA) .output(JOB_NIMBUS_CONTACT_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const { actor, bulk, skip, ...body } = input return getJobNimbusApi(account.secret, "public").request("contacts", { body, method: "POST", query: jobNimbusMutationQuery({ actor, bulk, skip }), responseSchema: JOB_NIMBUS_CONTACT_SCHEMA, }) }) /** Updates mutable fields on one JobNimbus contact. */ export const updateJobNimbusContact = defineAction("Update JobNimbus contact") .describe("Updates mutable fields on one JobNimbus contact.") .account(JOB_NIMBUS_ACCOUNT) .input( z .object({ ...CONTACT_FIELDS, ...JOB_NIMBUS_MUTATION_FIELDS, contactId: JOB_NIMBUS_ID_SCHEMA, }) .refine( (input) => hasJobNimbusUpdate(input, ["actor", "bulk", "contactId", "skip"]), "Provide a contact field to update.", ), ) .output(JOB_NIMBUS_CONTACT_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const { actor, bulk, contactId, skip, ...body } = input return getJobNimbusApi(account.secret, "public").request( `contacts/${encodeURIComponent(contactId)}`, { body: { ...body, jnid: contactId }, method: "PUT", query: jobNimbusMutationQuery({ actor, bulk, skip }), responseSchema: JOB_NIMBUS_CONTACT_SCHEMA, }, ) }) /** Archives a JobNimbus contact using the provider's soft-delete behavior. */ export const archiveJobNimbusContact = defineAction("Archive JobNimbus contact") .describe("Archives a JobNimbus contact by setting isActive to false.") .account(JOB_NIMBUS_ACCOUNT) .input( z.object({ ...JOB_NIMBUS_MUTATION_FIELDS, contactId: JOB_NIMBUS_ID_SCHEMA, }), ) .output(JOB_NIMBUS_CONTACT_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => getJobNimbusApi(account.secret, "public").request( `contacts/${encodeURIComponent(input.contactId)}`, { body: { isActive: false, jnid: input.contactId }, method: "PUT", query: jobNimbusMutationQuery(input), responseSchema: JOB_NIMBUS_CONTACT_SCHEMA, }, ), )