package handler import ( "me-fit/service" "me-fit/template" "me-fit/template/workout" "me-fit/types" "me-fit/utils" "time" "database/sql" "net/http" ) type HandlerWorkout interface { handle(router *http.ServeMux) } type HandlerWorkoutImpl struct { db *sql.DB service service.ServiceWorkout auth service.ServiceAuth serverSettings *types.ServerSettings } func NewHandlerWorkout(db *sql.DB, service service.ServiceWorkout, auth service.ServiceAuth, serverSettings *types.ServerSettings) HandlerAuth { return HandlerWorkoutImpl{ db: db, service: service, auth: auth, serverSettings: serverSettings, } } func (handler HandlerWorkoutImpl) handle(router *http.ServeMux) { router.Handle("/workout", handler.handleWorkoutPage()) router.Handle("POST /api/workout", handler.handleAddWorkout()) router.Handle("GET /api/workout", service.HandleWorkoutGetComp(handler.db)) router.Handle("DELETE /api/workout/{id}", service.HandleWorkoutDeleteComp(handler.db)) } func (handler HandlerWorkoutImpl) handleWorkoutPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { user, err := handler.auth.GetUserFromSessionId(utils.GetSessionID(r)) if err != nil { utils.DoRedirect(w, r, "/auth/signin") return } currentDate := time.Now().Format("2006-01-02") inner := workout.WorkoutComp(currentDate) userComp := service.UserInfoComp(user) err = template.Layout(inner, userComp, handler.serverSettings.Environment).Render(r.Context(), w) if err != nil { utils.LogError("Failed to render workout page", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } } func (handler HandlerWorkoutImpl) handleAddWorkout() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { user, err := handler.auth.GetUserFromSessionId(utils.GetSessionID(r)) if err != 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(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} err = workout.WorkoutItemComp(wor, true).Render(r.Context(), w) if err != nil { utils.LogError("Could not render workoutitem", err) utils.TriggerToast(w, r, "error", "Internal Server Error") http.Error(w, err.Error(), http.StatusInternalServerError) } } }