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 } }