#16 deletiion capabillity
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user