TorbatYar/backend/services/communication/app/api/v1/health.py
Mortezakoohjani e41ecfad4c Sync platform docs, infra, and module services with Accounting integration.
Include Loyalty/Communication/Sports Center backends and registry updates alongside production nginx and compose wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-25 22:35:23 +03:30

58 lines
1.8 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app import __version__
from app.api.deps import get_db
from app.core.config import settings
from app.core.database import engine
from app.providers import supported_channels
from app.services.monitoring_service import CapabilityService
router = APIRouter()
@router.get("/health")
async def health_check():
"""Liveness probe — does not touch the database."""
return {
"status": "ok",
"service": settings.service_name,
"version": __version__,
"channels": [c["channel"] for c in supported_channels() if c["status"] == "active"],
}
@router.get("/health/ready")
async def readiness_check(session: AsyncSession = Depends(get_db)):
"""Readiness probe — verifies database connectivity."""
try:
await session.execute(select(1))
db_ok = True
except Exception: # noqa: BLE001
db_ok = False
status = "ok" if db_ok else "degraded"
return {
"status": status,
"service": settings.service_name,
"version": __version__,
"database": "up" if db_ok else "down",
"engine": str(engine.url).split("@")[-1] if engine.url else "unknown",
}
@router.get("/capabilities")
async def capabilities():
return CapabilityService().capabilities()
@router.get("/metrics")
async def metrics_root():
"""Service-level metrics summary (no tenant). Use /api/v1/monitoring/metrics for tenant metrics."""
return {
"service": settings.service_name,
"version": __version__,
"hint": "GET /api/v1/monitoring/metrics with X-Tenant-ID for tenant metrics",
"features": CapabilityService().capabilities()["features"],
}