diff --git a/api/main.go b/api/main.go index 467951a..e74db59 100644 --- a/api/main.go +++ b/api/main.go @@ -41,5 +41,6 @@ func getRouter(db *sql.DB) *http.ServeMux { var router = http.NewServeMux() router.HandleFunc("POST /workout", workout.NewWorkout(db)) router.HandleFunc("GET /workout", workout.GetWorkouts(db)) + router.HandleFunc("DELETE /workout", workout.DeleteWorkout(db)) return router } diff --git a/api/src/workout/workout.go b/api/src/workout/workout.go index b381991..d6276df 100644 --- a/api/src/workout/workout.go +++ b/api/src/workout/workout.go @@ -58,7 +58,7 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc { token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) var userId = token.UID - rows, err := db.Query("SELECT date, type, sets, reps FROM workout WHERE user_id = ?", 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 @@ -66,18 +66,20 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc { 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(&date, &workoutType, &sets, &reps) + 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, @@ -89,3 +91,22 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc { utils.WriteJSON(w, workouts) } } + +func DeleteWorkout(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) + var userId = token.UID + + 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 + } + } +} diff --git a/view/src/routes/+layout.svelte b/view/src/routes/+layout.svelte index a86be26..6fc307d 100644 --- a/view/src/routes/+layout.svelte +++ b/view/src/routes/+layout.svelte @@ -45,7 +45,7 @@ ME-FIT {#if user}
{user?.email}
- + {:else} Sign Up Sign In diff --git a/view/src/routes/app/+page.svelte b/view/src/routes/app/+page.svelte index 865fca6..d8aa104 100644 --- a/view/src/routes/app/+page.svelte +++ b/view/src/routes/app/+page.svelte @@ -4,6 +4,7 @@ import type { Auth } from 'firebase/auth'; import { goto } from '$app/navigation'; import { addToast } from '$lib/toast'; + import MdiDelete from '~icons/mdi/delete'; var auth: Auth | null = null; @@ -53,9 +54,30 @@ }); if (response.ok) { - const data = await response.json(); - console.log(data); - workouts = data; + workouts = await response.json(); + } else { + addToast('Failed to fetch workouts: ' + (await response.text()), 'error'); + } + } catch (error: any) { + addToast('Failed to fetch workouts: ' + error.message, 'error'); + } + } + + async function deleteWorkout(id: string) { + console.log('Deleting workout with id: ', id); + try { + const data = new FormData(); + data.append('id', id); + const response = await fetch(PUBLIC_BASE_API_URL + '/workout', { + headers: { + Authorization: 'Bearer ' + (await auth?.currentUser?.getIdToken()) + }, + body: data, + method: 'DELETE' + }); + + if (response.ok) { + workouts = workouts.filter((workout) => workout.id !== id); } else { addToast('Failed to fetch workouts: ' + (await response.text()), 'error'); } @@ -107,6 +129,7 @@