MirrorAPI/main.py

117 lines
3.4 KiB
Python

# 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(
"/storage-files", # <- 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
)