From: Michael Tremer Date: Tue, 3 Mar 2026 14:34:55 +0000 (+0000) Subject: api: Create the reports search endpoint X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bf4fa4e83fe9230d9b9d49acf5dc6f5b64725e1f;p=dbl.git api: Create the reports search endpoint Signed-off-by: Michael Tremer --- diff --git a/src/dbl/api/lists.py b/src/dbl/api/lists.py index 41f1792..563e09d 100644 --- a/src/dbl/api/lists.py +++ b/src/dbl/api/lists.py @@ -83,7 +83,9 @@ async def get_list_reports( name: str | None = None, limit: int | None = None ) -> typing.List[reports.Report]: - return [report async for report in list.get_reports(open=open, name=name, limit=limit)] + reports = backend.reports.get(list=list, open=open, name=name, limit=limit) + + return [report async for report in reports] @router.get("/{list}/domains/{name}") async def get_list_domains( diff --git a/src/dbl/api/reports.py b/src/dbl/api/reports.py index 27940e2..57e01ef 100644 --- a/src/dbl/api/reports.py +++ b/src/dbl/api/reports.py @@ -78,8 +78,27 @@ async def get_report_from_path(id: uuid.UUID = fastapi.Path(...)) -> reports.Rep return report @router.get("") -async def get_reports() -> typing.List[reports.Report]: - return [l async for l in backend.reports] +async def get_reports( + list: str | None = None, + open: bool | None = None, + name: str | None = None, + limit: int | None = None, +) -> typing.List[reports.Report]: + # Fetch the list + list = await backend.lists.get_by_slug(list) + if not list: + raise fastapi.HTTPException(400, "Could not find list '%s'" % list) + + # Fetch all reports + reports = backend.reports.get( + list = list, + open = open, + name = name, + limit = limit, + ) + + # Return all matched reports as list + return [report async for report in reports] @router.post("") async def create_report( diff --git a/src/dbl/lists.py b/src/dbl/lists.py index de5309c..51223b9 100644 --- a/src/dbl/lists.py +++ b/src/dbl/lists.py @@ -550,55 +550,6 @@ class List(sqlmodel.SQLModel, database.BackendMixin, table=True): # Reports reports : typing.List["Report"] = sqlmodel.Relationship(back_populates="list") - def get_reports(self, open=None, name=None, reported_by=None, limit=None): - """ - Fetches the most recent reports - """ - # Only use the UID of any users - if isinstance(reported_by, users.User): - reported_by = reported_by.uid - - stmt = ( - sqlmodel - .select( - reports.Report, - ) - .where( - reports.Report.list == self, - ) - .order_by( - reports.Report.reported_at.desc(), - ) - ) - - # Filter for open/closed reports only - if open is True: - stmt = stmt.where( - reports.Report.closed_at == None, - ) - elif open is False: - stmt = stmt.where( - not reports.Report.closed_at == None, - ) - - # Optionally filter by name - if name: - stmt = stmt.where( - reports.Report.name == name, - ) - - # Optionally filter by reporter - if reported_by: - stmt = stmt.where( - reports.Report.reported_by == reported_by, - ) - - # Optionally apply the limit - if limit: - stmt = stmt.limit(limit) - - return self.backend.db.fetch(stmt) - # Report! async def report(self, **kwargs): diff --git a/src/dbl/reports.py b/src/dbl/reports.py index 6e1876d..39c5351 100644 --- a/src/dbl/reports.py +++ b/src/dbl/reports.py @@ -65,6 +65,59 @@ class Reports(object): return await self.backend.db.fetch_one(stmt) + def get(self, list=None, open=None, name=None, reported_by=None, limit=None): + """ + Fetches the most recent reports + """ + # Only use the UID of any users + if isinstance(reported_by, users.User): + reported_by = reported_by.uid + + # Start the statement + stmt = ( + sqlmodel + .select( + Report, + ) + .order_by( + Report.reported_at.desc(), + ) + ) + + # Filter by list + if list: + stmt = stmt.where( + Report.list == list, + ) + + # Filter for open/closed reports only + if open is True: + stmt = stmt.where( + Report.closed_at == None, + ) + elif open is False: + stmt = stmt.where( + not Report.closed_at == None, + ) + + # Optionally filter by name + if name: + stmt = stmt.where( + Report.name == name, + ) + + # Optionally filter by reporter + if reported_by: + stmt = stmt.where( + Report.reported_by == reported_by, + ) + + # Optionally apply the limit + if limit: + stmt = stmt.limit(limit) + + return self.backend.db.fetch(stmt) + async def create(self, reported_by, comment=None, **kwargs): """ Creates a new report