#73 finalize workouts
All checks were successful
Build Docker Image / Explore-Gitea-Actions (push) Successful in 47s
All checks were successful
Build Docker Image / Explore-Gitea-Actions (push) Successful in 47s
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,22 +60,30 @@ 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 {
|
||||||
<tr>
|
@WorkoutItemComp(w, false)
|
||||||
<th>{ w.Date }</th>
|
|
||||||
<th>{ w.Type }</th>
|
|
||||||
<th>{ w.Sets }</th>
|
|
||||||
<th>{ w.Reps }</th>
|
|
||||||
<th>
|
|
||||||
<div class="tooltip" data-tip="Delete Entry">
|
|
||||||
<button hx-delete="api/workout/{w.id}">
|
|
||||||
Delete
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ WorkoutItemComp(w Workout, includePlaceholder bool) {
|
||||||
|
if includePlaceholder {
|
||||||
|
<tr class="hidden" id="workout-placeholder"></tr>
|
||||||
|
}
|
||||||
|
<tr>
|
||||||
|
<th>{ w.Date }</th>
|
||||||
|
<th>{ w.Type }</th>
|
||||||
|
<th>{ w.Sets }</th>
|
||||||
|
<th>{ w.Reps }</th>
|
||||||
|
<th>
|
||||||
|
<div class="tooltip" data-tip="Delete Entry">
|
||||||
|
<button hx-delete={ "api/workout/" + w.Id } hx-target="closest tr">
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user