import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getAsanaApi } from "@automate.ax/integration-contracts/asana" import { ASANA_PAGE_INFO_SCHEMA, ASANA_PROVIDER_PAGE_SCHEMA, ASANA_PROVIDER_USER_SCHEMA, ASANA_PROVIDER_WORKSPACE_SCHEMA, ASANA_USER_SCHEMA, ASANA_WORKSPACE_SCHEMA, toAsanaPageInfo, toAsanaUser, toAsanaWorkspace, } from "@automate.ax/integration-contracts/asana" import { ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE } from "./scopes" const USER_FIELDS = "gid,name,resource_type,email,photo.image_128x128,workspaces.gid,workspaces.name,workspaces.resource_type" const WORKSPACE_FIELDS = "gid,name,resource_type,email_domains,is_organization" const PAGE_INPUT_SCHEMA = z.object({ /** Maximum resources to return. */ limit: z.number().int().min(1).max(100).prefault(100), /** Opaque token returned by the previous page. */ offset: z.string().min(1).optional(), }) const USER_RESPONSE_SCHEMA = z.looseObject({ data: ASANA_PROVIDER_USER_SCHEMA }) const WORKSPACE_PAGE_RESPONSE_SCHEMA = ASANA_PROVIDER_PAGE_SCHEMA.extend({ data: ASANA_PROVIDER_WORKSPACE_SCHEMA.array(), }) const USER_PAGE_RESPONSE_SCHEMA = ASANA_PROVIDER_PAGE_SCHEMA.extend({ data: ASANA_PROVIDER_USER_SCHEMA.array(), }) /** Gets the Asana user represented by the connected account. */ export const getCurrentAsanaUser = defineAction("Get current Asana user") .describe( "Gets the user identity represented by the connected Asana account.", ) .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .output(ASANA_USER_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account }) => toAsanaUser( ( await getAsanaApi(account.secret).call("/users/me", { query: { opt_fields: USER_FIELDS }, responseSchema: USER_RESPONSE_SCHEMA, }) ).data, ), ) /** Gets an Asana user by GID. */ export const getAsanaUser = defineAction("Get Asana user") .describe("Gets a user visible to the connected Asana account.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input(z.object({ userId: z.string().min(1) })) .output(ASANA_USER_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => toAsanaUser( ( await getAsanaApi(account.secret).call(`/users/${input.userId}`, { query: { opt_fields: USER_FIELDS }, responseSchema: USER_RESPONSE_SCHEMA, }) ).data, ), ) /** Lists workspaces and organizations available to the connected user. */ export const listAsanaWorkspaces = defineAction("List Asana workspaces") .describe("Lists workspaces and organizations available to the Asana user.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input(PAGE_INPUT_SCHEMA) .output( z.object({ pageInfo: ASANA_PAGE_INFO_SCHEMA, workspaces: ASANA_WORKSPACE_SCHEMA.array(), }), ) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => { const result = await getAsanaApi(account.secret).call("/workspaces", { query: { limit: input.limit, offset: input.offset, opt_fields: WORKSPACE_FIELDS, }, responseSchema: WORKSPACE_PAGE_RESPONSE_SCHEMA, }) return { pageInfo: toAsanaPageInfo(result), workspaces: result.data.map(toAsanaWorkspace), } }) /** Lists users who belong to an Asana workspace or organization. */ export const listAsanaWorkspaceUsers = defineAction( "List Asana workspace users", ) .describe("Lists users belonging to an Asana workspace or organization.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input( PAGE_INPUT_SCHEMA.extend({ /** Workspace or organization GID. */ workspaceId: z.string().min(1), }), ) .output( z.object({ pageInfo: ASANA_PAGE_INFO_SCHEMA, users: ASANA_USER_SCHEMA.array(), }), ) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => { const result = await getAsanaApi(account.secret).call( `/workspaces/${input.workspaceId}/users`, { query: { limit: input.limit, offset: input.offset, opt_fields: USER_FIELDS, }, responseSchema: USER_PAGE_RESPONSE_SCHEMA, }, ) return { pageInfo: toAsanaPageInfo(result), users: result.data.map(toAsanaUser), } })