Forked clean from public hackathon repo (Starfire-AgentTeam, BSL 1.1) with full rebrand to Molecule AI under github.com/Molecule-AI/molecule-monorepo. Brand: Starfire → Molecule AI. Slug: starfire / agent-molecule → molecule. Env vars: STARFIRE_* → MOLECULE_*. Go module: github.com/agent-molecule/platform → github.com/Molecule-AI/molecule-monorepo/platform. Python packages: starfire_plugin → molecule_plugin, starfire_agent → molecule_agent. DB: agentmolecule → molecule. History truncated; see public repo for prior commits and contributor attribution. Verified green: go test -race ./... (platform), pytest (workspace-template 1129 + sdk 132), vitest (canvas 352), build (mcp). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/Molecule-AI/molecule-monorepo/platform/internal/db"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type ConfigHandler struct{}
|
|
|
|
func NewConfigHandler() *ConfigHandler { return &ConfigHandler{} }
|
|
|
|
// Get handles GET /workspaces/:id/config
|
|
func (h *ConfigHandler) Get(c *gin.Context) {
|
|
workspaceID := c.Param("id")
|
|
|
|
var data []byte
|
|
err := db.DB.QueryRowContext(c.Request.Context(),
|
|
`SELECT data FROM workspace_config WHERE workspace_id = $1`,
|
|
workspaceID,
|
|
).Scan(&data)
|
|
|
|
if err == sql.ErrNoRows {
|
|
c.JSON(http.StatusOK, gin.H{"data": json.RawMessage("{}")})
|
|
return
|
|
}
|
|
if err != nil {
|
|
log.Printf("Config get error: %v", err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "query failed"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": json.RawMessage(data)})
|
|
}
|
|
|
|
// Patch handles PATCH /workspaces/:id/config
|
|
func (h *ConfigHandler) Patch(c *gin.Context) {
|
|
workspaceID := c.Param("id")
|
|
|
|
body, err := io.ReadAll(c.Request.Body)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to read body"})
|
|
return
|
|
}
|
|
|
|
if !json.Valid(body) {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid JSON"})
|
|
return
|
|
}
|
|
|
|
_, err = db.DB.ExecContext(c.Request.Context(), `
|
|
INSERT INTO workspace_config(workspace_id, data, updated_at)
|
|
VALUES($1, $2::jsonb, NOW())
|
|
ON CONFLICT(workspace_id) DO UPDATE
|
|
SET data = workspace_config.data || $2::jsonb, updated_at = NOW()
|
|
`, workspaceID, string(body))
|
|
if err != nil {
|
|
log.Printf("Config patch error: %v", err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to update config"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"status": "updated"})
|
|
}
|