45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use crate::{AppError, icons, layouts, util::AppState};
|
|
use axum::{Router, extract::State, routing::get};
|
|
use maud::{Markup, html};
|
|
|
|
mod id;
|
|
mod new;
|
|
|
|
pub fn routes() -> Router<AppState> {
|
|
Router::new()
|
|
.route("/", get(page))
|
|
.nest("/new", new::routes())
|
|
.nest("/{id}", id::routes())
|
|
}
|
|
|
|
async fn page(State(state): State<AppState>) -> Result<Markup, AppError> {
|
|
let workouts = sqlx::query_as!(
|
|
crate::models::Workout,
|
|
"SELECT workout_id, name, description FROM workouts"
|
|
)
|
|
.fetch_all(&state.pool)
|
|
.await?;
|
|
|
|
let content = html! {
|
|
a href="/workouts/new" { "new workout +" }
|
|
div class="list" {
|
|
@for workout in workouts {
|
|
a href={ "/workouts/" (workout.workout_id) } class="list-row" {
|
|
div {}
|
|
div {
|
|
div class="font-bold" { (workout.name) }
|
|
div class="text-xs" { (workout.description) }
|
|
}
|
|
div class="btn btn-square btn-ghost" {
|
|
div class="size-[1.6em]" {
|
|
(icons::eye())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
Ok(layouts::desktop(content, "Browse Workouts", false))
|
|
}
|