Skip to content
← Public packages

@kody/google

Call Gmail, Calendar, Tasks, Drive, Docs, Sheets, People, YouTube, and Analytics through saved Google OAuth.

src/tasks.ts

177 lines · 4.7 KB · TypeScript
import { requestGoogle } from './core.ts'
import type { GoogleAuthParams } from './accounts.ts'
import type { JsonObject } from './types.ts'

export type TasksListParams = GoogleAuthParams & {
	maxResults?: number
	pageToken?: string
}

export type TaskListGetParams = GoogleAuthParams & {
	tasklist: string
}

export type TasksQueryParams = GoogleAuthParams & {
	tasklist: string
	maxResults?: number
	pageToken?: string
	showCompleted?: boolean
	showHidden?: boolean
	showDeleted?: boolean
	dueMin?: string
	dueMax?: string
	completedMin?: string
	completedMax?: string
	updatedMin?: string
}

export type TaskGetParams = GoogleAuthParams & {
	tasklist: string
	task: string
}

export type TaskMutationParams = GoogleAuthParams & {
	tasklist: string
	task?: JsonObject
	dryRun?: boolean
}

export type TaskUpdateParams = TaskMutationParams & {
	taskId: string
}

export type TaskDeleteParams = GoogleAuthParams & {
	tasklist: string
	taskId: string
	dryRun?: boolean
}

/**
 * Return the Google Tasks helper namespace for task lists and tasks.
 * @returns Helper namespace or overview for this Google product.
 * @example
 * import tasks from 'kody:@kody/google/tasks'
 * const lists = await tasks().listTaskLists()
 */
export default function tasks() {
	return { listTaskLists, getTaskList, listTasks, getTask, createTask, updateTask, deleteTask }
}

export async function listTaskLists(params: TasksListParams = {}): Promise<JsonObject> {
	const { maxResults = 20, pageToken } = params
	return (await requestGoogle({
		...params,
		api: 'google',
		path: '/tasks/v1/users/@me/lists',
		query: { maxResults, pageToken },
	})) as JsonObject
}

export async function getTaskList(params: TaskListGetParams): Promise<JsonObject> {
	if (!params.tasklist) throw new Error('getTaskList requires tasklist.')
	return (await requestGoogle({
		...params,
		api: 'google',
		path: '/tasks/v1/users/@me/lists/' + encodeURIComponent(params.tasklist),
	})) as JsonObject
}

export async function listTasks(params: TasksQueryParams): Promise<JsonObject> {
	if (!params.tasklist) throw new Error('listTasks requires tasklist.')
	const {
		tasklist,
		maxResults = 20,
		pageToken,
		showCompleted,
		showHidden,
		showDeleted,
		dueMin,
		dueMax,
		completedMin,
		completedMax,
		updatedMin,
	} = params
	return (await requestGoogle({
		...params,
		api: 'google',
		path: '/tasks/v1/lists/' + encodeURIComponent(tasklist) + '/tasks',
		query: {
			maxResults,
			pageToken,
			showCompleted,
			showHidden,
			showDeleted,
			dueMin,
			dueMax,
			completedMin,
			completedMax,
			updatedMin,
		},
	})) as JsonObject
}

export async function getTask(params: TaskGetParams): Promise<JsonObject> {
	if (!params.tasklist) throw new Error('getTask requires tasklist.')
	if (!params.task) throw new Error('getTask requires task.')
	return (await requestGoogle({
		...params,
		api: 'google',
		path:
			'/tasks/v1/lists/' +
			encodeURIComponent(params.tasklist) +
			'/tasks/' +
			encodeURIComponent(params.task),
	})) as JsonObject
}

export async function createTask(params: TaskMutationParams): Promise<JsonObject> {
	const { tasklist, task, dryRun = false } = params
	if (!tasklist) throw new Error('createTask requires tasklist.')
	if (!task || typeof task !== 'object') throw new Error('createTask requires task.')
	if (dryRun) return { dryRun: true, account: params.account, tasklist, task }
	return (await requestGoogle({
		...params,
		api: 'google',
		method: 'POST',
		path: '/tasks/v1/lists/' + encodeURIComponent(tasklist) + '/tasks',
		body: task,
	})) as JsonObject
}

export async function updateTask(params: TaskUpdateParams): Promise<JsonObject> {
	const { tasklist, taskId, task, dryRun = false } = params
	if (!tasklist) throw new Error('updateTask requires tasklist.')
	if (!taskId) throw new Error('updateTask requires taskId.')
	if (!task || typeof task !== 'object') throw new Error('updateTask requires task.')
	if (dryRun) return { dryRun: true, account: params.account, tasklist, taskId, task }
	return (await requestGoogle({
		...params,
		api: 'google',
		method: 'PATCH',
		path:
			'/tasks/v1/lists/' +
			encodeURIComponent(tasklist) +
			'/tasks/' +
			encodeURIComponent(taskId),
		body: task,
	})) as JsonObject
}

export async function deleteTask(params: TaskDeleteParams): Promise<JsonObject | null> {
	const { tasklist, taskId, dryRun = false } = params
	if (!tasklist) throw new Error('deleteTask requires tasklist.')
	if (!taskId) throw new Error('deleteTask requires taskId.')
	if (dryRun) return { dryRun: true, account: params.account, tasklist, taskId, wouldDelete: true }
	await requestGoogle({
		...params,
		api: 'google',
		method: 'DELETE',
		path:
			'/tasks/v1/lists/' +
			encodeURIComponent(tasklist) +
			'/tasks/' +
			encodeURIComponent(taskId),
	})
	return null
}