Added basic exercise addition and deletion

This commit is contained in:
2025-07-09 14:02:18 +02:00
parent 24c784e434
commit 0d1101f84d
27 changed files with 734 additions and 165 deletions

View File

@@ -1,49 +1,56 @@
use crate::layouts;
use axum::{Router, routing::get};
use crate::{AppError, layouts, util::AppState};
use axum::{Form, Router, extract::State, http::StatusCode, routing::get};
use maud::{Markup, html};
use serde::Deserialize;
pub fn routes() -> Router {
Router::new().route("/", get(page))
pub fn routes() -> Router<AppState> {
Router::new().route("/", get(page).post(submit))
}
async fn page() -> Markup {
async fn page(State(state): State<AppState>) -> Result<Markup, AppError> {
let muscles = sqlx::query_as!(crate::models::MuscleGroup, "SELECT * FROM muscle_groups")
.fetch_all(&state.pool)
.await?;
let categories = sqlx::query_as!(crate::models::Category, "SELECT * FROM categories")
.fetch_all(&state.pool)
.await?;
let content = html! {
h1 class="mb-5" { "New Exercise" }
forum class="space-y-1" {
form hx-post="/exercises/new" class="space-y-1" {
fieldset class="fieldset" {
legend class="fieldset-legend" { "Name" }
input class="input" {}
input required="true" name="name" class="input" {}
}
fieldset class="fieldset" {
legend class="fieldset-legend" { "Description" }
textarea class="textarea" {}
textarea required="true" name="description" class="textarea" {}
}
fieldset class="fieldset" {
legend class="fieldset-legend" { "Muscle Group" }
label class="label" {
input type="checkbox" checked="checked" class="checkbox" {}
"Chest"
}
label class="label" {
input type="checkbox" checked="checked" class="checkbox" {}
"Body"
@for muscle in muscles {
@let name = muscle.name;
label class="label" {
input type="checkbox" class="checkbox" {}
(name)
}
}
}
fieldset class="fieldset" {
legend class="fieldset-legend" { "Equipment" }
legend class="fieldset-legend" { "Category" }
label class="label" {
input type="checkbox" checked="checked" class="checkbox" {}
"Weigted plates"
}
label class="label" {
input type="checkbox" checked="checked" class="checkbox" {}
"Jump Rope"
@for category in categories {
@let name = category.name;
label class="label" {
input type="checkbox" class="checkbox" {}
(name)
}
}
}
@@ -51,5 +58,33 @@ async fn page() -> Markup {
}
};
layouts::desktop(content, "New Exercise")
Ok(layouts::desktop(content, "New Exercise"))
}
#[derive(Deserialize, Debug)]
struct FormData {
name: String,
description: String,
}
async fn submit(
State(state): State<AppState>,
Form(form): Form<FormData>,
) -> Result<Markup, AppError> {
let exercise_id = uuid::Uuid::new_v4();
sqlx::query!(
"INSERT INTO exercises (exercise_id, name, description) VALUES ($1, $2, $3)",
exercise_id,
form.name,
form.description
)
.execute(&state.pool)
.await?;
Ok(html! {
p {
"New exercise has been created!"
}
})
}