From 087ecfd7838e736d9916b242787a89840bf21ef8 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 13 Aug 2023 15:33:11 +0200 Subject: [PATCH] Move /commit/:hash/enqueue to /admin/queue/add --- ...82e62f7973dc2d35835693dd5bdd696759de0.json | 12 ----- ...a242829f0b5a65e39e98070664533621bc4c2.json | 12 +++++ Cargo.lock | 39 ++++++++++++++++ Cargo.toml | 1 + src/server/web.rs | 11 +++-- src/server/web/admin.rs | 1 + src/server/web/admin/queue.rs | 46 +++++++++++++++++++ src/server/web/commit.rs | 25 ++-------- templates/commit.html | 6 ++- 9 files changed, 113 insertions(+), 40 deletions(-) delete mode 100644 .sqlx/query-091ccc5f03da1f11d8efafe1a0082e62f7973dc2d35835693dd5bdd696759de0.json create mode 100644 .sqlx/query-aaf84d58ad3670609cf7cb28243a242829f0b5a65e39e98070664533621bc4c2.json create mode 100644 src/server/web/admin.rs create mode 100644 src/server/web/admin/queue.rs diff --git a/.sqlx/query-091ccc5f03da1f11d8efafe1a0082e62f7973dc2d35835693dd5bdd696759de0.json b/.sqlx/query-091ccc5f03da1f11d8efafe1a0082e62f7973dc2d35835693dd5bdd696759de0.json deleted file mode 100644 index 8d30f47..0000000 --- a/.sqlx/query-091ccc5f03da1f11d8efafe1a0082e62f7973dc2d35835693dd5bdd696759de0.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "INSERT OR IGNORE INTO queue (hash, date, priority) VALUES (?, ?, 1)", - "describe": { - "columns": [], - "parameters": { - "Right": 2 - }, - "nullable": [] - }, - "hash": "091ccc5f03da1f11d8efafe1a0082e62f7973dc2d35835693dd5bdd696759de0" -} diff --git a/.sqlx/query-aaf84d58ad3670609cf7cb28243a242829f0b5a65e39e98070664533621bc4c2.json b/.sqlx/query-aaf84d58ad3670609cf7cb28243a242829f0b5a65e39e98070664533621bc4c2.json new file mode 100644 index 0000000..305029a --- /dev/null +++ b/.sqlx/query-aaf84d58ad3670609cf7cb28243a242829f0b5a65e39e98070664533621bc4c2.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO queue (hash, date, priority) VALUES (?, ?, ?) ON CONFLICT (hash) DO UPDATE SET priority = excluded.priority WHERE priority < excluded.priority ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "aaf84d58ad3670609cf7cb28243a242829f0b5a65e39e98070664533621bc4c2" +} diff --git a/Cargo.lock b/Cargo.lock index 16d927a..fda9c62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,6 +234,31 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-extra" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93e433be9382c737320af3924f7d5fc6f89c155cf2bf88949d8f5126fab283f" +dependencies = [ + "axum", + "axum-core", + "axum-macros", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "mime", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_html_form", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-macros" version = "0.3.8" @@ -2678,6 +2703,19 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "serde_html_form" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde65b75f2603066b78d6fa239b2c07b43e06ead09435f60554d3912962b4a3c" +dependencies = [ + "form_urlencoded", + "indexmap 2.0.0", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_json" version = "1.0.104" @@ -3130,6 +3168,7 @@ dependencies = [ "askama", "askama_axum", "axum", + "axum-extra", "clap", "directories", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 1f309f3..7161cce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ anyhow = "1.0.72" askama = { version = "0.12.0", features = ["with-axum"] } askama_axum = "0.3.0" axum = { version = "0.6.19", features = ["macros", "headers"] } +axum-extra = { version = "0.7.7", features = ["typed-routing"] } clap = { version = "4.3.19", features = ["derive", "deprecated"] } directories = "5.0.1" flate2 = "1.0.26" diff --git a/src/server/web.rs b/src/server/web.rs index 761f608..5e16627 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -1,3 +1,4 @@ +mod admin; mod api; mod commit; mod index; @@ -6,13 +7,13 @@ mod queue; mod r#static; mod worker; -use axum::{ - routing::{get, post}, - Router, -}; +use axum::{routing::get, Router}; +use axum_extra::routing::RouterExt; use crate::{config::Config, somehow}; +use self::admin::queue::post_admin_queue_add; + use super::Server; pub enum Tab { @@ -49,10 +50,10 @@ pub async fn run(server: Server) -> somehow::Result<()> { let app = Router::new() .route("/", get(index::get)) .route("/commit/:hash", get(commit::get)) - .route("/commit/:hash/enqueue", post(commit::post_enqueue)) .route("/queue/", get(queue::get)) .route("/queue/inner", get(queue::get_inner)) .route("/worker/:name", get(worker::get)) + .typed_post(post_admin_queue_add) .merge(api::router(&server)) .fallback(get(r#static::static_handler)) .with_state(server.clone()); diff --git a/src/server/web/admin.rs b/src/server/web/admin.rs new file mode 100644 index 0000000..e8ae652 --- /dev/null +++ b/src/server/web/admin.rs @@ -0,0 +1 @@ +pub mod queue; diff --git a/src/server/web/admin/queue.rs b/src/server/web/admin/queue.rs new file mode 100644 index 0000000..e14c884 --- /dev/null +++ b/src/server/web/admin/queue.rs @@ -0,0 +1,46 @@ +use axum::{ + extract::State, + response::{IntoResponse, Redirect}, + Form, +}; +use axum_extra::routing::TypedPath; +use serde::Deserialize; +use sqlx::SqlitePool; +use time::OffsetDateTime; + +use crate::{config::Config, somehow}; + +#[derive(Deserialize, TypedPath)] +#[typed_path("/admin/queue/add")] +pub struct PathAdminQueueAdd {} + +#[derive(Deserialize)] +pub struct FormAdminQueueAdd { + hash: String, + #[serde(default)] + priority: i32, +} + +pub async fn post_admin_queue_add( + _path: PathAdminQueueAdd, + State(config): State<&'static Config>, + State(db): State, + Form(form): Form, +) -> somehow::Result { + let date = OffsetDateTime::now_utc(); + sqlx::query!( + "\ + INSERT INTO queue (hash, date, priority) VALUES (?, ?, ?) \ + ON CONFLICT (hash) DO UPDATE \ + SET priority = excluded.priority WHERE priority < excluded.priority \ + ", + form.hash, + date, + form.priority, + ) + .execute(&db) + .await?; + + // TODO Replace with typed link + Ok(Redirect::to(&format!("{}queue/", config.web_base))) +} diff --git a/src/server/web/commit.rs b/src/server/web/commit.rs index 8f1b54e..55adafc 100644 --- a/src/server/web/commit.rs +++ b/src/server/web/commit.rs @@ -2,15 +2,14 @@ use askama::Template; use axum::{ extract::{Path, State}, http::StatusCode, - response::{IntoResponse, Redirect, Response}, + response::{IntoResponse, Response}, }; use futures::TryStreamExt; use sqlx::SqlitePool; -use time::OffsetDateTime; use crate::{config::Config, server::util, somehow}; -use super::{link::CommitLink, Base, Tab}; +use super::{admin::queue::PathAdminQueueAdd, link::CommitLink, Base, Tab}; #[derive(Template)] #[template(path = "commit.html")] @@ -26,6 +25,7 @@ struct CommitTemplate { summary: String, message: String, reachable: i64, + link_admin_queue_add: PathAdminQueueAdd, } pub async fn get( @@ -96,24 +96,7 @@ pub async fn get( summary: util::format_commit_summary(&commit.message), message: commit.message.trim_end().to_string(), reachable: commit.reachable, + link_admin_queue_add: PathAdminQueueAdd {}, } .into_response()) } - -// TODO Move to /admin/queue/add -pub async fn post_enqueue( - Path(hash): Path, - State(config): State<&'static Config>, - State(db): State, -) -> somehow::Result { - let date = OffsetDateTime::now_utc(); - sqlx::query!( - "INSERT OR IGNORE INTO queue (hash, date, priority) VALUES (?, ?, 1)", - hash, - date, - ) - .execute(&db) - .await?; - - Ok(Redirect::to(&format!("{}queue/", config.web_base))) -} diff --git a/templates/commit.html b/templates/commit.html index bef213d..aca90e6 100644 --- a/templates/commit.html +++ b/templates/commit.html @@ -34,7 +34,9 @@ title="{% call util::commit_title(reachable) %}">{{ message }} -
- + + + +
{% endblock %}