text/x-rust
•
2.17 KB
•
78 lines
use std::sync::Arc;
use askama::Template;
use axum::{body::Body, extract::State, response::Response};
use tower_cookies::Cookies;
use crate::{
AccessType, GlobalState, Project, User,
controllers::not_found,
extractors::PathUserProject,
models::{ContentPage, user::UserModel},
services::{repository::GitRefInfo, session},
views::ThemedRender,
};
#[derive(Template)]
#[template(path = "project/branches.html")]
struct ProjectBranchesTemplate<'a> {
owner: Arc<User>,
project: &'a Project,
access_level: AccessType,
selected_branch: &'a str,
branches: Vec<GitRefInfo>,
logged_in_user: Option<Arc<User>>,
sidebar_projects: Vec<Project>,
content_pages: Vec<ContentPage>,
active_tab: &'static str,
}
pub async fn project_branches_get(
State(state): State<GlobalState>,
cookies: Cookies,
PathUserProject(owner, project): PathUserProject,
) -> Response<Body> {
let logged_in_user = session::current_user(&state, &cookies).await.ok();
let content_pages = state.config.content_pages.clone();
let sidebar_projects = if let Some(ref user) = logged_in_user {
user.sidebar_projects(&state).await
} else {
vec![]
};
let access_level = project
.access_level(logged_in_user.as_ref().map(|user| user.slug.clone()))
.await;
if access_level == AccessType::None {
return not_found(logged_in_user, sidebar_projects, content_pages);
}
let Some(summary) = state.repo.get_git_summary(&owner.slug, &project.slug).await else {
return not_found(logged_in_user, sidebar_projects, content_pages);
};
let mut branches: Vec<GitRefInfo> = vec![];
for b in summary.branches() {
if let Some(info) = state
.repo
.get_git_info(&owner.slug, &project.slug, b, 1, 0)
.await
{
branches.push(info);
}
}
let template = ProjectBranchesTemplate {
owner,
project: &project,
access_level,
selected_branch: &project.main_branch,
branches,
logged_in_user,
sidebar_projects,
content_pages,
active_tab: "",
};
template.response()
}