Display current inputs for flakes

This commit is contained in:
clerie 2025-02-08 15:53:25 +01:00
parent 56a331555e
commit 8ab45c982a
4 changed files with 64 additions and 0 deletions

View File

@ -125,6 +125,7 @@ async fn route_flake(
Ok(render_template(&FlakeTemplate { Ok(render_template(&FlakeTemplate {
uri: uri.clone(), uri: uri.clone(),
revisions: state.storage.revisions_from_flake(&uri).await?, revisions: state.storage.revisions_from_flake(&uri).await?,
current_inputs: state.storage.current_inputs_for_flake(&uri).await?,
})?) })?)
} }

View File

@ -105,6 +105,31 @@ impl Storage {
.await .await
.context("Failed to fetch data from database") .context("Failed to fetch data from database")
} }
pub async fn current_inputs_for_flake(&self, flake_uri: &str) -> Result<Vec<InputForFlakeRow>> {
sqlx::query_as("
SELECT
flake_revisions.revision_uri,
MAX(flake_revisions.last_modified) AS last_modified,
flake_revisions_inputs.input_name,
flake_revisions_inputs.uri
FROM
flake_revisions
LEFT JOIN
flake_revisions_inputs
ON
flake_revisions.revision_uri = flake_revisions_inputs.flake_revision_uri
WHERE
flake_revisions.uri = ?
GROUP BY
flake_revisions_inputs.input_name
")
.bind(&flake_uri)
.fetch_all(&self.db)
.await
.context("Failed to fetch data from database")
}
} }
#[derive(FromRow)] #[derive(FromRow)]
@ -117,6 +142,24 @@ pub struct FlakeRevisionRow {
pub last_modified: Option<i64>, pub last_modified: Option<i64>,
} }
#[derive(FromRow)]
pub struct InputForFlakeRow {
pub revision_uri: String,
pub last_modified: Option<i64>,
pub input_name: String,
pub uri: Option<String>,
}
impl InputForFlakeRow {
pub fn flake_link(&self ) -> String {
match &self.uri {
Some(uri) => format!("/f/{}", urlencode(&uri)),
None => String::from("#"),
}
}
}
#[derive(FromRow)] #[derive(FromRow)]
pub struct RevisionListModel { pub struct RevisionListModel {
pub revision_uri: String, pub revision_uri: String,

View File

@ -5,6 +5,7 @@ use crate::{
storage::{ storage::{
FlakeUri, FlakeUri,
InputModel, InputModel,
InputForFlakeRow,
RevisionListModel, RevisionListModel,
}, },
}; };
@ -25,6 +26,7 @@ pub struct FlakesTemplate {
pub struct FlakeTemplate { pub struct FlakeTemplate {
pub uri: String, pub uri: String,
pub revisions: Vec<RevisionListModel>, pub revisions: Vec<RevisionListModel>,
pub current_inputs: Vec<InputForFlakeRow>,
} }
#[derive(Template)] #[derive(Template)]

View File

@ -14,5 +14,23 @@
<li><a href="{{ revision.link() }}">{{ revision.revision_uri }}</a> ({{ revision.last_modified }})</li> <li><a href="{{ revision.link() }}">{{ revision.revision_uri }}</a> ({{ revision.last_modified }})</li>
{% endfor %} {% endfor %}
</ul> </ul>
<h2>Current Inputs</h2>
<ul>
{% for input in current_inputs %}
<li>
{{ input.input_name }}
<ul>
{% match input.uri %}
{% when Some with (uri) %}
<li>Flake: <a href="{{ input.flake_link() }}">{{ uri }}</a></li>
{% when None %}
{% endmatch %}
</ul>
</li>
{% endfor %}
</ul>
{% endblock %} {% endblock %}