File size: 1,376 Bytes
7952f32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""High-level API layer that wires models, storage, and validators together."""

from __future__ import annotations

from graphforge.sample_repos.task_manager.models import Task
from graphforge.sample_repos.task_manager.storage import TaskStore
from graphforge.sample_repos.task_manager.validators import validate_priority, validate_tags, validate_title

_store = TaskStore()


def create_task(
    title: str,
    priority: str = "medium",
    tags: list[str] | None = None,
) -> Task:
    """Create and persist a new task.

    Raises ValueError if title or tags are invalid.
    """
    if not validate_title(title):
        raise ValueError(f"Invalid title: {title!r}")
    resolved_tags = tags or []
    if not validate_tags(resolved_tags):
        raise ValueError(f"Invalid tags: {resolved_tags!r}")
    task = Task(title=title, priority=priority, tags=resolved_tags)
    _store.add(task)
    return task


def get_all_tasks() -> list[Task]:
    """Return every task in the store."""
    return _store.all()


def complete_task(title: str) -> bool:
    """Mark a task done by title. Returns True if found, False otherwise."""
    task = _store.find_by_title(title)
    if task:
        task.complete()
        return True
    return False


def reset_store() -> None:
    """Clear the store — used by tests between runs."""
    global _store
    _store = TaskStore()