Files
remnawave-bedolaga-telegram…/app/webapi/schemas/logs.py
T

102 lines
3.8 KiB
Python

"""Pydantic-схемы для работы с логами административного API."""
from __future__ import annotations
from datetime import datetime
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class MonitoringLogEntry(BaseModel):
"""Запись лога мониторинга."""
id: int
event_type: str = Field(..., description="Тип события мониторинга")
message: str = Field(..., description="Краткое описание события")
data: Optional[Dict[str, Any]] = Field(
default=None,
description="Дополнительные данные события",
)
is_success: bool = Field(..., description="Флаг успешности выполнения операции")
created_at: datetime = Field(..., description="Дата и время создания записи")
class MonitoringLogListResponse(BaseModel):
"""Ответ со списком логов мониторинга."""
total: int = Field(..., ge=0)
limit: int = Field(..., ge=1)
offset: int = Field(..., ge=0)
items: List[MonitoringLogEntry]
class MonitoringLogTypeListResponse(BaseModel):
"""Ответ со списком доступных типов событий мониторинга."""
items: List[str] = Field(default_factory=list)
class SupportAuditLogEntry(BaseModel):
"""Запись аудита модераторов поддержки."""
id: int
actor_user_id: Optional[int]
actor_telegram_id: int
is_moderator: bool
action: str
ticket_id: Optional[int]
target_user_id: Optional[int]
details: Optional[Dict[str, Any]] = None
created_at: datetime
class SupportAuditLogListResponse(BaseModel):
"""Ответ со списком аудита поддержки."""
total: int = Field(..., ge=0)
limit: int = Field(..., ge=1)
offset: int = Field(..., ge=0)
items: List[SupportAuditLogEntry]
class SupportAuditActionsResponse(BaseModel):
"""Ответ со списком доступных действий аудита поддержки."""
items: List[str] = Field(default_factory=list)
class SystemLogPreviewResponse(BaseModel):
"""Ответ с превью системного лог-файла бота."""
path: str = Field(..., description="Абсолютный путь до лог-файла")
exists: bool = Field(..., description="Флаг наличия лог-файла")
updated_at: Optional[datetime] = Field(
default=None,
description="Дата и время последнего изменения лог-файла",
)
size_bytes: int = Field(..., ge=0, description="Размер лог-файла в байтах")
size_chars: int = Field(..., ge=0, description="Количество символов в лог-файле")
preview: str = Field(
default="",
description="Фрагмент содержимого лог-файла, возвращаемый для предпросмотра",
)
preview_chars: int = Field(..., ge=0, description="Размер предпросмотра в символах")
preview_truncated: bool = Field(
..., description="Флаг усечения предпросмотра относительно полного файла"
)
download_url: Optional[str] = Field(
default=None,
description="Относительный путь до endpoint для скачивания лог-файла",
)
class SystemLogFullResponse(BaseModel):
"""Полное содержимое системного лог-файла."""
path: str
exists: bool
updated_at: Optional[datetime] = None
size_bytes: int
size_chars: int
content: str