from io import BytesIO import logging from datetime import datetime import sys from typing import Annotated, List, Optional from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import StreamingResponse from pydantic import BaseModel from common import auth from common.common import configure_logging from components.services.log import LogService from schemas.log import LogCreateSchema, LogFilterSchema, LogSchema, PaginatedLogResponse import common.dependencies as DI import pandas as pd router = APIRouter(tags=['Logs']) logger = logging.getLogger(__name__) configure_logging() @router.get('/logs', response_model=PaginatedLogResponse) async def get_all_logs( filters: Annotated[LogFilterSchema, Depends()], log_service: Annotated[LogService, Depends(DI.get_log_service)], current_user: Annotated[any, Depends(auth.get_current_user)] ): logger.info(f"Fetching logsываыва with filters: {filters.model_dump(exclude_none=True)}") logger.info(f'GET /logs') try: return log_service.get_list(filters) except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get('/logs/excel') async def get_all_logs_excel( filters: LogFilterSchema = Depends(), log_service: LogService = Depends(DI.get_log_service), current_user: any = Depends(auth.get_current_user) ): logger.info(f'GET /logs/excel with filters: {filters.model_dump(exclude_none=True)}') try: # Получаем логи без пагинации (все записи по фильтру) filters.page = 1 filters.page_size = sys.maxsize logs_response = log_service.get_list(filters) logs_data = [ { 'ID': log.id, 'Date Created': log.date_created, 'User Name': log.user_name or '', 'Chat ID': log.chat_id or '', 'User Request': log.user_request or '', 'QE Result': log.qe_result or '', 'Search Result': log.search_result or '', 'LLM Result': log.llm_result or '' } for log in logs_response.data ] df = pd.DataFrame(logs_data) output = BytesIO() with pd.ExcelWriter(output, engine='openpyxl') as writer: df.to_excel(writer, index=False, sheet_name='Logs') headers = { 'Content-Disposition': 'attachment; filename="logs.xlsx"', 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' } output.seek(0) return StreamingResponse(output, headers=headers, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') except HTTPException as e: raise e except Exception as e: logger.error(f'Error generating Excel: {str(e)}') raise HTTPException(status_code=500, detail=str(e))