From 4ccf06db8b021e7e4ea9c9440878ab7ed7613caa Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 13 Aug 2023 16:40:00 +0200 Subject: [PATCH] Use typed paths for all endpoints --- src/server/web.rs | 14 +++++++++----- src/server/web/commit.rs | 18 +++++++++++------- src/server/web/index.rs | 5 +++-- src/server/web/queue.rs | 13 ++++++++----- src/server/web/worker.rs | 12 ++++++------ 5 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/server/web.rs b/src/server/web.rs index ba5d955..3cb67d9 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -19,6 +19,10 @@ use self::{ get_api_worker_bench_repo_by_hash_tree_tar_gz, get_api_worker_repo_by_hash_tree_tar_gz, post_api_worker_status, }, + commit::get_commit_by_hash, + index::get_index, + queue::{get_queue, get_queue_inner}, + worker::get_worker_by_name, }; use super::Server; @@ -55,13 +59,13 @@ pub async fn run(server: Server) -> somehow::Result<()> { // TODO Add text body to body-less status codes let app = Router::new() - .route("/", get(index::get)) - .route("/commit/:hash", get(commit::get)) - .route("/queue/", get(queue::get)) - .route("/queue/inner", get(queue::get_inner)) - .route("/worker/:name", get(worker::get)) .typed_get(get_api_worker_bench_repo_by_hash_tree_tar_gz) .typed_get(get_api_worker_repo_by_hash_tree_tar_gz) + .typed_get(get_commit_by_hash) + .typed_get(get_index) + .typed_get(get_queue) + .typed_get(get_queue_inner) + .typed_get(get_worker_by_name) .typed_post(post_admin_queue_add) .typed_post(post_api_worker_status) .fallback(get(r#static::static_handler)) diff --git a/src/server/web/commit.rs b/src/server/web/commit.rs index ded8266..73f1da9 100644 --- a/src/server/web/commit.rs +++ b/src/server/web/commit.rs @@ -1,6 +1,6 @@ use askama::Template; use axum::{ - extract::{Path, State}, + extract::State, http::StatusCode, response::{IntoResponse, Response}, }; @@ -9,7 +9,11 @@ use sqlx::SqlitePool; use crate::{config::Config, server::util, somehow}; -use super::{link::CommitLink, paths::PathAdminQueueAdd, Base, Tab}; +use super::{ + link::CommitLink, + paths::{PathAdminQueueAdd, PathCommitByHash}, + Base, Tab, +}; #[derive(Template)] #[template(path = "commit.html")] @@ -28,8 +32,8 @@ struct CommitTemplate { link_admin_queue_add: PathAdminQueueAdd, } -pub async fn get( - Path(hash): Path, +pub async fn get_commit_by_hash( + path: PathCommitByHash, State(config): State<&'static Config>, State(db): State, ) -> somehow::Result { @@ -48,7 +52,7 @@ pub async fn get( FROM commits \ WHERE hash = ? \ ", - hash + path.hash, ) .fetch_optional(&db) .await? @@ -63,7 +67,7 @@ pub async fn get( WHERE child = ? \ ORDER BY reachable DESC, unixepoch(committer_date) ASC \ ", - hash + path.hash, ) .fetch(&db) .map_ok(|r| CommitLink::new(&base, r.hash, &r.message, r.reachable)) @@ -77,7 +81,7 @@ pub async fn get( WHERE parent = ? \ ORDER BY reachable DESC, unixepoch(committer_date) ASC \ ", - hash + path.hash, ) .fetch(&db) .map_ok(|r| CommitLink::new(&base, r.hash, &r.message, r.reachable)) diff --git a/src/server/web/index.rs b/src/server/web/index.rs index 131f839..2a7ddbe 100644 --- a/src/server/web/index.rs +++ b/src/server/web/index.rs @@ -5,7 +5,7 @@ use sqlx::SqlitePool; use crate::{config::Config, somehow}; -use super::{link::CommitLink, Base, Tab}; +use super::{link::CommitLink, paths::PathIndex, Base, Tab}; struct Ref { name: String, @@ -21,7 +21,8 @@ struct IndexTemplate { untracked_refs: Vec, } -pub async fn get( +pub async fn get_index( + _path: PathIndex, State(config): State<&'static Config>, State(db): State, ) -> somehow::Result { diff --git a/src/server/web/queue.rs b/src/server/web/queue.rs index ac07e5a..8960c2c 100644 --- a/src/server/web/queue.rs +++ b/src/server/web/queue.rs @@ -20,6 +20,7 @@ use crate::{ use super::{ link::{CommitLink, RunLink, WorkerLink}, + paths::{PathQueue, PathQueueInner}, Base, Tab, }; @@ -88,7 +89,7 @@ async fn get_workers( Ok(result) } -async fn get_queue( +async fn get_queue_data( db: &SqlitePool, workers: &[(String, WorkerInfo)], base: &Base, @@ -148,7 +149,8 @@ struct QueueInnerTemplate { tasks: Vec, } -pub async fn get_inner( +pub async fn get_queue_inner( + _path: PathQueueInner, State(config): State<&'static Config>, State(db): State, State(workers): State>>, @@ -156,7 +158,7 @@ pub async fn get_inner( let base = Base::new(config, Tab::Queue); let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; - let tasks = get_queue(&db, &sorted_workers, &base).await?; + let tasks = get_queue_data(&db, &sorted_workers, &base).await?; Ok(QueueInnerTemplate { workers, tasks }) } #[derive(Template)] @@ -166,7 +168,8 @@ struct QueueTemplate { inner: QueueInnerTemplate, } -pub async fn get( +pub async fn get_queue( + _path: PathQueue, State(config): State<&'static Config>, State(db): State, State(workers): State>>, @@ -174,7 +177,7 @@ pub async fn get( let base = Base::new(config, Tab::Queue); let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; - let tasks = get_queue(&db, &sorted_workers, &base).await?; + let tasks = get_queue_data(&db, &sorted_workers, &base).await?; Ok(QueueTemplate { base, inner: QueueInnerTemplate { workers, tasks }, diff --git a/src/server/web/worker.rs b/src/server/web/worker.rs index 870d223..a77a286 100644 --- a/src/server/web/worker.rs +++ b/src/server/web/worker.rs @@ -2,7 +2,7 @@ use std::sync::{Arc, Mutex}; use askama::Template; use axum::{ - extract::{Path, State}, + extract::State, http::StatusCode, response::{IntoResponse, Response}, }; @@ -13,7 +13,7 @@ use crate::{ somehow, }; -use super::{Base, Tab}; +use super::{paths::PathWorkerByName, Base, Tab}; #[derive(Template)] #[template(path = "worker.html")] @@ -24,19 +24,19 @@ struct WorkerTemplate { // TODO Status } -pub async fn get( - Path(name): Path, +pub async fn get_worker_by_name( + path: PathWorkerByName, State(config): State<&'static Config>, State(workers): State>>, ) -> somehow::Result { - let info = workers.lock().unwrap().clean().get(&name); + let info = workers.lock().unwrap().clean().get(&path.name); let Some(info) = info else { return Ok(StatusCode::NOT_FOUND.into_response()); }; Ok(WorkerTemplate { base: Base::new(config, Tab::None), - name, + name: path.name, last_seen: util::format_time(info.last_seen), } .into_response())