- 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>
30 lines
1.1 KiB
Python
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
|
|
} |