#16 deletiion capabillity

This commit is contained in:
2024-07-30 22:04:40 +02:00
parent db021cec0f
commit c7b6cb0c99
5 changed files with 58 additions and 7 deletions

View File

@@ -41,5 +41,6 @@ func getRouter(db *sql.DB) *http.ServeMux {
var router = http.NewServeMux() var router = http.NewServeMux()
router.HandleFunc("POST /workout", workout.NewWorkout(db)) router.HandleFunc("POST /workout", workout.NewWorkout(db))
router.HandleFunc("GET /workout", workout.GetWorkouts(db)) router.HandleFunc("GET /workout", workout.GetWorkouts(db))
router.HandleFunc("DELETE /workout", workout.DeleteWorkout(db))
return router return router
} }

View File

@@ -58,7 +58,7 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc {
token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token) token := r.Context().Value(middleware.TOKEN_KEY).(*auth.Token)
var userId = token.UID 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 { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
@@ -66,18 +66,20 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc {
var workouts = make([]map[string]interface{}, 0) var workouts = make([]map[string]interface{}, 0)
for rows.Next() { for rows.Next() {
var id int
var date string var date string
var workoutType string var workoutType string
var sets int var sets int
var reps int var reps int
err = rows.Scan(&date, &workoutType, &sets, &reps) err = rows.Scan(&id, &date, &workoutType, &sets, &reps)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
workout := map[string]interface{}{ workout := map[string]interface{}{
"id": id,
"date": date, "date": date,
"type": workoutType, "type": workoutType,
"sets": sets, "sets": sets,
@@ -89,3 +91,22 @@ func GetWorkouts(db *sql.DB) http.HandlerFunc {
utils.WriteJSON(w, workouts) 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
}
}
}

View File

@@ -45,7 +45,7 @@
<a href="/" class="flex-1">ME-FIT</a> <a href="/" class="flex-1">ME-FIT</a>
{#if user} {#if user}
<p>{user?.email}</p> <p>{user?.email}</p>
<button class="btn" on:click={async () => signOut()}>Logout</button> <button class="btn" on:click={async () => signOut()}>Sign Out</button>
{:else} {:else}
<a href="/signup" class="btn">Sign Up</a> <a href="/signup" class="btn">Sign Up</a>
<a href="/signin" class="btn">Sign In</a> <a href="/signin" class="btn">Sign In</a>

View File

@@ -4,6 +4,7 @@
import type { Auth } from 'firebase/auth'; import type { Auth } from 'firebase/auth';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { addToast } from '$lib/toast'; import { addToast } from '$lib/toast';
import MdiDelete from '~icons/mdi/delete';
var auth: Auth | null = null; var auth: Auth | null = null;
@@ -53,9 +54,30 @@
}); });
if (response.ok) { if (response.ok) {
const data = await response.json(); workouts = await response.json();
console.log(data); } else {
workouts = data; 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 { } else {
addToast('Failed to fetch workouts: ' + (await response.text()), 'error'); addToast('Failed to fetch workouts: ' + (await response.text()), 'error');
} }
@@ -107,6 +129,7 @@
<th>Type</th> <th>Type</th>
<th>Sets</th> <th>Sets</th>
<th>Reps</th> <th>Reps</th>
<th></th>
</tr> </tr>
</thead> </thead>
@@ -117,6 +140,13 @@
<th>{workout.type}</th> <th>{workout.type}</th>
<th>{workout.sets}</th> <th>{workout.sets}</th>
<th>{workout.reps}</th> <th>{workout.reps}</th>
<th>
<div class="tooltip" data-tip="Delete Entry">
<button on:click={deleteWorkout(workout.id)}>
<MdiDelete class="text-gray-400 text-lg"></MdiDelete>
</button>
</div>
</th>
</tr> </tr>
{/each} {/each}
</tbody> </tbody>

View File

@@ -14,7 +14,6 @@
data.get('password') as string data.get('password') as string
); );
addToast('Signed in successfully', 'success');
goto('/'); goto('/');
} catch (error: any) { } catch (error: any) {
const errorStr = error.code ? error.code : error.message; const errorStr = error.code ? error.code : error.message;