Микросервис обучения портала: тесты, курсы, видео-уроки, доступы, public-ссылки для кандидатов с email-валидацией. В этой итерации: - Skeleton (config, migrate, main, health) по паттерну tasks/candidates - Migration 001_init: 10 таблиц (tests/questions/answers/attempts/ attempt_answers + courses/lessons/lesson_progress + access_grants + public_tokens) с подробными комментариями why - Tests: полный CRUD + вопросы/ответы; non-owner'у is_correct и explanation скрываются в выдаче - Заглушки 501 для attempts / courses / lessons / video-stream / access / public-tokens — следующие итерации - k8s: namespace, configmap, secrets, postgres, deployment с HPA, service с portal-discovery annotations - Dockerfile, Makefile, .gitignore См. README.md для полного списка отложенного и инструкций запуска. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
35 lines
994 B
Go
35 lines
994 B
Go
package handler
|
||
|
||
import (
|
||
"context"
|
||
"net/http"
|
||
"time"
|
||
|
||
"github.com/jackc/pgx/v5/pgxpool"
|
||
)
|
||
|
||
type HealthHandler struct {
|
||
pool *pgxpool.Pool
|
||
}
|
||
|
||
func NewHealthHandler(pool *pgxpool.Pool) *HealthHandler {
|
||
return &HealthHandler{pool: pool}
|
||
}
|
||
|
||
// Healthz — liveness. Не дёргает БД; жив если процесс отвечает.
|
||
func (h *HealthHandler) Healthz(w http.ResponseWriter, _ *http.Request) {
|
||
writeJSON(w, http.StatusOK, map[string]string{"status": "ok"})
|
||
}
|
||
|
||
// Readyz — readiness. Один Ping к БД с таймаутом — если не отвечает,
|
||
// k8s выкидывает pod из service-балансира.
|
||
func (h *HealthHandler) Readyz(w http.ResponseWriter, r *http.Request) {
|
||
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
|
||
defer cancel()
|
||
if err := h.pool.Ping(ctx); err != nil {
|
||
writeError(w, http.StatusServiceUnavailable, "db not ready")
|
||
return
|
||
}
|
||
writeJSON(w, http.StatusOK, map[string]string{"status": "ready"})
|
||
}
|