import * as z from "zod" import { defineAction } from "../../../automation/actions" import { ASANA_PAGE_INFO_SCHEMA, ASANA_PROVIDER_PAGE_SCHEMA, ASANA_PROVIDER_TEAM_SCHEMA, ASANA_PROVIDER_USER_SCHEMA, ASANA_TEAM_SCHEMA, ASANA_USER_SCHEMA, getAsanaApi, toAsanaPageInfo, toAsanaTeam, toAsanaUser, } from "@automate.ax/integration-contracts/asana" import { ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE } from "./scopes" const TEAM_FIELDS = "gid,name,resource_type,description,html_description,organization.gid,organization.name,organization.resource_type,permalink_url" const USER_FIELDS = "gid,name,resource_type,email,photo.image_128x128,workspaces.gid,workspaces.name,workspaces.resource_type" const TEAM_RESPONSE_SCHEMA = z.looseObject({ data: ASANA_PROVIDER_TEAM_SCHEMA }) const TEAM_PAGE_RESPONSE_SCHEMA = ASANA_PROVIDER_PAGE_SCHEMA.extend({ data: ASANA_PROVIDER_TEAM_SCHEMA.array(), }) const USER_PAGE_RESPONSE_SCHEMA = ASANA_PROVIDER_PAGE_SCHEMA.extend({ data: ASANA_PROVIDER_USER_SCHEMA.array(), }) const PAGE_INPUT_SCHEMA = z.object({ limit: z.number().int().min(1).max(100).prefault(100), offset: z.string().min(1).optional(), }) /** Gets one Asana team. */ export const getAsanaTeam = defineAction("Get Asana team") .describe("Gets one Asana team visible to the connected account.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input(z.object({ teamId: z.string().min(1) })) .output(ASANA_TEAM_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => toAsanaTeam( ( await getAsanaApi(account.secret).call(`/teams/${input.teamId}`, { query: { opt_fields: TEAM_FIELDS }, responseSchema: TEAM_RESPONSE_SCHEMA, }) ).data, ), ) /** Lists teams in an Asana workspace. */ export const listAsanaWorkspaceTeams = defineAction( "List Asana workspace teams", ) .describe("Lists teams in an Asana workspace or organization.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input(PAGE_INPUT_SCHEMA.extend({ workspaceId: z.string().min(1) })) .output( z.object({ pageInfo: ASANA_PAGE_INFO_SCHEMA, teams: ASANA_TEAM_SCHEMA.array(), }), ) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => { const result = await getAsanaApi(account.secret).call( `/workspaces/${input.workspaceId}/teams`, { query: { limit: input.limit, offset: input.offset, opt_fields: TEAM_FIELDS, }, responseSchema: TEAM_PAGE_RESPONSE_SCHEMA, }, ) return { pageInfo: toAsanaPageInfo(result), teams: result.data.map(toAsanaTeam), } }) /** Lists users in an Asana team. */ export const listAsanaTeamUsers = defineAction("List Asana team users") .describe("Lists users who belong to an Asana team.") .account(ASANA_ACCOUNT, ASANA_DEFAULT_SCOPE) .input(PAGE_INPUT_SCHEMA.extend({ teamId: 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( `/teams/${input.teamId}/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), } })