package handlers import ( "database/sql" "net/http" "strconv" "person-home/internal/db" "person-home/internal/models" ) type ProjectHandler struct { DB *sql.DB } func (h *ProjectHandler) List(w http.ResponseWriter, r *http.Request) { tag := r.URL.Query().Get("tag") featuredOnly := r.URL.Query().Get("featured") == "true" limit := 0 if l := r.URL.Query().Get("limit"); l != "" { limit, _ = strconv.Atoi(l) } projects, err := db.ListProjects(h.DB, tag, featuredOnly, limit) if err != nil { writeError(w, http.StatusInternalServerError, "failed to list projects") return } if projects == nil { projects = []models.Project{} } writeJSON(w, http.StatusOK, projects) } func (h *ProjectHandler) Get(w http.ResponseWriter, r *http.Request) { idStr := r.PathValue("id") id, err := strconv.ParseInt(idStr, 10, 64) if err != nil { writeError(w, http.StatusBadRequest, "invalid id") return } project, err := db.GetProject(h.DB, id) if err != nil { writeError(w, http.StatusInternalServerError, "failed to get project") return } if project == nil { writeError(w, http.StatusNotFound, "project not found") return } writeJSON(w, http.StatusOK, project) } func (h *ProjectHandler) Tags(w http.ResponseWriter, r *http.Request) { tags, err := db.AllTags(h.DB) if err != nil { writeError(w, http.StatusInternalServerError, "failed to get tags") return } if tags == nil { tags = []string{} } writeJSON(w, http.StatusOK, tags) }