2026-05-12 09:53:20 +08:00

56 lines
1.2 KiB
Go

package health
import (
"context"
"time"
"hyapp-admin-server/internal/repository"
)
type RedisHealth interface {
Ping(context.Context) error
}
type JobStatusProvider interface {
Status() map[string]any
}
type HealthService struct {
store *repository.Store
redis RedisHealth
jobs JobStatusProvider
timeout time.Duration
}
func NewService(store *repository.Store, redis RedisHealth, jobs JobStatusProvider, timeout time.Duration) *HealthService {
return &HealthService{store: store, redis: redis, jobs: jobs, timeout: timeout}
}
func (s *HealthService) Health() map[string]any {
return map[string]any{"status": "ok"}
}
func (s *HealthService) Ready(ctx context.Context) (map[string]any, error) {
ctx, cancel := context.WithTimeout(ctx, s.timeout)
defer cancel()
status := map[string]any{"status": "ready", "dependencies": map[string]any{}}
deps := status["dependencies"].(map[string]any)
if err := s.store.Ping(); err != nil {
deps["mysql"] = "down"
return status, err
}
deps["mysql"] = "ok"
if s.redis != nil {
if err := s.redis.Ping(ctx); err != nil {
deps["redis"] = "down"
return status, err
}
deps["redis"] = "ok"
}
if s.jobs != nil {
deps["jobs"] = s.jobs.Status()
}
return status, nil
}