Skip to content

src/reopen.ts

28 lines · 1.0 KB · TypeScript
Raw
import { InputError, parseInput } from './lib/validate.ts'
import { byField, idField } from './lib/fields.ts'
import { line, mutateTodo, normalizeId, resolveTimeZone } from './lib/store.ts'

/**
 * Reopen a done todo/task, or restore a deleted (archived) one, in the shared todo list.
 *
 * @param input - `{ id: string, by: string }`
 * @returns `{ todo, line }`
 *
 * @example
 * import reopenTodo from 'kody:@charlesmatte/todos/reopen'
 *
 * await reopenTodo({ id: 'T12', by: 'assistant' })
 */
export default async function reopenTodo(input: unknown) {
	const p = parseInput<{ id: string; by: string }>(input, { id: idField, by: byField }, 'todos/reopen')
	const todo = await mutateTodo(normalizeId(p.id), p.by, 'reopened', (t) => {
		if (t.status === 'open' && !t.deleted) throw new InputError(`${t.id} is already open.`)
		const changes = { status: t.status, deleted: t.deleted }
		t.status = 'open'
		t.completedAt = null
		t.deleted = false
		t.deletedAt = null
		return { from: changes }
	})
	return { todo, line: line(todo, await resolveTimeZone()) }
}