factuges-document-signing-s.../src/signing_service/main.py

110 lines
3.3 KiB
Python
Raw Normal View History

2026-02-10 12:39:18 +00:00
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware
2026-01-22 10:37:35 +00:00
from dotenv import load_dotenv
2026-01-29 17:35:43 +00:00
from pathlib import Path
from datetime import datetime
from dateutil import tz
2026-01-22 10:37:35 +00:00
2026-02-10 12:39:18 +00:00
2026-01-22 10:37:35 +00:00
from signing_service.application.settings.container import get_settings
2026-01-29 17:35:43 +00:00
from signing_service.application.settings.setup_logger import create_logger
from signing_service.api.routes.sign_document import router as sign_router
2026-02-03 15:23:25 +00:00
from signing_service.application.settings.version import get_package_version
2026-01-22 10:37:35 +00:00
load_dotenv()
# 👇 FAIL FAST: load settings at startup
2026-01-29 17:35:43 +00:00
settings = get_settings()
version = get_package_version()
local_tz = tz.gettz(settings.local_tz)
state_path = Path(settings.state_path)
# Logging
2026-01-30 10:36:16 +00:00
log_dir = state_path
2026-01-29 17:35:43 +00:00
log_dir.mkdir(parents=True, exist_ok=True)
logger = create_logger(
name="factuges-document-signing-service",
2026-02-03 15:23:25 +00:00
# Solo lo genera en producción
log_path=log_dir / "factuges-document-signing-service.log",
2026-01-29 17:35:43 +00:00
)
logger.info("")
logger.info("============================================================")
logger.info("FactuGES Document Signing Service - START ")
logger.info("Version: %s", version)
logger.info("UTC Now: %s", datetime.utcnow().isoformat())
logger.info("Environment: %s", settings.app_env)
logger.info("")
logger.info("Log Level: %s", settings.log_level)
logger.info("Log: %s", log_dir / "factuges-document-signing-service.log")
logger.info("")
logger.info("Secret Provider: %s", settings.secret_provider)
logger.info("Infisical project ID: %s", settings.infisical_project_id)
logger.info("Infisical environment: %s", settings.infisical_env_slug)
logger.info("")
2026-01-22 10:37:35 +00:00
2026-02-10 12:39:18 +00:00
async def http_exception_handler(request: Request, exc: HTTPException):
logger.error(
"HTTPException %s %s | status=%s | detail=%s",
request.method,
request.url.path,
exc.status_code,
exc.detail,
)
return JSONResponse(
status_code=exc.status_code,
content={"detail": exc.detail},
)
# Define logging middleware
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
# Log request details
client_ip = request.client.host
method = request.method
url = request.url.path
logger.info(f"Request: {method} {url} from {client_ip}")
# Process the request
response = await call_next(request)
# Log response details
status_code = response.status_code
logger.info(
f"Response: {method} {url} returned {status_code} to {client_ip}")
return response
2026-02-03 15:23:25 +00:00
app = FastAPI(title="FactuGES Document Signing Service", version=version)
2026-02-10 12:39:18 +00:00
2026-02-03 15:23:25 +00:00
app.add_event_handler("startup", lambda: logger.info(
"Application startup complete"))
2026-02-10 12:39:18 +00:00
2026-02-03 15:23:25 +00:00
app.add_event_handler("shutdown", lambda: logger.info(
"Application shutdown complete"))
2026-02-10 12:39:18 +00:00
app.add_exception_handler(HTTPException, http_exception_handler)
# Add middleware to the app
app.add_middleware(LoggingMiddleware)
2026-01-29 17:35:43 +00:00
# Register routers
2026-01-22 10:37:35 +00:00
app.include_router(sign_router)
2026-01-29 17:35:43 +00:00
logger.info("API routes registered from sign_document router")
2026-01-22 10:37:35 +00:00
2026-01-29 17:35:43 +00:00
app.add_api_route("/health", lambda: {"status": "ok"}, methods=["GET"])
logger.info("Health check endpoint registered at /health")
2026-02-03 15:23:25 +00:00
app.add_api_route("/version", lambda: {"version": version}, methods=["GET"])
logger.info("Health check endpoint registered at /version")