klg-asutk-app/backend/app/api/routes/legal/base.py
Yuriy 891e17972c fix(klg): безопасность, deps/security, attachments, CSP, api-client, удаление lib/api.ts
- deps: авторизация через app.services.security (JWT/OIDC), без oidc fallback
- main: AUTH_DEPENDENCY для роутеров, RequestLoggerMiddleware, убран on_event(startup)
- attachments: защита path traversal, проверка владельца/authority
- docker-compose: SECRET_KEY обязателен, отдельная БД keycloak-db
- middleware: ужесточён CSP (без unsafe-eval в prod, без api.openai.com)
- api-client: токен только в памяти, без sessionStorage
- cert_applications: _next_number с SELECT FOR UPDATE
- Удалён lib/api.ts, импорты на @/lib/api/api-client
- docs ERROR_HANDLING: aircraftApi.list(), middleware __init__.py

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-14 23:06:22 +03:00

30 lines
1.1 KiB
Python

from typing import Dict, Any, List
from fastapi import HTTPException
import logging
logger = logging.getLogger(__name__)
class LegalBaseHandler:
"""Базовый класс для обработчиков legal модулей"""
def __init__(self):
self.logger = logger
def validate_request(self, data: Dict[str, Any]) -> bool:
"""Базовая валидация запросов"""
if not data:
raise HTTPException(status_code=400, detail="Empty request data")
return True
def handle_error(self, error: Exception, context: str = ""):
"""Унифицированная обработка ошибок"""
self.logger.error(f"Error in {context}: {str(error)}")
raise HTTPException(status_code=500, detail="Internal server error")
def format_response(self, data: Any, message: str = "Success") -> Dict[str, Any]:
"""Стандартный формат ответов"""
return {
"status": "success",
"message": message,
"data": data
}