]> git.ipfire.org Git - dbl.git/commitdiff
api: Create the reports search endpoint
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Mar 2026 14:34:55 +0000 (14:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Mar 2026 14:34:55 +0000 (14:34 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/dbl/api/lists.py
src/dbl/api/reports.py
src/dbl/lists.py
src/dbl/reports.py

index 41f17926e5d8f64f367e497e728f964565b55c78..563e09d460d621a0e6f564338be8c859fce256cd 100644 (file)
@@ -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(
index 27940e2b55682fc939d971c286ccb07207d9f960..57e01ef7d069fb30412b447bde0e4b0cd7e58cca 100644 (file)
@@ -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(
index de5309ce6f98a86098a675b64736c2829ee33df0..51223b9f313aacaebae064a3c7cc17c129ebcb31 100644 (file)
@@ -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):
index 6e1876dad7f630b4b08a017eab3653dbd4c5640a..39c5351bd0cbcf6625b103f636c6e499f4b51284 100644 (file)
@@ -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