import { asanaRequest } from './client.ts' import { mapTask, TASK_FIELDS } from './models.ts' import type { AsanaAuthInput, AsanaPageInfo, AsanaTaskSummary } from './types.ts' import { clampInt, compactRecord, optionalString, requireRecord, } from './types.ts' import { requireAuthMode } from './auth.ts' export type ListTasksInput = AsanaAuthInput & { /** Project GID. Required unless `assignee` and `workspaceGid` are set. */ projectGid?: string /** Assignee GID or `me`. Required with `workspaceGid` when `projectGid` is omitted. */ assignee?: string workspaceGid?: string completedSince?: string modifiedSince?: string limit?: number offset?: string } export type ListTasksResult = { items: Array pageInfo: AsanaPageInfo } /** * List Asana tasks. Pass `projectGid`, or both `assignee` and `workspaceGid`. * @example * import listTasks from 'kody:@kody/asana/list-tasks' * const { items } = await listTasks({ projectGid: '123', limit: 25 }) */ export async function listTasks(input: ListTasksInput = {}): Promise { const projectGid = optionalString(input.projectGid, 'projectGid') const assignee = optionalString(input.assignee, 'assignee') const workspaceGid = optionalString(input.workspaceGid, 'workspaceGid') if (!projectGid && !(assignee && workspaceGid)) { throw new Error( 'list-tasks requires projectGid, or both assignee and workspaceGid (assignee may be "me").', ) } const limit = clampInt(input.limit, 1, 100, 25) const result = await asanaRequest>({ ...input, operation: 'tasks.read', path: '/tasks', query: compactRecord({ project: projectGid, assignee, workspace: workspaceGid, completed_since: optionalString(input.completedSince, 'completedSince'), modified_since: optionalString(input.modifiedSince, 'modifiedSince'), limit, offset: optionalString(input.offset, 'offset'), opt_fields: TASK_FIELDS, }), }) return { items: (Array.isArray(result.data) ? result.data : []).map(mapTask), pageInfo: result.pageInfo, } } /** * List Asana tasks. Pass `projectGid`, or both `assignee` and `workspaceGid`. * @example * import listTasks from 'kody:@kody/asana/list-tasks' * const result = await listTasks({ assignee: 'me', workspaceGid: '123' }) */ export default async function listTasksEntrypoint( params: ListTasksInput & Record = {}, ) { const input = requireRecord(params, 'list-tasks') return listTasks({ projectGid: optionalString(input.projectGid, 'projectGid'), assignee: optionalString(input.assignee, 'assignee'), workspaceGid: optionalString(input.workspaceGid, 'workspaceGid'), completedSince: optionalString(input.completedSince, 'completedSince'), modifiedSince: optionalString(input.modifiedSince, 'modifiedSince'), limit: input.limit as number | undefined, offset: optionalString(input.offset, 'offset'), integrationName: optionalString(input.integrationName, 'integrationName'), integration: optionalString(input.integration, 'integration'), account: optionalString(input.account, 'account'), secretName: optionalString(input.secretName, 'secretName'), auth: requireAuthMode(input.auth), }) }