# Ajuste para garantir que o diretório base do projeto seja incluído no PYTHONPATH import os import sys # Adiciona o diretório atual (onde está o main.py) ao sys.path sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) # Importa a classe principal do FastAPI from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles import os from pathlib import Path # Importa o middleware de CORS from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import Response from starlette.middleware.base import BaseHTTPMiddleware # Importa middleware de captura de erros junto ao banco de dados from middlewares.error_handler import database_error_handler # Importa o roteador principal da API versão 1 from packages.v1.api import api_router from packages.v1.system.service.startup_check_service import StartupCheckService # Importa as configurações globais da aplicação from actions.log.log import Log from actions.config.config import Config from actions.system.handlers import register_exception_handlers config = Config.get("app.json") # Instancia o app FastAPI com um título personalizado app = FastAPI(title="Mirror | Orius") # 1. Defina o caminho local absoluto da sua pasta de arquivos STORAGE_DIR = "/app/storage" # 2. Opcional: Crie o diretório se ele não existir if not os.path.isdir(STORAGE_DIR): os.makedirs(STORAGE_DIR) # 3. Monte o diretório estático # Isso mapeia o caminho local STORAGE_DIR para o prefixo de URL '/storage-files' prefix = date.today().strftime("%Y%m%d") app.mount( "/" + prefix, # <- ESTE É O PREFIXO DA URL PÚBLICA StaticFiles(directory=STORAGE_DIR), name="storage_access", ) # Adiciona o middleware global de erro # app.middleware("http")(database_error_handler) # Controle de erros personalizados register_exception_handlers(app) # Adiciona o middleware de CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], # Domínio do frontend allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.on_event("startup") async def on_startup(): # Realiza as verificações do servidor startupCheckService = StartupCheckService() # Exibe o amarzenamento do servidor print(startupCheckService.execute()) @app.middleware("http") async def log_tempo_requisicao(request: Request, call_next): # Ação responsavel por registrar o log de requisição log = Log() config = Config.get("app.json") # Obtem os dados da requisição log_data = { "method": request.method, "url": str(request.url), "headers": dict(request.headers), } # Gera o nome do arquivo file = Path(config.log.request.path) / config.log.request.name # Registra as requisições log.register(log_data, file) # Passa adiante response = await call_next(request) return response # Inclui as rotas da versão 1 da API com prefixo definido em settings (ex: /api/v1) app.include_router(api_router, prefix=config.url) # Executa o servidor com Uvicorn se este arquivo for executado diretamente if __name__ == "__main__": import uvicorn uvicorn.run( "main:app", # Caminho do app para execução host="0.0.0.0", # Disponibiliza a aplicação externamente port=8000, # Porta padrão log_level="info", # Define o nível de log para desenvolvimento reload=True, # Ativa auto-reload durante desenvolvimento )