You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
2.7 KiB

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)
}