File size: 1,999 Bytes
64c1bdf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from __future__ import annotations

from datetime import datetime

from fastapi import APIRouter, Query

from app.api.deps import IntentExtractorDep, SessionDep
from app.domain import Source
from app.errors import InvalidRequestError, NotFoundError
from app.repositories import NoteRepository
from app.schemas.common import Page
from app.schemas.notes import NoteCreate, NoteDetailOut, NoteOut, NoteProcessResponse
from app.services.pipeline import NotePipeline

router = APIRouter(prefix="/api/notes", tags=["notes"])


@router.post("", response_model=NoteProcessResponse, status_code=201)
def create_note(
    payload: NoteCreate,
    session: SessionDep,
    extractor: IntentExtractorDep,
) -> NoteProcessResponse:
    pipeline = NotePipeline(session, extractor)
    return pipeline.process(payload.text, Source.TEXT)


@router.get("", response_model=Page[NoteOut])
def list_notes(
    session: SessionDep,
    source: Source | None = None,
    created_from: datetime | None = None,
    created_to: datetime | None = None,
    task_id: str | None = None,
    limit: int = Query(default=20, ge=1, le=100),
    offset: int = Query(default=0, ge=0),
) -> Page[NoteOut]:
    if created_from and created_to and created_from > created_to:
        raise InvalidRequestError("created_from must be on or before created_to")

    notes, total = NoteRepository(session).list(
        source=source,
        created_from=created_from,
        created_to=created_to,
        task_id=task_id,
        limit=limit,
        offset=offset,
    )
    return Page(
        items=[NoteOut.model_validate(note) for note in notes],
        total=total,
        limit=limit,
        offset=offset,
    )


@router.get("/{note_id}", response_model=NoteDetailOut)
def get_note(note_id: str, session: SessionDep) -> NoteDetailOut:
    note = NoteRepository(session).get(note_id, with_task=True)
    if note is None:
        raise NotFoundError(f"Note {note_id!r} not found")
    return NoteDetailOut.model_validate(note)