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")
|