diff --git a/.sqlx/query-c1e772c34a0324159ca1ee204806c3774762a3df4c6d06a4ea4df67b105bac00.json b/.sqlx/query-c1e772c34a0324159ca1ee204806c3774762a3df4c6d06a4ea4df67b105bac00.json new file mode 100644 index 0000000..9e7a34c --- /dev/null +++ b/.sqlx/query-c1e772c34a0324159ca1ee204806c3774762a3df4c6d06a4ea4df67b105bac00.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT hash, message, reachable FROM commits JOIN queue USING (hash) WHERE hash = ? ", + "describe": { + "columns": [ + { + "name": "hash", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "message", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "reachable", + "ordinal": 2, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "c1e772c34a0324159ca1ee204806c3774762a3df4c6d06a4ea4df67b105bac00" +} diff --git a/src/server/web.rs b/src/server/web.rs index e939aed..5cb591b 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -23,7 +23,7 @@ use self::{ pages::{ commit::get_commit_by_hash, index::get_index, - queue::{get_queue, get_queue_inner}, + queue::{get_queue, get_queue_delete, get_queue_inner}, run::get_run_by_id, worker::get_worker_by_name, }, @@ -40,6 +40,7 @@ pub async fn run(server: Server) -> somehow::Result<()> { .typed_get(get_commit_by_hash) .typed_get(get_index) .typed_get(get_queue) + .typed_get(get_queue_delete) .typed_get(get_queue_inner) .typed_get(get_run_by_id) .typed_get(get_worker_by_name) diff --git a/src/server/web/pages/queue.rs b/src/server/web/pages/queue.rs index 7859d3b..d42ba3d 100644 --- a/src/server/web/pages/queue.rs +++ b/src/server/web/pages/queue.rs @@ -4,7 +4,11 @@ use std::{ }; use askama::Template; -use axum::{extract::State, response::IntoResponse}; +use axum::{ + extract::State, + http::StatusCode, + response::{IntoResponse, Response}, +}; use futures::TryStreamExt; use sqlx::SqlitePool; @@ -17,7 +21,7 @@ use crate::{ link::{LinkCommit, LinkRunShort, LinkWorker}, paths::{ PathAdminQueueDecrease, PathAdminQueueDelete, PathAdminQueueIncrease, PathQueue, - PathQueueInner, + PathQueueDelete, PathQueueInner, }, r#static::QUEUE_JS, }, @@ -127,11 +131,13 @@ async fn get_queue_data( ) .fetch(db) .map_ok(|r| Task { - link_delete: base.link(PathAdminQueueDelete {}), + workers: workers_by_commit.remove(&r.hash).unwrap_or_default(), + link_delete: base.link(PathQueueDelete { + hash: r.hash.clone(), + }), link_increase: base.link(PathAdminQueueIncrease {}), link_decrease: base.link(PathAdminQueueDecrease {}), hash: r.hash.clone(), - workers: workers_by_commit.remove(&r.hash).unwrap_or_default(), commit: LinkCommit::new(base, r.hash, &r.message, r.reachable), since: util::format_delta_from_now(r.date), priority: r.priority, @@ -155,7 +161,7 @@ async fn get_queue_data( #[derive(Template)] #[template(path = "pages/queue_inner.html")] -struct QueueInnerTemplate { +struct PageInner { workers: Vec, tasks: Vec, } @@ -170,14 +176,15 @@ pub async fn get_queue_inner( let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; let tasks = get_queue_data(&db, &sorted_workers, &base).await?; - Ok(QueueInnerTemplate { workers, tasks }) + Ok(PageInner { workers, tasks }) } + #[derive(Template)] #[template(path = "pages/queue.html")] -struct QueueTemplate { +struct Page { link_queue_js: Link, base: Base, - inner: QueueInnerTemplate, + inner: PageInner, } pub async fn get_queue( @@ -190,9 +197,52 @@ pub async fn get_queue( let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; let tasks = get_queue_data(&db, &sorted_workers, &base).await?; - Ok(QueueTemplate { + Ok(Page { link_queue_js: base.link(QUEUE_JS), base, - inner: QueueInnerTemplate { workers, tasks }, + inner: PageInner { workers, tasks }, }) } + +#[derive(Template)] +#[template(path = "pages/queue_delete.html")] +struct PageDelete { + base: Base, + link_delete: Link, + + short: String, + commit: LinkCommit, + hash: String, +} + +pub async fn get_queue_delete( + path: PathQueueDelete, + State(config): State<&'static Config>, + State(db): State, +) -> somehow::Result { + let base = Base::new(config, Tab::Queue); + + let Some(r) = sqlx::query!( + "\ + SELECT hash, message, reachable FROM commits \ + JOIN queue USING (hash) \ + WHERE hash = ? \ + ", + path.hash, + ) + .fetch_optional(&db) + .await? + else { + return Ok(StatusCode::NOT_FOUND.into_response()); + }; + + Ok(PageDelete { + short: util::format_commit_short(&r.hash, &r.message), + commit: LinkCommit::new(&base, r.hash.clone(), &r.message, r.reachable), + hash: r.hash, + + link_delete: base.link(PathAdminQueueDelete {}), + base, + } + .into_response()) +} diff --git a/src/server/web/paths.rs b/src/server/web/paths.rs index 9690c62..20e3e51 100644 --- a/src/server/web/paths.rs +++ b/src/server/web/paths.rs @@ -17,6 +17,12 @@ pub struct PathQueue {} #[typed_path("/queue/inner")] pub struct PathQueueInner {} +#[derive(Deserialize, TypedPath)] +#[typed_path("/queue/delete/:hash")] +pub struct PathQueueDelete { + pub hash: String, +} + #[derive(Deserialize, TypedPath)] #[typed_path("/commit/:hash")] pub struct PathCommitByHash { diff --git a/templates/pages/queue_delete.html b/templates/pages/queue_delete.html new file mode 100644 index 0000000..7a9bba1 --- /dev/null +++ b/templates/pages/queue_delete.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block title %}del {{ short }}{% endblock %} + +{% block body %} + +

Delete commit from queue

+ +

You are about to delete this commit from the queue:

+

{{ commit|safe }}

+

All runs of this commit currently in progress will be aborted!

+ +
+ + +
+ +{% endblock %}