#73 finalize workouts
All checks were successful
Build Docker Image / Explore-Gitea-Actions (push) Successful in 47s

This commit is contained in:
Tim
2024-09-01 14:18:42 +02:00
parent eedaad29fe
commit a60d1ec105
3 changed files with 58 additions and 26 deletions

View File

@@ -19,7 +19,7 @@ func getHandler(db *sql.DB) http.Handler {
router.HandleFunc("/app", service.HandleWorkoutPage(db)) router.HandleFunc("/app", service.HandleWorkoutPage(db))
router.HandleFunc("POST /api/workout", service.HandleNewWorkout(db)) router.HandleFunc("POST /api/workout", service.HandleNewWorkout(db))
router.HandleFunc("GET /api/workout", service.HandleGetWorkouts(db)) router.HandleFunc("GET /api/workout", service.HandleGetWorkouts(db))
router.HandleFunc("DELETE /api/workout", service.HandleDeleteWorkout(db)) router.HandleFunc("DELETE /api/workout/{id}", service.HandleDeleteWorkout(db))
router.HandleFunc("/auth/signin", service.HandleSignInPage(db)) router.HandleFunc("/auth/signin", service.HandleSignInPage(db))
router.HandleFunc("/auth/signup", service.HandleSignUpPage(db)) router.HandleFunc("/auth/signup", service.HandleSignUpPage(db))

View File

@@ -25,7 +25,8 @@ var (
func HandleWorkoutPage(db *sql.DB) http.HandlerFunc { func HandleWorkoutPage(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
inner := workout.WorkoutComp() currentDate := time.Now().Format("2006-01-02")
inner := workout.WorkoutComp(currentDate)
user_comp := UserInfoComp(verifySessionAndReturnUser(db, r)) user_comp := UserInfoComp(verifySessionAndReturnUser(db, r))
layout := template.Layout(inner, user_comp) layout := template.Layout(inner, user_comp)
layout.Render(r.Context(), w) layout.Render(r.Context(), w)
@@ -36,6 +37,12 @@ func HandleNewWorkout(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
metrics.WithLabelValues("new").Inc() metrics.WithLabelValues("new").Inc()
user := verifySessionAndReturnUser(db, r)
if user == nil {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
var dateStr = r.FormValue("date") var dateStr = r.FormValue("date")
var typeStr = r.FormValue("type") var typeStr = r.FormValue("type")
var setsStr = r.FormValue("sets") var setsStr = r.FormValue("sets")
@@ -64,15 +71,21 @@ func HandleNewWorkout(db *sql.DB) http.HandlerFunc {
return return
} }
//TODO: Ensure auth _, err = db.Exec("INSERT INTO workout (user_id, date, type, sets, reps) VALUES (?, ?, ?, ?, ?)", user.user_uuid, date, typeStr, sets, reps)
// 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 { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
wo := workout.Workout{
Date: r.FormValue("date"),
Type: r.FormValue("type"),
Sets: r.FormValue("sets"),
Reps: r.FormValue("reps"),
}
workout.WorkoutItemComp(wo, true).Render(r.Context(), w)
} }
} }
@@ -113,20 +126,29 @@ func HandleDeleteWorkout(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
metrics.WithLabelValues("delete").Inc() metrics.WithLabelValues("delete").Inc()
// token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) user := verifySessionAndReturnUser(db, r)
// var userId = token.UID
var userId = ""
rowId := r.FormValue("id") rowId := r.PathValue("id")
if rowId == "" { if rowId == "" {
http.Error(w, "Missing required fields", http.StatusBadRequest) http.Error(w, "Missing required fields", http.StatusBadRequest)
return return
} }
_, err := db.Exec("DELETE FROM workout WHERE user_id = ? AND rowid = ?", userId, rowId) res, err := db.Exec("DELETE FROM workout WHERE user_id = ? AND rowid = ?", user.user_uuid, rowId)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
rows, err := res.RowsAffected()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if rows == 0 {
http.Error(w, "Not found", http.StatusNotFound)
return
}
} }
} }

View File

@@ -1,17 +1,19 @@
package workout package workout
templ WorkoutComp() { templ WorkoutComp(currentDate string) {
<main class="mx-2"> <main class="mx-2">
<form <form
class="max-w-xl mx-auto flex flex-col gap-4 justify-center mt-10" class="max-w-xl mx-auto flex flex-col gap-4 justify-center mt-10"
hx-post="/api/workout" hx-post="/api/workout"
hx-target="#workout-placeholder"
hx-swap="outerHTML"
> >
<h2 class="text-4xl mb-8">Track your workout</h2> <h2 class="text-4xl mb-8">Track your workout</h2>
<input <input
id="date" id="date"
type="date" type="date"
class="input input-bordered" class="input input-bordered"
value="" value={ currentDate }
name="date" name="date"
/> />
<select class="select select-bordered w-full" name="type"> <select class="select select-bordered w-full" name="type">
@@ -58,7 +60,19 @@ templ WorkoutListComp(workouts []Workout) {
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="hidden" id="workout-placeholder"></tr>
for _,w := range workouts { for _,w := range workouts {
@WorkoutItemComp(w, false)
}
</tbody>
</table>
</div>
}
templ WorkoutItemComp(w Workout, includePlaceholder bool) {
if includePlaceholder {
<tr class="hidden" id="workout-placeholder"></tr>
}
<tr> <tr>
<th>{ w.Date }</th> <th>{ w.Date }</th>
<th>{ w.Type }</th> <th>{ w.Type }</th>
@@ -66,14 +80,10 @@ templ WorkoutListComp(workouts []Workout) {
<th>{ w.Reps }</th> <th>{ w.Reps }</th>
<th> <th>
<div class="tooltip" data-tip="Delete Entry"> <div class="tooltip" data-tip="Delete Entry">
<button hx-delete="api/workout/{w.id}"> <button hx-delete={ "api/workout/" + w.Id } hx-target="closest tr">
Delete Delete
</button> </button>
</div> </div>
</th> </th>
</tr> </tr>
} }
</tbody>
</table>
</div>
}