https://dev.kronoz.win/r/rgit.git
1use std::collections::BTreeMap;
2
3use anyhow::Context;
4use askama::Template;
5use axum::{response::Response, Extension};
6
7use super::filters;
8use crate::{database::schema::repository::Repository, into_response};
9
10#[derive(Template)]
11#[template(path = "index.html")]
12pub struct View<'a> {
13 pub repositories: BTreeMap<Option<String>, Vec<&'a Repository<'a>>>,
14}
15
16pub async fn handle(Extension(db): Extension<sled::Db>) -> Result<Response, super::repo::Error> {
17 let mut repositories: BTreeMap<Option<String>, Vec<&Repository<'_>>> = BTreeMap::new();
18
19 let fetched = tokio::task::spawn_blocking(move || Repository::fetch_all(&db))
20 .await
21 .context("Failed to join Tokio task")??;
22 for (k, v) in &fetched {
23 // TODO: fixme
24 let mut split: Vec<_> = k.split('/').collect();
25 split.pop();
26 let key = Some(split.join("/")).filter(|v| !v.is_empty());
27
28 let k = repositories.entry(key).or_default();
29 k.push(v.get());
30 }
31
32 Ok(into_response(&View { repositories }))
33}