package handler import ( "database/sql" "krafttrainer/internal/model" "net/http" ) // handleListExercises behandelt GET /api/v1/exercises. // Unterstützt optionale Query-Parameter: muscle_group und q (Namenssuche). func (h *Handler) handleListExercises(w http.ResponseWriter, r *http.Request) { uid, err := userID(r) if err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } muscleGroup := r.URL.Query().Get("muscle_group") query := r.URL.Query().Get("q") exercises, err := h.store.ListExercises(uid, muscleGroup, query) if err != nil { writeError(w, http.StatusInternalServerError, "Fehler beim Laden der Übungen") return } writeJSON(w, http.StatusOK, exercises) } // handleCreateExercise behandelt POST /api/v1/exercises. func (h *Handler) handleCreateExercise(w http.ResponseWriter, r *http.Request) { uid, err := userID(r) if err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } var req model.CreateExerciseRequest if err := decodeJSON(r, &req); err != nil { writeError(w, http.StatusBadRequest, "Ungültiger Request-Body") return } if err := req.Validate(); err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } exercise, err := h.store.CreateExercise(uid, &req) if err != nil { writeError(w, http.StatusInternalServerError, "Fehler beim Erstellen der Übung") return } writeJSON(w, http.StatusCreated, exercise) } // handleUpdateExercise behandelt PUT /api/v1/exercises/{id}. func (h *Handler) handleUpdateExercise(w http.ResponseWriter, r *http.Request) { uid, err := userID(r) if err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } id, err := pathID(r, "id") if err != nil { writeError(w, http.StatusBadRequest, "Ungültige ID") return } var req model.CreateExerciseRequest if err := decodeJSON(r, &req); err != nil { writeError(w, http.StatusBadRequest, "Ungültiger Request-Body") return } if err := req.Validate(); err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } exercise, err := h.store.UpdateExercise(id, uid, &req) if err != nil { writeError(w, http.StatusInternalServerError, "Fehler beim Aktualisieren der Übung") return } if exercise == nil { writeError(w, http.StatusNotFound, "Übung nicht gefunden") return } writeJSON(w, http.StatusOK, exercise) } // handleDeleteExercise behandelt DELETE /api/v1/exercises/{id}. // Führt einen Soft-Delete durch (setzt deleted_at). func (h *Handler) handleDeleteExercise(w http.ResponseWriter, r *http.Request) { uid, err := userID(r) if err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } id, err := pathID(r, "id") if err != nil { writeError(w, http.StatusBadRequest, "Ungültige ID") return } err = h.store.SoftDeleteExercise(id, uid) if err == sql.ErrNoRows { writeError(w, http.StatusNotFound, "Übung nicht gefunden") return } if err != nil { writeError(w, http.StatusInternalServerError, "Fehler beim Löschen der Übung") return } w.WriteHeader(http.StatusNoContent) }