Skip to content

src/delete.ts

35 lines · 1.2 KB · TypeScript
Raw
import { InputError, parseInput } from './lib/validate.ts'
import { byField, idField } from './lib/fields.ts'
import { mutateTodo, normalizeId, purgeTodo, requireTodo } from './lib/store.ts'

/**
 * Delete a todo/task from the shared todo list. Default is a soft delete (archived, hidden from list/digest,
 * restorable with ./reopen). `purge: true` removes it permanently — only when the user explicitly asks.
 *
 * @param input - `{ id: string, by: string, purge?: boolean }`
 * @returns `{ id, deleted: true, purged }`
 *
 * @example
 * import deleteTodo from 'kody:@charlesmatte/todos/delete'
 *
 * await deleteTodo({ id: 'T12', by: 'assistant' })
 */
export default async function deleteTodo(input: unknown) {
	const p = parseInput<{ id: string; by: string; purge?: boolean }>(
		input,
		{ id: idField, by: byField, purge: { type: 'boolean' } },
		'todos/delete',
	)
	const id = normalizeId(p.id)
	if (p.purge) {
		await requireTodo(id)
		await purgeTodo(id)
		return { id, deleted: true, purged: true }
	}
	await mutateTodo(id, p.by, 'deleted', (t) => {
		if (t.deleted) throw new InputError(`${t.id} is already deleted.`)
		t.deleted = true
		t.deletedAt = new Date().toISOString()
	})
	return { id, deleted: true, purged: false }
}