package api import ( "encoding/json" "net/http" "github.com/google/uuid" "github.com/thepeterstone/claudomator/internal/task" ) func (s *Server) handleListProjects(w http.ResponseWriter, r *http.Request) { projects, err := s.store.ListProjects() if err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } if projects == nil { projects = []*task.Project{} } writeJSON(w, http.StatusOK, projects) } func (s *Server) handleCreateProject(w http.ResponseWriter, r *http.Request) { var p task.Project if err := json.NewDecoder(r.Body).Decode(&p); err != nil { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid JSON: " + err.Error()}) return } if p.Name == "" { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "name is required"}) return } if p.ID == "" { p.ID = uuid.New().String() } if err := s.store.CreateProject(&p); err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } writeJSON(w, http.StatusCreated, p) } func (s *Server) handleGetProject(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") p, err := s.store.GetProject(id) if err != nil { writeJSON(w, http.StatusNotFound, map[string]string{"error": "project not found"}) return } writeJSON(w, http.StatusOK, p) } func (s *Server) handleUpdateProject(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") existing, err := s.store.GetProject(id) if err != nil { writeJSON(w, http.StatusNotFound, map[string]string{"error": "project not found"}) return } if err := json.NewDecoder(r.Body).Decode(existing); err != nil { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid JSON: " + err.Error()}) return } existing.ID = id // ensure ID cannot be changed via body if err := s.store.UpdateProject(existing); err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } writeJSON(w, http.StatusOK, existing) }