package handler import ( "me-fit/handler/middleware" "me-fit/log" "me-fit/service" "me-fit/template/workout" "me-fit/utils" "net/http" "strconv" "time" ) type Workout interface { Handle(router *http.ServeMux) } type WorkoutImpl struct { service service.Workout auth service.Auth render *Render } func NewWorkout(service service.Workout, auth service.Auth, render *Render) Workout { return WorkoutImpl{ service: service, auth: auth, render: render, } } func (handler WorkoutImpl) Handle(router *http.ServeMux) { router.Handle("/workout", handler.handleWorkoutPage()) router.Handle("POST /api/workout", handler.handleAddWorkout()) router.Handle("GET /api/workout", handler.handleGetWorkout()) router.Handle("DELETE /api/workout/{id}", handler.handleDeleteWorkout()) } func (handler WorkoutImpl) handleWorkoutPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { session := middleware.GetSession(r) if session == nil { utils.DoRedirect(w, r, "/auth/signin") return } currentDate := time.Now().Format("2006-01-02") comp := workout.WorkoutComp(currentDate) handler.render.RenderLayout(r, w, comp, session.User) } } func (handler WorkoutImpl) handleAddWorkout() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { session := middleware.GetSession(r) if session == nil { utils.DoRedirect(w, r, "/auth/signin") return } var dateStr = r.FormValue("date") var typeStr = r.FormValue("type") var setsStr = r.FormValue("sets") var repsStr = r.FormValue("reps") wo := service.NewWorkoutDto("", dateStr, typeStr, setsStr, repsStr) wo, err := handler.service.AddWorkout(session.User, wo) if err != nil { utils.TriggerToast(w, r, "error", "Invalid input values") http.Error(w, "Invalid input values", http.StatusBadRequest) return } wor := workout.Workout{Id: wo.RowId, Date: wo.Date, Type: wo.Type, Sets: wo.Sets, Reps: wo.Reps} comp := workout.WorkoutItemComp(wor, true) handler.render.Render(r, w, comp) } } func (handler WorkoutImpl) handleGetWorkout() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { session := middleware.GetSession(r) if session == nil { utils.DoRedirect(w, r, "/auth/signin") return } workouts, err := handler.service.GetWorkouts(session.User) if err != nil { return } wos := make([]workout.Workout, 0) for _, wo := range workouts { wos = append(wos, workout.Workout{Id: wo.RowId, Date: wo.Date, Type: wo.Type, Sets: wo.Sets, Reps: wo.Reps}) } comp := workout.WorkoutListComp(wos) handler.render.Render(r, w, comp) } } func (handler WorkoutImpl) handleDeleteWorkout() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { session := middleware.GetSession(r) if session == nil { utils.DoRedirect(w, r, "/auth/signin") return } rowId := r.PathValue("id") if rowId == "" { http.Error(w, "Missing required fields", http.StatusBadRequest) log.Warn("Missing required fields for workout delete") utils.TriggerToast(w, r, "error", "Missing ID field") return } rowIdInt, err := strconv.Atoi(rowId) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) log.Warn("Invalid ID for workout delete") utils.TriggerToast(w, r, "error", "Invalid ID") return } err = handler.service.DeleteWorkout(session.User, rowIdInt) if err != nil { http.Error(w, "Internal Server Error", http.StatusInternalServerError) log.Error("Could not delete workout: %v", err.Error()) utils.TriggerToast(w, r, "error", "Internal Server Error") return } } }