feat: add script details route

This commit is contained in:
itsscb 2025-05-25 22:27:26 +02:00
parent 01af05b999
commit 8d8857cace
2 changed files with 53 additions and 9 deletions

View File

@ -1,5 +1,5 @@
use axum::routing::{get, get_service}; use axum::routing::{get, get_service};
use routes::scripts::get_scripts; use routes::scripts::{get_script_by_id, get_scripts};
use sqlx::SqlitePool; use sqlx::SqlitePool;
use tower_http::services::ServeDir; use tower_http::services::ServeDir;
mod routes; mod routes;
@ -8,5 +8,6 @@ pub fn new_router(db: SqlitePool) -> axum::Router {
axum::Router::new() axum::Router::new()
.fallback_service(get_service(ServeDir::new("assets"))) .fallback_service(get_service(ServeDir::new("assets")))
.route("/scripts", get(get_scripts)) .route("/scripts", get(get_scripts))
.route("/scripts/{id}", get(get_script_by_id))
.with_state(db) .with_state(db)
} }

View File

@ -1,11 +1,45 @@
use axum::{ use axum::{
extract::State, extract::{Path, State},
http::StatusCode, http::StatusCode,
response::{Html, IntoResponse}, response::{Html, IntoResponse},
}; };
use sqlx::SqlitePool; use sqlx::SqlitePool;
use std::fmt::Write; use std::fmt::Write;
use tracing::{error, instrument}; use tracing::{error, instrument, warn};
#[instrument(skip_all)]
pub async fn get_script_by_id(
State(database): State<SqlitePool>,
Path(id): Path<String>,
) -> impl IntoResponse {
let script = match crate::db::get_script(&database, id).await {
Ok(script) => script,
Err(e) => {
warn!(err = e.to_string(), "get_script");
return Err(StatusCode::NOT_FOUND);
}
};
let output = format!(
r##"<section id="{}"><h1>{}</h1><div id="{}-parameters">{}</div></section>"##,
script.0,
script.1.name(),
script.0,
script
.1
.parameters()
.iter()
.fold(String::new(), |mut acc, x| {
if let Err(e) = write!(acc, "<p>{:?}</p>", x) {
error!(err = e.to_string(), script = ?x, "failed to write parameter");
return String::new();
}
acc
})
);
Ok(Html(output))
}
#[instrument(skip_all)] #[instrument(skip_all)]
pub async fn get_scripts(State(database): State<SqlitePool>) -> impl IntoResponse { pub async fn get_scripts(State(database): State<SqlitePool>) -> impl IntoResponse {
@ -18,14 +52,23 @@ pub async fn get_scripts(State(database): State<SqlitePool>) -> impl IntoRespons
}; };
let content = scripts.iter().fold(String::new(), |mut acc, x| { let content = scripts.iter().fold(String::new(), |mut acc, x| {
if let Err(e) = write!(acc, "<li>{} [", x.1.name()) { if let Err(e) = write!(
error!(err = e.to_string(), script=?x ,"failed to write name"); acc,
return String::new(); r##"<li hx-get="/scripts/{0}" hx-push-url="/scripts/{0}" hx-target="#scripts" hx-swap="outerHTML">{1} [{0}]</li>"##,
} x.0,
if let Err(e) = write!(acc, "{}]</li>", x.0) { x.1.name()
error!(err = e.to_string(), script=?x ,"failed to write id"); ) {
error!(err = e.to_string(), script=?x ,"failed to write script");
return String::new(); return String::new();
} }
// if let Err(e) = write!(acc, "{} [", x.1.name()) {
// error!(err = e.to_string(), script=?x ,"failed to write id");
// return String::new();
// }
// if let Err(e) = write!(acc, "{}]</li>", x.0) {
// error!(err = e.to_string(), script=?x ,"failed to write id");
// return String::new();
// }
acc acc
}); });