"""Pydantic-схемы для работы с логами административного API.""" from __future__ import annotations from datetime import datetime from typing import Any from pydantic import BaseModel, Field class MonitoringLogEntry(BaseModel): """Запись лога мониторинга.""" id: int event_type: str = Field(..., description='Тип события мониторинга') message: str = Field(..., description='Краткое описание события') data: dict[str, Any] | None = 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: int | None actor_telegram_id: int | None = None is_moderator: bool action: str ticket_id: int | None target_user_id: int | None details: dict[str, Any] | None = 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: datetime | None = 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: str | None = Field( default=None, description='Относительный путь до endpoint для скачивания лог-файла', ) class SystemLogFullResponse(BaseModel): """Полное содержимое системного лог-файла.""" path: str exists: bool updated_at: datetime | None = None size_bytes: int size_chars: int content: str