//! Git issue tracker routes: read-only list and detail views. //! Also includes the commit-message issue reference parser and process-push endpoint. mod issues; mod push_refs; mod settings; use axum::routing::get; use crate::{ csrf::{post_csrf, post_csrf_skip, CsrfRouter}, routes::git::{resolve_repo, repos_root}, AppState, }; /// Register all git issue routes. pub fn git_issue_routes() -> CsrfRouter { CsrfRouter::new() // Issue list + detail (read-only) .route_get("/git/{owner}/{repo}/issues", get(issues::issue_list)) .route_get("/git/{owner}/{repo}/issues/{number}", get(issues::issue_detail)) // Repo settings .route_get("/git/{owner}/{repo}/settings", get(settings::repo_settings_form)) .route("/git/{owner}/{repo}/settings", post_csrf(settings::repo_settings_save)) .route("/git/{owner}/{repo}/settings/delete", post_csrf(settings::repo_settings_delete)) // Internal: commit-message issue references .route("/api/internal/issues/process-push", post_csrf_skip("internal git push hook, HMAC bearer", push_refs::process_push)) } /// Get the default branch name for a repo (for nav bar links). fn default_ref(state: &AppState, owner: &str, repo_name: &str) -> String { let root = match repos_root(state) { Ok(r) => r, Err(_) => return "main".to_string(), }; match crate::git::open_repo(&root, owner, repo_name) { Ok(repo) => { let info = crate::git::repo_info(&repo, repo_name); info.default_branch } Err(_) => "main".to_string(), } }