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