# 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, Response from pathlib import Path # Importa o middleware de CORS from fastapi.middleware.cors import CORSMiddleware # 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 # Carrega as configurações do app config = Config.get('app.json') # Instancia o app FastAPI com um título personalizado app = FastAPI(title='Monitoramento Orius') # Registra o controle de erros personalizados register_exception_handlers(app) # --------------------------------------------------------------------------- # MIDDLEWARE DE LOG — DEVE VIR *ANTES* DO CORS, MAS NÃO INTERCEPTAR OPTIONS # --------------------------------------------------------------------------- @app.middleware("http") async def log_tempo_requisicao(request: Request, call_next): # Ignora requisições OPTIONS (preflight) if request.method == "OPTIONS": return Response(status_code=200) # Ação responsável por registrar o log de requisição log = Log() config = Config.get('app.json') # Obtém os dados da requisição log_data = { "method": request.method, "url": str(request.url), "headers": dict(request.headers) } # Gera o nome do arquivo de log file = Path(config.log.request.path) / config.log.request.name # Registra as requisições log.register(log_data, file) # Passa adiante para o próximo middleware response = await call_next(request) return response # --------------------------------------------------------------------------- # CORS — DEVE SER ADICIONADO *DEPOIS* DOS MIDDLEWARES CUSTOMIZADOS # --------------------------------------------------------------------------- app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:3000", # ambiente local "https://monitoring.oriustecnologia.com", # domínio de produção "https://painel.oriustecnologia.com", # se o painel consome essa API ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # --------------------------------------------------------------------------- # HANDLER OPCIONAL PARA GARANTIR QUE PRE-FLIGHT SEMPRE RESPONDA # --------------------------------------------------------------------------- @app.options("/{rest_of_path:path}") async def preflight_handler(rest_of_path: str): """ Handler global para requisições OPTIONS (preflight CORS). Garante que o navegador receba status 200 mesmo que a rota não exista. """ return Response(status_code=200) # --------------------------------------------------------------------------- # EVENTOS DE STARTUP # --------------------------------------------------------------------------- @app.on_event("startup") async def on_startup(): # Realiza as verificações do servidor startupCheckService = StartupCheckService() print(startupCheckService.execute()) # --------------------------------------------------------------------------- # ROTAS PRINCIPAIS DA API # --------------------------------------------------------------------------- app.include_router(api_router, prefix=config.url) # --------------------------------------------------------------------------- # EXECUÇÃO LOCAL DIRETA # --------------------------------------------------------------------------- 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 )