src/server/http/repo/overview.rs
Ref: Size: 2.2 KiB
use std::sync::Arc;
use axum::extract::{Path, State};
use axum::response::{IntoResponse, Response};
use super::{
AppState, OverviewCommit, collab_counts, head_branch_name, open_repo, recent_commits,
readme::{self, RenderedReadme},
};
#[derive(Debug)]
pub struct OverviewPatch {
pub id: String,
pub title: String,
pub author: String,
}
#[derive(Debug)]
pub struct OverviewIssue {
pub id: String,
pub title: String,
pub author: String,
}
#[derive(askama::Template, askama_web::WebTemplate)]
#[template(path = "repo_overview.html")]
pub struct OverviewTemplate {
pub site_title: String,
pub repo_name: String,
pub active_section: String,
pub open_patches: usize,
pub open_issues: usize,
pub readme: Option<RenderedReadme>,
pub commits: Vec<OverviewCommit>,
pub patches: Vec<OverviewPatch>,
pub issues: Vec<OverviewIssue>,
}
pub async fn overview(
Path(repo_name): Path<String>,
State(state): State<Arc<AppState>>,
) -> Response {
let (_entry, repo) = match open_repo(&state, &repo_name) {
Ok(r) => r,
Err(resp) => return resp,
};
let commits = recent_commits(&repo, 10);
let (open_patches, open_issues) = collab_counts(&repo);
let branch = head_branch_name(&repo);
let readme = readme::load_readme(&repo, &repo_name, &branch);
let patches = git_collab::state::list_patches(&repo)
.unwrap_or_default()
.into_iter()
.filter(|p| p.status == git_collab::state::PatchStatus::Open)
.map(|p| OverviewPatch {
id: p.id,
title: p.title,
author: p.author.name,
})
.collect();
let issues = git_collab::state::list_issues(&repo)
.unwrap_or_default()
.into_iter()
.filter(|i| i.status == git_collab::state::IssueStatus::Open)
.map(|i| OverviewIssue {
id: i.id,
title: i.title,
author: i.author.name,
})
.collect();
OverviewTemplate {
site_title: state.site_title.clone(),
repo_name,
active_section: "overview".to_string(),
open_patches,
open_issues,
readme,
commits,
patches,
issues,
}
.into_response()
}