package schedule import ( "encoding/json" "net/http" "strconv" "github.com/go-chi/chi/v5" "git.unsupervised.ca/walkies/internal/respond" "git.unsupervised.ca/walkies/internal/server/middleware" ) type Handler struct { store *Store } func NewHandler(store *Store) *Handler { return &Handler{store: store} } // GET /api/v1/schedules func (h *Handler) List(w http.ResponseWriter, r *http.Request) { claims := middleware.ClaimsFromContext(r.Context()) volunteerID := int64(0) if claims.Role != "admin" { volunteerID = claims.VolunteerID } schedules, err := h.store.List(volunteerID) if err != nil { respond.Error(w, http.StatusInternalServerError, "could not list schedules") return } if schedules == nil { schedules = []Schedule{} } respond.JSON(w, http.StatusOK, schedules) } // POST /api/v1/schedules func (h *Handler) Create(w http.ResponseWriter, r *http.Request) { claims := middleware.ClaimsFromContext(r.Context()) var in CreateInput if err := json.NewDecoder(r.Body).Decode(&in); err != nil { respond.Error(w, http.StatusBadRequest, "invalid request body") return } if claims.Role != "admin" { in.VolunteerID = claims.VolunteerID } if in.Title == "" || in.StartsAt == "" || in.EndsAt == "" { respond.Error(w, http.StatusBadRequest, "title, starts_at, and ends_at are required") return } sc, err := h.store.Create(in) if err != nil { respond.Error(w, http.StatusInternalServerError, "could not create schedule") return } respond.JSON(w, http.StatusCreated, sc) } // PUT /api/v1/schedules/{id} func (h *Handler) Update(w http.ResponseWriter, r *http.Request) { id, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64) if err != nil { respond.Error(w, http.StatusBadRequest, "invalid id") return } var in UpdateInput if err := json.NewDecoder(r.Body).Decode(&in); err != nil { respond.Error(w, http.StatusBadRequest, "invalid request body") return } sc, err := h.store.Update(id, in) if err != nil { respond.Error(w, http.StatusInternalServerError, "could not update schedule") return } if sc == nil { respond.Error(w, http.StatusNotFound, "schedule not found") return } respond.JSON(w, http.StatusOK, sc) } // DELETE /api/v1/schedules/{id} func (h *Handler) Delete(w http.ResponseWriter, r *http.Request) { id, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64) if err != nil { respond.Error(w, http.StatusBadRequest, "invalid id") return } if err := h.store.Delete(id); err != nil { respond.Error(w, http.StatusInternalServerError, "could not delete schedule") return } w.WriteHeader(http.StatusNoContent) }