Files
mcr/internal/server/admin_routes.go
Kyle Isom d5580f01f2 Migrate module path from kyle/ to mc/ org
All import paths updated to git.wntrmute.dev/mc/. Bumps mcdsl to v1.2.0.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 02:05:59 -07:00

57 lines
1.9 KiB
Go

package server
import (
"github.com/go-chi/chi/v5"
"git.wntrmute.dev/mc/mcr/internal/db"
)
// AdminDeps holds the dependencies needed by admin routes.
type AdminDeps struct {
DB *db.DB
Login LoginClient
Engine PolicyReloader
AuditFn AuditFunc
GCState *GCState
}
// MountAdminRoutes adds admin REST endpoints to the router.
// Auth middleware is applied at the route group level.
func MountAdminRoutes(r chi.Router, validator TokenValidator, serviceName string, deps AdminDeps) {
// Health endpoint - no auth required.
r.Get("/v1/health", AdminHealthHandler())
// Auth endpoints - no bearer auth required (login uses credentials).
r.Post("/v1/auth/login", AdminLoginHandler(deps.Login))
// Authenticated endpoints.
r.Route("/v1", func(v1 chi.Router) {
v1.Use(RequireAuth(validator, serviceName))
// Logout.
v1.Post("/auth/logout", AdminLogoutHandler())
// Repositories - list and detail require auth, delete requires admin.
v1.Get("/repositories", AdminListReposHandler(deps.DB))
v1.Get("/repositories/*", AdminGetRepoHandler(deps.DB))
v1.With(RequireAdmin()).Delete("/repositories/*", AdminDeleteRepoHandler(deps.DB, deps.AuditFn))
// Policy - all require admin.
v1.Route("/policy/rules", func(pr chi.Router) {
pr.Use(RequireAdmin())
pr.Get("/", AdminListPolicyRulesHandler(deps.DB))
pr.Post("/", AdminCreatePolicyRuleHandler(deps.DB, deps.Engine, deps.AuditFn))
pr.Get("/{id}", AdminGetPolicyRuleHandler(deps.DB))
pr.Patch("/{id}", AdminUpdatePolicyRuleHandler(deps.DB, deps.Engine, deps.AuditFn))
pr.Delete("/{id}", AdminDeletePolicyRuleHandler(deps.DB, deps.Engine, deps.AuditFn))
})
// Audit - requires admin.
v1.With(RequireAdmin()).Get("/audit", AdminListAuditHandler(deps.DB))
// GC - requires admin.
v1.With(RequireAdmin()).Post("/gc", AdminTriggerGCHandler(deps.GCState))
v1.With(RequireAdmin()).Get("/gc/status", AdminGCStatusHandler(deps.GCState))
})
}