diff --git a/src/server/web.rs b/src/server/web.rs index 8a45b12..005f8aa 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -1,6 +1,5 @@ mod api; mod commit; -mod commit_hash; mod index; mod queue; mod r#static; @@ -44,8 +43,7 @@ pub async fn run(server: Server) -> somehow::Result<()> { let app = Router::new() .route("/", get(index::get)) - .route("/commit/", get(commit::get)) - .route("/commit/:hash", get(commit_hash::get)) + .route("/commit/:hash", get(commit::get)) .route("/queue/", get(queue::get)) .route("/queue/table", get(queue::get_table)) .merge(api::router(&server)) diff --git a/src/server/web/commit.rs b/src/server/web/commit.rs index a34aaac..913d073 100644 --- a/src/server/web/commit.rs +++ b/src/server/web/commit.rs @@ -1,18 +1,114 @@ use askama::Template; -use axum::{extract::State, response::IntoResponse}; +use axum::{ + extract::{Path, State}, + http::StatusCode, + response::{IntoResponse, Response}, +}; +use futures::TryStreamExt; +use sqlx::SqlitePool; -use crate::{config::Config, somehow}; +use crate::{config::Config, server::util, somehow}; use super::{Base, Tab}; +struct Commit { + hash: String, + short: String, + reachable: i64, +} + +impl Commit { + fn new(hash: String, message: &str, reachable: i64) -> Self { + Self { + short: util::format_commit_short(&hash, message), + hash, + reachable, + } + } +} + #[derive(Template)] #[template(path = "commit.html")] struct CommitTemplate { base: Base, + hash: String, + author: String, + author_date: String, + commit: String, + commit_date: String, + parents: Vec, + children: Vec, + summary: String, + message: String, + reachable: i64, } -pub async fn get(State(config): State<&'static Config>) -> somehow::Result { +pub async fn get( + Path(hash): Path, + State(config): State<&'static Config>, + State(db): State, +) -> somehow::Result { + let Some(commit) = sqlx::query!( + "\ + SELECT \ + hash, \ + author, \ + author_date AS \"author_date: time::OffsetDateTime\", \ + committer, \ + committer_date AS \"committer_date: time::OffsetDateTime\", \ + message, \ + reachable \ + FROM commits \ + WHERE hash = ? \ + ", + hash + ) + .fetch_optional(&db) + .await? + else { + return Ok(StatusCode::NOT_FOUND.into_response()); + }; + + let parents = sqlx::query!( + "\ + SELECT hash, message, reachable FROM commits \ + JOIN commit_links ON hash = parent \ + WHERE child = ? \ + ORDER BY reachable DESC, unixepoch(committer_date) ASC \ + ", + hash + ) + .fetch(&db) + .map_ok(|r| Commit::new(r.hash, &r.message, r.reachable)) + .try_collect::>() + .await?; + + let children = sqlx::query!( + "\ + SELECT hash, message, reachable FROM commits \ + JOIN commit_links ON hash = child \ + WHERE parent = ? \ + ORDER BY reachable DESC, unixepoch(committer_date) ASC \ + ", + hash + ) + .fetch(&db) + .map_ok(|r| Commit::new(r.hash, &r.message, r.reachable)) + .try_collect::>() + .await?; + Ok(CommitTemplate { base: Base::new(config, Tab::Commit), - }) + hash: commit.hash, + author: commit.author, + author_date: util::format_time(commit.author_date), + commit: commit.committer, + commit_date: util::format_time(commit.committer_date), + parents, + children, + summary: util::format_commit_summary(&commit.message), + message: commit.message.trim_end().to_string(), + reachable: commit.reachable, + } + .into_response()) } diff --git a/src/server/web/commit_hash.rs b/src/server/web/commit_hash.rs deleted file mode 100644 index e8a11ea..0000000 --- a/src/server/web/commit_hash.rs +++ /dev/null @@ -1,114 +0,0 @@ -use askama::Template; -use axum::{ - extract::{Path, State}, - http::StatusCode, - response::{IntoResponse, Response}, -}; -use futures::TryStreamExt; -use sqlx::SqlitePool; - -use crate::{config::Config, server::util, somehow}; - -use super::{Base, Tab}; - -struct Commit { - hash: String, - short: String, - reachable: i64, -} - -impl Commit { - fn new(hash: String, message: &str, reachable: i64) -> Self { - Self { - short: util::format_commit_short(&hash, message), - hash, - reachable, - } - } -} - -#[derive(Template)] -#[template(path = "commit_hash.html")] -struct CommitHashTemplate { - base: Base, - hash: String, - author: String, - author_date: String, - commit: String, - commit_date: String, - parents: Vec, - children: Vec, - summary: String, - message: String, - reachable: i64, -} - -pub async fn get( - Path(hash): Path, - State(config): State<&'static Config>, - State(db): State, -) -> somehow::Result { - let Some(commit) = sqlx::query!( - "\ - SELECT \ - hash, \ - author, \ - author_date AS \"author_date: time::OffsetDateTime\", \ - committer, \ - committer_date AS \"committer_date: time::OffsetDateTime\", \ - message, \ - reachable \ - FROM commits \ - WHERE hash = ? \ - ", - hash - ) - .fetch_optional(&db) - .await? - else { - return Ok(StatusCode::NOT_FOUND.into_response()); - }; - - let parents = sqlx::query!( - "\ - SELECT hash, message, reachable FROM commits \ - JOIN commit_links ON hash = parent \ - WHERE child = ? \ - ORDER BY reachable DESC, unixepoch(committer_date) ASC \ - ", - hash - ) - .fetch(&db) - .map_ok(|r| Commit::new(r.hash, &r.message, r.reachable)) - .try_collect::>() - .await?; - - let children = sqlx::query!( - "\ - SELECT hash, message, reachable FROM commits \ - JOIN commit_links ON hash = child \ - WHERE parent = ? \ - ORDER BY reachable DESC, unixepoch(committer_date) ASC \ - ", - hash - ) - .fetch(&db) - .map_ok(|r| Commit::new(r.hash, &r.message, r.reachable)) - .try_collect::>() - .await?; - - Ok(CommitHashTemplate { - base: Base::new(config, Tab::Commit), - hash: commit.hash, - author: commit.author, - author_date: util::format_time(commit.author_date), - commit: commit.committer, - commit_date: util::format_time(commit.committer_date), - parents, - children, - summary: util::format_commit_summary(&commit.message), - message: commit.message.trim_end().to_string(), - reachable: commit.reachable, - } - .into_response()) -} diff --git a/templates/commit.html b/templates/commit.html index dd73ed0..1600b11 100644 --- a/templates/commit.html +++ b/templates/commit.html @@ -1,7 +1,43 @@ {% extends "base.html" %} +{% import "util.html" as util %} -{% block title %}commit{% endblock %} +{% block title %}{{ summary }}{% endblock %} {% block body %} -Sorry, nothing here yet. +

Commit

+
+ commit {{ hash }} +
+
Author:
+
{{ author }}
+ +
AuthorDate:
+
{{ author_date }}
+ +
Commit:
+
{{ commit }}
+ +
CommitDate:
+
{{ commit_date }}
+ + {% for commit in parents %} +
Parent:
+
+ + {% call util::commit_short(commit.short, commit.reachable)%} + +
+ {% endfor %} + + {% for commit in children %} +
Child:
+
+ + {% call util::commit_short(commit.short, commit.reachable)%} + +
+ {% endfor %} +
+
{{ message }}
+
{% endblock %} diff --git a/templates/commit_hash.html b/templates/commit_hash.html deleted file mode 100644 index 1600b11..0000000 --- a/templates/commit_hash.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base.html" %} -{% import "util.html" as util %} - -{% block title %}{{ summary }}{% endblock %} - -{% block body %} -

Commit

-
- commit {{ hash }} -
-
Author:
-
{{ author }}
- -
AuthorDate:
-
{{ author_date }}
- -
Commit:
-
{{ commit }}
- -
CommitDate:
-
{{ commit_date }}
- - {% for commit in parents %} -
Parent:
-
- - {% call util::commit_short(commit.short, commit.reachable)%} - -
- {% endfor %} - - {% for commit in children %} -
Child:
-
- - {% call util::commit_short(commit.short, commit.reachable)%} - -
- {% endfor %} -
-
{{ message }}
-
-{% endblock %}