package handlers import ( "net/http" "strconv" "person-site/internal/models" ) type ProjectHandler struct { Store *models.ProjectStore } func (h *ProjectHandler) ListPublic(w http.ResponseWriter, r *http.Request) { var projects []models.Project var err error if r.URL.Query().Get("featured") == "true" { projects, err = h.Store.ListFeatured() } else { projects, err = h.Store.ListAll() } if err != nil { Error(w, 500, "failed to fetch projects") return } if projects == nil { projects = []models.Project{} } JSON(w, 200, map[string]interface{}{"projects": projects}) } func (h *ProjectHandler) GetPublic(w http.ResponseWriter, r *http.Request) { idStr := r.PathValue("id") id, err := strconv.Atoi(idStr) if err != nil { Error(w, 400, "invalid project id") return } project, err := h.Store.GetByID(id) if err != nil { Error(w, 500, "failed to fetch project") return } if project == nil { Error(w, 404, "project not found") return } JSON(w, 200, project) } func (h *ProjectHandler) ListAdmin(w http.ResponseWriter, r *http.Request) { projects, err := h.Store.ListAll() if err != nil { Error(w, 500, "failed to fetch projects") return } if projects == nil { projects = []models.Project{} } JSON(w, 200, map[string]interface{}{"projects": projects}) } func (h *ProjectHandler) Create(w http.ResponseWriter, r *http.Request) { var p models.Project if err := Decode(r, &p); err != nil { Error(w, 400, "invalid request body") return } if p.Title == "" { Error(w, 400, "title is required") return } if p.Status == "" { p.Status = "planned" } if err := h.Store.Create(&p); err != nil { Error(w, 500, "failed to create project") return } JSON(w, 201, p) } func (h *ProjectHandler) Update(w http.ResponseWriter, r *http.Request) { idStr := r.PathValue("id") id, err := strconv.Atoi(idStr) if err != nil { Error(w, 400, "invalid project id") return } existing, err := h.Store.GetByID(id) if err != nil { Error(w, 500, "failed to fetch project") return } if existing == nil { Error(w, 404, "project not found") return } var p models.Project if err := Decode(r, &p); err != nil { Error(w, 400, "invalid request body") return } if p.Title == "" { Error(w, 400, "title is required") return } p.ID = id p.CreatedAt = existing.CreatedAt if err := h.Store.Update(&p); err != nil { Error(w, 500, "failed to update project") return } JSON(w, 200, p) } func (h *ProjectHandler) Delete(w http.ResponseWriter, r *http.Request) { idStr := r.PathValue("id") id, err := strconv.Atoi(idStr) if err != nil { Error(w, 400, "invalid project id") return } if err := h.Store.Delete(id); err != nil { Error(w, 500, "failed to delete project") return } w.WriteHeader(204) }