Skip to content

Commit

Permalink
WIP: Add notes endpoint
Browse files Browse the repository at this point in the history
Done

- add /notes router
- add get_notes func in Storage class

Undone

- allow multiple topic_id and post_id filters in get_notes()
- write tests for the endpoint
  • Loading branch information
kota-yata committed Mar 10, 2024
1 parent 8e7f6be commit 33b27f1
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
11 changes: 9 additions & 2 deletions birdxplorer/routers/data.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
from typing import List
from typing import List, Union

from fastapi import APIRouter

from ..models import BaseModel, ParticipantId, Topic, UserEnrollment
from ..models import BaseModel, ParticipantId, Topic, UserEnrollment, Note
from ..storage import Storage


class TopicListResponse(BaseModel):
data: List[Topic]

class NoteListResponse(BaseModel):
data: List[Note]


def gen_router(storage: Storage) -> APIRouter:
router = APIRouter()
Expand All @@ -23,5 +26,9 @@ def get_user_enrollment_by_participant_id(participant_id: ParticipantId) -> User
@router.get("/topics", response_model=TopicListResponse)
def get_topics() -> TopicListResponse:
return TopicListResponse(data=list(storage.get_topics()))

@router.get("/notes", response_model=NoteListResponse)
def get_notes(created_at_from: Union[int, None] = None, created_at_to: Union[int, None] = None, topic_id: Union[str, None] = None, post_id: Union[str, None] = None, language: Union[str, None] = None) -> NoteListResponse:
return NoteListResponse(data=list(storage.get_notes(created_at_from, created_at_to, topic_id, post_id, language)))

return router
15 changes: 15 additions & 0 deletions birdxplorer/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,21 @@ def get_topics(self) -> Generator[TopicModel, None, None]:
yield TopicModel(
topic_id=topic_record.topic_id, label=topic_record.label, reference_count=reference_count or 0
)
def get_notes(self, created_at_from, created_at_to, topic_id, post_id, language) -> Generator[NoteRecord, None, None]:
with Session(self.engine) as sess:
query = sess.query(NoteRecord)
if created_at_from:
query = query.filter(NoteRecord.created_at >= created_at_from)
if created_at_to:
query = query.filter(NoteRecord.created_at <= created_at_to)
if topic_id:
query = query.join(NoteTopicAssociation).filter(NoteTopicAssociation.topic_id == topic_id)
if post_id:
query = query.filter(NoteRecord.post_id == post_id)
if language:
query = query.filter(NoteRecord.language == language)
for note_record in query.all():
yield note_record


def gen_storage(settings: GlobalSettings) -> Storage:
Expand Down

0 comments on commit 33b27f1

Please sign in to comment.