Added basic exercise addition and deletion
This commit is contained in:
@@ -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!"
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user