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