using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Swashbuckle.AspNetCore.Annotations; using SPMS.Domain.Common; using SPMS.Infrastructure; using SPMS.Infrastructure.Messaging; namespace SPMS.API.Controllers; [ApiController] [Route("v1/out")] [AllowAnonymous] [ApiExplorerSettings(GroupName = "public")] public class PublicController : ControllerBase { private readonly AppDbContext _dbContext; private readonly RabbitMQConnection _rabbitConnection; private readonly RabbitMQInitializer _rabbitInitializer; public PublicController( AppDbContext dbContext, RabbitMQConnection rabbitConnection, RabbitMQInitializer rabbitInitializer) { _dbContext = dbContext; _rabbitConnection = rabbitConnection; _rabbitInitializer = rabbitInitializer; } [HttpPost("health")] [SwaggerOperation(Summary = "서버 상태 확인", Description = "MariaDB, Redis, RabbitMQ 연결 상태를 확인합니다.")] public async Task HealthCheckAsync() { var checks = new Dictionary(); var allHealthy = true; // 1. MariaDB 연결 확인 try { await _dbContext.Database.ExecuteSqlRawAsync("SELECT 1"); checks["database"] = new { status = "healthy" }; } catch (Exception ex) { checks["database"] = new { status = "unhealthy", error = ex.Message }; allHealthy = false; } // 2. Redis 연결 확인 (Phase 3-2에서 구현 예정) checks["redis"] = new { status = "not_configured" }; // 3. RabbitMQ 연결 확인 var rabbitConnected = _rabbitConnection.IsConnected; var rabbitInitialized = _rabbitInitializer.IsInitialized; if (rabbitConnected && rabbitInitialized) { checks["rabbitmq"] = new { status = "healthy" }; } else { checks["rabbitmq"] = new { status = "unhealthy", connected = rabbitConnected, initialized = rabbitInitialized }; allHealthy = false; } if (allHealthy) { return Ok(ApiResponse.Success(checks)); } return StatusCode(503, ApiResponse.Fail( ErrorCodes.InternalError, "하나 이상의 서비스에 문제가 있습니다.")); } }