diff --git a/backend/app/api/v1/events.py b/backend/app/api/v1/events.py
index 13aacd4..847558b 100644
--- a/backend/app/api/v1/events.py
+++ b/backend/app/api/v1/events.py
@@ -1,5 +1,5 @@
import logging
-from datetime import datetime
+from datetime import datetime, timezone
from typing import Any
from fastapi import APIRouter, Body, Depends, HTTPException, Query
@@ -100,10 +100,18 @@ def post_event(
return JSONResponse(status_code=status_code, content=body.model_dump(mode="json"))
-def _parse_optional_dt(value: str | None) -> datetime | None:
+def _parse_optional_dt(value: str | None, *, end_of_day: bool = False) -> datetime | None:
if not value:
return None
- return datetime.fromisoformat(value.replace("Z", "+00:00"))
+ raw = value.strip()
+ if len(raw) == 10 and raw[4] == "-" and raw[7] == "-":
+ dt = datetime.fromisoformat(raw)
+ if dt.tzinfo is None:
+ dt = dt.replace(tzinfo=timezone.utc)
+ if end_of_day:
+ return dt.replace(hour=23, minute=59, second=59, microsecond=999999)
+ return dt.replace(hour=0, minute=0, second=0, microsecond=0)
+ return datetime.fromisoformat(raw.replace("Z", "+00:00"))
@router.get("", response_model=EventListResponse)
@@ -137,7 +145,7 @@ def list_events(
stmt = stmt.where(Host.hostname.ilike(like) | Host.display_name.ilike(like))
count_stmt = count_stmt.where(Host.hostname.ilike(like) | Host.display_name.ilike(like))
dt_from = _parse_optional_dt(from_time)
- dt_to = _parse_optional_dt(to_time)
+ dt_to = _parse_optional_dt(to_time, end_of_day=True)
if dt_from:
stmt = stmt.where(Event.occurred_at >= dt_from)
count_stmt = count_stmt.where(Event.occurred_at >= dt_from)
diff --git a/backend/app/version.py b/backend/app/version.py
index 37fd662..5759b2c 100644
--- a/backend/app/version.py
+++ b/backend/app/version.py
@@ -1,5 +1,5 @@
"""Единый источник версии SAC (API, health, логи, OpenAPI)."""
APP_NAME = "Security Alert Center"
-APP_VERSION = "0.7.0"
+APP_VERSION = "0.7.1"
APP_VERSION_LABEL = f"{APP_NAME} v.{APP_VERSION}"
diff --git a/backend/tests/test_health.py b/backend/tests/test_health.py
index 3ecb3ba..a4e941e 100644
--- a/backend/tests/test_health.py
+++ b/backend/tests/test_health.py
@@ -4,6 +4,6 @@ from app.version import APP_NAME, APP_VERSION, APP_VERSION_LABEL
def test_version_constants():
- assert APP_VERSION == "0.7.0"
+ assert APP_VERSION == "0.7.1"
assert APP_NAME == "Security Alert Center"
- assert APP_VERSION_LABEL == "Security Alert Center v.0.7.0"
+ assert APP_VERSION_LABEL == "Security Alert Center v.0.7.1"
diff --git a/frontend/package.json b/frontend/package.json
index 3fd9200..5cf835a 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "sac-ui",
"private": true,
- "version": "0.7.0",
+ "version": "0.7.1",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/frontend/src/utils/eventsListQuery.ts b/frontend/src/utils/eventsListQuery.ts
new file mode 100644
index 0000000..4ce30d1
--- /dev/null
+++ b/frontend/src/utils/eventsListQuery.ts
@@ -0,0 +1,80 @@
+/** Query params for /events list — preserved when opening event detail and going back. */
+
+import type { LocationQuery } from "vue-router";
+
+export interface EventsListState {
+ page: number;
+ q: string;
+ severity: string;
+ type: string;
+ hostname: string;
+ dateFrom: string;
+ dateTo: string;
+}
+
+const LIST_KEYS = ["page", "q", "severity", "type", "hostname", "from", "to"] as const;
+
+function queryString(value: unknown): string {
+ if (typeof value === "string") return value;
+ if (Array.isArray(value) && typeof value[0] === "string") return value[0];
+ return "";
+}
+
+export function parseEventsListQuery(query: LocationQuery): EventsListState {
+ const pageRaw = parseInt(queryString(query.page), 10);
+ return {
+ page: Number.isFinite(pageRaw) && pageRaw > 0 ? pageRaw : 1,
+ q: queryString(query.q),
+ severity: queryString(query.severity),
+ type: queryString(query.type),
+ hostname: queryString(query.hostname),
+ dateFrom: queryString(query.from),
+ dateTo: queryString(query.to),
+ };
+}
+
+export function buildEventsListQuery(state: EventsListState): Record
{{ error }}
Загрузка…
@@ -32,7 +41,7 @@