feat: allow filter events by timestamp

This commit is contained in:
2024-09-01 15:07:54 +03:00
parent 242f3d4d34
commit ddd3c3f06f
11 changed files with 93 additions and 10 deletions

View File

@ -30,6 +30,7 @@ class EventOperations(Operations):
"""
def event_get(self, event: str | EventType | None = None, object_id: str | None = None,
from_date: int | None = None, to_date: int | None = None,
limit: int = -1, offset: int = 0, repository_id: RepositoryId | None = None) -> list[Event]:
"""
get list of events with filters applied
@ -37,6 +38,8 @@ class EventOperations(Operations):
Args:
event(str | EventType | None, optional): filter by event type (Default value = None)
object_id(str | None, optional): filter by event object (Default value = None)
from_date(int | None, optional): minimal creation date, inclusive (Default value = None)
to_date(int | None, optional): maximal creation date, exclusive (Default value = None)
limit(int, optional): limit records to the specified count, -1 means unlimited (Default value = -1)
offset(int, optional): records offset (Default value = 0)
repository_id(RepositoryId, optional): repository unique identifier override (Default value = None)
@ -55,6 +58,8 @@ class EventOperations(Operations):
select * from auditlog
where (:event is null or event = :event)
and (:object_id is null or object_id = :object_id)
and (:from_date is null or created >= :from_date)
and (:to_date is null or created < :to_date)
and repository = :repository
order by created desc limit :limit offset :offset
) order by created asc
@ -63,6 +68,8 @@ class EventOperations(Operations):
"event": event,
"object_id": object_id,
"repository": repository_id.id,
"from_date": from_date,
"to_date": to_date,
"limit": limit,
"offset": offset,
}

View File

@ -93,6 +93,7 @@ class Client:
raise NotImplementedError
def event_get(self, event: str | EventType | None, object_id: str | None,
from_date: int | None = None, to_date: int | None = None,
limit: int = -1, offset: int = 0) -> list[Event]:
"""
retrieve list of events
@ -100,6 +101,8 @@ class Client:
Args:
event(str | EventType | None): filter by event type
object_id(str | None): filter by event object
from_date(int | None, optional): minimal creation date, inclusive (Default value = None)
to_date(int | None, optional): maximal creation date, exclusive (Default value = None)
limit(int, optional): limit records to the specified count, -1 means unlimited (Default value = -1)
offset(int, optional): records offset (Default value = 0)

View File

@ -59,6 +59,7 @@ class LocalClient(Client):
self.database.event_insert(event, self.repository_id)
def event_get(self, event: str | EventType | None, object_id: str | None,
from_date: int | None = None, to_date: int | None = None,
limit: int = -1, offset: int = 0) -> list[Event]:
"""
retrieve list of events
@ -66,13 +67,15 @@ class LocalClient(Client):
Args:
event(str | EventType | None): filter by event type
object_id(str | None): filter by event object
from_date(int | None, optional): minimal creation date, inclusive (Default value = None)
to_date(int | None, optional): maximal creation date, exclusive (Default value = None)
limit(int, optional): limit records to the specified count, -1 means unlimited (Default value = -1)
offset(int, optional): records offset (Default value = 0)
Returns:
list[Event]: list of audit log events
"""
return self.database.event_get(event, object_id, limit, offset, self.repository_id)
return self.database.event_get(event, object_id, from_date, to_date, limit, offset, self.repository_id)
def package_changes_get(self, package_base: str) -> Changes:
"""

View File

@ -71,7 +71,7 @@ class Watcher(LazyLogging):
event_add: Callable[[Event], None]
event_get: Callable[[str | EventType | None, str | None, int, int], list[Event]]
event_get: Callable[[str | EventType | None, str | None, int | None, int | None, int, int], list[Event]]
def load(self) -> None:
"""

View File

@ -178,6 +178,7 @@ class WebClient(Client, SyncAhrimanClient):
self.make_request("POST", self._events_url(), params=self.repository_id.query(), json=event.view())
def event_get(self, event: str | EventType | None, object_id: str | None,
from_date: int | None = None, to_date: int | None = None,
limit: int = -1, offset: int = 0) -> list[Event]:
"""
retrieve list of events
@ -185,6 +186,8 @@ class WebClient(Client, SyncAhrimanClient):
Args:
event(str | EventType | None): filter by event type
object_id(str | None): filter by event object
from_date(int | None, optional): minimal creation date, inclusive (Default value = None)
to_date(int | None, optional): maximal creation date, exclusive (Default value = None)
limit(int, optional): limit records to the specified count, -1 means unlimited (Default value = -1)
offset(int, optional): records offset (Default value = 0)
@ -196,6 +199,10 @@ class WebClient(Client, SyncAhrimanClient):
query.append(("event", str(event)))
if object_id is not None:
query.append(("object_id", object_id))
if from_date is not None:
query.append(("from_date", str(from_date)))
if to_date is not None:
query.append(("to_date", str(to_date)))
with contextlib.suppress(Exception):
response = self.make_request("GET", self._events_url(), params=query)

View File

@ -36,3 +36,11 @@ class EventSearchSchema(PaginationSchema):
"description": "Event object identifier",
"example": "ahriman",
})
from_date = fields.Integer(metadata={
"description": "Minimal creation timestamp, inclusive",
"example": 1680537091,
})
to_date = fields.Integer(metadata={
"description": "Maximal creation timestamp, exclusive",
"example": 1680537091,
})

View File

@ -158,7 +158,7 @@ class BaseView(View, CorsViewMixin):
value = extractor(key)
if not value:
raise KeyError(key)
except Exception:
except (KeyError, ValueError):
raise KeyError(f"Key {key} is missing or empty") from None
return value
@ -194,7 +194,7 @@ class BaseView(View, CorsViewMixin):
try:
limit = int(self.request.query.get("limit", default=-1))
offset = int(self.request.query.get("offset", default=0))
except Exception as ex:
except ValueError as ex:
raise HTTPBadRequest(reason=str(ex))
# some checks

View File

@ -64,8 +64,16 @@ class EventsView(BaseView):
limit, offset = self.page()
event = self.request.query.get("event") or None
object_id = self.request.query.get("object_id") or None
try:
from_date = to_date = None
if (value := self.request.query.get("from_date")) is not None:
from_date = int(value)
if (value := self.request.query.get("to_date")) is not None:
to_date = int(value)
except ValueError as ex:
raise HTTPBadRequest(reason=str(ex))
events = self.service().event_get(event, object_id, limit, offset)
events = self.service().event_get(event, object_id, from_date, to_date, limit, offset)
response = [event.view() for event in events]
return json_response(response)