99 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package http
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"net/http"
 | 
						|
	"strconv"
 | 
						|
 | 
						|
	"mind/internal/glue"
 | 
						|
)
 | 
						|
 | 
						|
// POST /conversations  {"title":"demo","owner_id":1}
 | 
						|
// GET  /conversations?owner_id=1
 | 
						|
func (s *server) conversations(w http.ResponseWriter, r *http.Request) {
 | 
						|
	switch r.Method {
 | 
						|
	case http.MethodPost:
 | 
						|
		var in struct { Title string `json:"title"`; OwnerID int64 `json:"owner_id"` }
 | 
						|
		if err := json.NewDecoder(r.Body).Decode(&in); err != nil { writeJSON(w, 400, map[string]string{"error":"bad json"}); return }
 | 
						|
		id, err := s.glue.CreateConversation(r.Context(), in.OwnerID, in.Title)
 | 
						|
		if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
		writeJSON(w, 200, map[string]any{"id": id})
 | 
						|
	case http.MethodGet:
 | 
						|
		ownerStr := r.URL.Query().Get("owner_id")
 | 
						|
		owner, _ := strconv.ParseInt(ownerStr, 10, 64)
 | 
						|
		out, err := s.glue.ListConversations(r.Context(), owner)
 | 
						|
		if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
		writeJSON(w, 200, out)
 | 
						|
	default:
 | 
						|
		w.WriteHeader(405)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// POST /branches {conversation_id, name, head_node_id}
 | 
						|
// GET  /branches?conversation_id=...
 | 
						|
// DELETE /branches {conversation_id, name}
 | 
						|
func (s *server) branches(w http.ResponseWriter, r *http.Request) {
 | 
						|
	switch r.Method {
 | 
						|
	case http.MethodPost:
 | 
						|
		var in struct {
 | 
						|
			ConversationID int64  `json:"conversation_id"`
 | 
						|
			Name           string `json:"name"`
 | 
						|
			HeadNodeID     int64  `json:"head_node_id"`
 | 
						|
		}
 | 
						|
		if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
 | 
						|
			writeJSON(w, 400, map[string]string{"error": "bad json"}); return
 | 
						|
		}
 | 
						|
		b, err := s.glue.ForkBranch(r.Context(), glue.ForkReq{
 | 
						|
			ConversationID: in.ConversationID,
 | 
						|
			Name:           in.Name,
 | 
						|
			HeadNodeID:     in.HeadNodeID,
 | 
						|
		})
 | 
						|
		if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
		writeJSON(w, 200, b)
 | 
						|
 | 
						|
	case http.MethodGet:
 | 
						|
		qs := r.URL.Query().Get("conversation_id")
 | 
						|
		if qs == "" { writeJSON(w, 400, map[string]string{"error":"conversation_id required"}); return }
 | 
						|
		convID, _ := strconv.ParseInt(qs, 10, 64)
 | 
						|
		out, err := s.glue.ListBranches(r.Context(), convID)
 | 
						|
		if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
		writeJSON(w, 200, out)
 | 
						|
 | 
						|
	case http.MethodDelete:
 | 
						|
		var in struct {
 | 
						|
			ConversationID int64  `json:"conversation_id"`
 | 
						|
			Name           string `json:"name"`
 | 
						|
		}
 | 
						|
		if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
 | 
						|
			writeJSON(w, 400, map[string]string{"error":"bad json"}); return
 | 
						|
		}
 | 
						|
		if err := s.glue.DeleteBranch(r.Context(), in.ConversationID, in.Name); err != nil {
 | 
						|
			writeJSON(w, 500, map[string]string{"error": err.Error()}); return
 | 
						|
		}
 | 
						|
		writeJSON(w, 200, map[string]string{"ok":"true"})
 | 
						|
 | 
						|
	default:
 | 
						|
		w.WriteHeader(405)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// POST /completion {conversation_id, branch, prompt}
 | 
						|
func (s *server) completion(w http.ResponseWriter, r *http.Request) {
 | 
						|
	if r.Method != http.MethodPost { w.WriteHeader(405); return }
 | 
						|
	var in glue.CompletionReq
 | 
						|
	if err := json.NewDecoder(r.Body).Decode(&in); err != nil { writeJSON(w, 400, map[string]string{"error":"bad json"}); return }
 | 
						|
	resp, err := s.glue.AppendCompletion(r.Context(), in)
 | 
						|
	if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
	writeJSON(w, 200, resp)
 | 
						|
}
 | 
						|
 | 
						|
// GET /linearize?conversation_id=..&branch=main
 | 
						|
func (s *server) linearize(w http.ResponseWriter, r *http.Request) {
 | 
						|
	if r.Method != http.MethodGet { w.WriteHeader(405); return }
 | 
						|
	convID, _ := strconv.ParseInt(r.URL.Query().Get("conversation_id"), 10, 64)
 | 
						|
	branch := r.URL.Query().Get("branch")
 | 
						|
	out, err := s.glue.LinearizeByBranch(r.Context(), convID, branch)
 | 
						|
	if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}); return }
 | 
						|
	writeJSON(w, 200, out)
 | 
						|
}
 |