| from __future__ import annotations |
|
|
| from datetime import datetime |
| from pathlib import Path |
| from typing import Optional |
|
|
| from .storage import JsonStorage |
|
|
|
|
| STORE = JsonStorage(Path(__file__).resolve().parents[1] / "data" / "tasks.json", []) |
|
|
|
|
| def list_tasks() -> list[dict]: |
| tasks = STORE.read() |
| return sorted(tasks, key=lambda item: (item.get("completed", False), item.get("created_at", ""))) |
|
|
|
|
| def add_task(text: str) -> dict: |
| tasks = STORE.read() |
| next_id = max((task["id"] for task in tasks), default=0) + 1 |
| task = { |
| "id": next_id, |
| "text": text.strip(), |
| "completed": False, |
| "created_at": datetime.now().isoformat(), |
| } |
| tasks.append(task) |
| STORE.write(tasks) |
| return task |
|
|
|
|
| def complete_task(task_id: int) -> Optional[dict]: |
| tasks = STORE.read() |
| updated = None |
| for task in tasks: |
| if task["id"] == task_id: |
| task["completed"] = True |
| task["completed_at"] = datetime.now().isoformat() |
| updated = task |
| break |
| if updated: |
| STORE.write(tasks) |
| return updated |
|
|
|
|
| def delete_task(task_id: int) -> Optional[dict]: |
| tasks = STORE.read() |
| kept: list[dict] = [] |
| removed = None |
| for task in tasks: |
| if task["id"] == task_id: |
| removed = task |
| continue |
| kept.append(task) |
| if removed: |
| STORE.write(kept) |
| return removed |
|
|