add app review system with validation pipeline and admin htmx UI

This commit is contained in:
2026-01-18 21:35:43 +01:00
parent cf9f42b66d
commit fbcb5c9543
11 changed files with 1516 additions and 9 deletions

View File

@@ -43,6 +43,7 @@ func NewRouter(cfg *config.Config, db *database.DB) http.Handler {
authHandler := handlers.NewAuthHandler(oauthManager, jwtManager, db)
appHandler := handlers.NewAppHandler(db, store)
storeHandler := handlers.NewStoreHandler(db, store)
adminHandler := handlers.NewAdminHandler(db, store)
// Health check
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
@@ -127,14 +128,15 @@ func NewRouter(cfg *config.Config, db *database.DB) http.Handler {
})
})
// Admin routes (htmx UI) - requires auth
r.Route("/admin", func(r chi.Router) {
// Admin API routes (JSON responses)
r.Route("/api/admin", func(r chi.Router) {
r.Use(authMiddleware.RequireAuth)
r.Get("/", handlers.NotImplemented)
r.Get("/review-queue", handlers.NotImplemented)
r.Get("/review/{versionID}", handlers.NotImplemented)
r.Post("/review/{versionID}/approve", handlers.NotImplemented)
r.Post("/review/{versionID}/reject", handlers.NotImplemented)
r.Get("/stats", adminHandler.Dashboard)
r.Get("/review-queue", adminHandler.ReviewQueue)
r.Get("/review/{versionID}", adminHandler.ReviewDetail)
r.Post("/review/{versionID}/approve", adminHandler.ApproveVersion)
r.Post("/review/{versionID}/reject", adminHandler.RejectVersion)
r.Get("/review/{versionID}/validate", adminHandler.ValidatePackage)
})
// Web UI routes (htmx + Go templates)
@@ -142,6 +144,7 @@ func NewRouter(cfg *config.Config, db *database.DB) http.Handler {
if err != nil {
log.Printf("Warning: Failed to initialize web handler: %v", err)
} else {
webHandler.SetStorage(store)
sessionMW := web.NewSessionMiddleware(db, cfg.JWTSecret)
// Public web pages
@@ -163,6 +166,14 @@ func NewRouter(cfg *config.Config, db *database.DB) http.Handler {
// htmx partials
r.Get("/partials/apps", webHandler.AppListPartial)
// Admin pages (htmx UI)
r.Get("/admin/review-queue", webHandler.AdminReviewQueue)
r.Get("/admin/review/{versionID}", webHandler.AdminReviewDetail)
r.Get("/admin/partials/review-queue", webHandler.AdminReviewQueuePartial)
r.Post("/admin/review/{versionID}/approve", webHandler.AdminApprove)
r.Post("/admin/review/{versionID}/reject", webHandler.AdminReject)
r.Get("/admin/review/{versionID}/validate", webHandler.AdminValidate)
})
// Auth callback that sets session (after OAuth)