117 lines
3.4 KiB
Python
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(
|
|
"/" + 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
|
|
)
|