Source code for byte_api.domain.system.controllers.system

"""System Controller."""

from __future__ import annotations

from typing import TYPE_CHECKING

from litestar import Controller, MediaType, get
from litestar.response import Response

from byte_api.domain import urls
from byte_api.domain.system.dtos import SystemHealth
from byte_api.domain.system.helpers import check_byte_status, check_database_status
from byte_api.lib import log

if TYPE_CHECKING:
    from sqlalchemy.ext.asyncio import AsyncSession

__all__ = ["SystemController"]

logger = log.get_logger()


[docs] class SystemController(Controller): """System Controller.""" opt = {"exclude_from_auth": True} @get( operation_id="SystemHealth", name="system:health", path=urls.SYSTEM_HEALTH, media_type=MediaType.JSON, cache=False, tags=["System"], summary="Health Check", description="Execute a health check against backend components including database and bot status.", signature_namespace={"SystemHealth": SystemHealth}, ) async def check_system_health(self, db_session: AsyncSession) -> Response[SystemHealth]: """Check the overall system health. Args: db_session (AsyncSession): Database session. Returns: Response[SystemHealth]: System health. """ database_status = await check_database_status(db_session) byte_status = await check_byte_status() statuses = [database_status, byte_status] if all(status == "offline" for status in statuses): overall_status = "offline" elif "offline" in statuses or "degraded" in statuses: overall_status = "degraded" else: overall_status = "healthy" status_code = 200 if overall_status == "healthy" else 503 if overall_status == "degraded" else 500 # noinspection PyTypeChecker system_health_detail = SystemHealth( database_status=database_status, byte_status=byte_status, overall_status=overall_status, ) return Response( content=system_health_detail, status_code=status_code, media_type=MediaType.JSON, )