a73x

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()
}