From f04cb6b8f2233b305b3ff700e76db88246b21d89 Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Tue, 5 May 2026 10:50:33 -0400 Subject: [PATCH] feat: add model groups CRUD admin API endpoints --- internal/server/model_groups_admin.go | 76 +++++++++++++++++++++++++++ internal/server/server.go | 5 ++ 2 files changed, 81 insertions(+) create mode 100644 internal/server/model_groups_admin.go diff --git a/internal/server/model_groups_admin.go b/internal/server/model_groups_admin.go new file mode 100644 index 00000000..327e7fe0 --- /dev/null +++ b/internal/server/model_groups_admin.go @@ -0,0 +1,76 @@ +package server + +import ( + "net/http" + + "gophergate/internal/db" + + "github.com/gin-gonic/gin" +) + +func (s *Server) handleGetModelGroups(c *gin.Context) { + var groups []db.ModelGroup + if err := s.database.Select(&groups, "SELECT * FROM model_groups ORDER BY id"); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + if groups == nil { + groups = []db.ModelGroup{} + } + c.JSON(http.StatusOK, groups) +} + +func (s *Server) handleCreateModelGroup(c *gin.Context) { + var group db.ModelGroup + if err := c.ShouldBindJSON(&group); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + _, err := s.database.Exec(` + INSERT INTO model_groups (id, strategy, selector_model, targets, complexity_threshold, heuristic_rules) + VALUES (?, ?, ?, ?, ?, ?)`, + group.ID, group.Strategy, group.SelectorModel, group.Targets, + group.ComplexityThreshold, group.HeuristicRules) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + s.refreshRouter() + c.JSON(http.StatusCreated, group) +} + +func (s *Server) handleUpdateModelGroup(c *gin.Context) { + id := c.Param("id") + var group db.ModelGroup + if err := c.ShouldBindJSON(&group); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + _, err := s.database.Exec(` + UPDATE model_groups SET strategy=?, selector_model=?, targets=?, complexity_threshold=?, heuristic_rules=?, updated_at=CURRENT_TIMESTAMP + WHERE id=?`, + group.Strategy, group.SelectorModel, group.Targets, + group.ComplexityThreshold, group.HeuristicRules, id) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + s.refreshRouter() + c.JSON(http.StatusOK, group) +} + +func (s *Server) handleDeleteModelGroup(c *gin.Context) { + id := c.Param("id") + _, err := s.database.Exec("DELETE FROM model_groups WHERE id=?", id) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + s.refreshRouter() + c.JSON(http.StatusOK, gin.H{"status": "deleted"}) +} diff --git a/internal/server/server.go b/internal/server/server.go index 95e297a9..2e69a18e 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -276,6 +276,11 @@ func (s *Server) setupRoutes() { admin.GET("/models", s.handleGetModels) admin.PUT("/models/:id", s.handleUpdateModel) + admin.GET("/model-groups", s.handleGetModelGroups) + admin.POST("/model-groups", s.handleCreateModelGroup) + admin.PUT("/model-groups/:id", s.handleUpdateModelGroup) + admin.DELETE("/model-groups/:id", s.handleDeleteModelGroup) + admin.GET("/users", s.handleGetUsers) admin.POST("/users", s.handleCreateUser) admin.PUT("/users/:id", s.handleUpdateUser)