package service import ( "me-fit/templates" "me-fit/utils" "database/sql" "net/http" "strconv" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var ( metrics = promauto.NewCounterVec( prometheus.CounterOpts{ Name: "mefit_api_workout_total", Help: "The total number of workout api requests processed", }, []string{"type"}, ) ) func App(w http.ResponseWriter, r *http.Request) { comp := templates.App() layout := templates.Layout(comp) layout.Render(r.Context(), w) } func NewWorkout(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { metrics.WithLabelValues("new").Inc() var dateStr = r.FormValue("date") var typeStr = r.FormValue("type") var setsStr = r.FormValue("sets") var repsStr = r.FormValue("reps") if dateStr == "" || typeStr == "" || setsStr == "" || repsStr == "" { http.Error(w, "Missing required fields", http.StatusBadRequest) return } date, err := time.Parse("2006-01-02", dateStr) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } sets, err := strconv.Atoi(setsStr) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } reps, err := strconv.Atoi(repsStr) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } //TODO: Ensure auth // token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) _, err = db.Exec("INSERT INTO workout (user_id, date, type, sets, reps) VALUES (?, ?, ?, ?, ?)", "", date, typeStr, sets, reps) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } } func GetWorkouts(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { metrics.WithLabelValues("get").Inc() // token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) // var userId = token.UID var userId = "" rows, err := db.Query("SELECT rowid, date, type, sets, reps FROM workout WHERE user_id = ?", userId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } var workouts = make([]map[string]interface{}, 0) for rows.Next() { var id int var date string var workoutType string var sets int var reps int err = rows.Scan(&id, &date, &workoutType, &sets, &reps) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } workout := map[string]interface{}{ "id": id, "date": date, "type": workoutType, "sets": sets, "reps": reps, } workouts = append(workouts, workout) } utils.WriteJSON(w, workouts) } } func DeleteWorkout(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { metrics.WithLabelValues("delete").Inc() // token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) // var userId = token.UID var userId = "" rowId := r.FormValue("id") if rowId == "" { http.Error(w, "Missing required fields", http.StatusBadRequest) return } _, err := db.Exec("DELETE FROM workout WHERE user_id = ? AND rowid = ?", userId, rowId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } }