Skip to main content

max / makenotwork

1.6 KB · 44 lines History Blame Raw
1 //! Git issue tracker routes: read-only list and detail views.
2 //! Also includes the commit-message issue reference parser and process-push endpoint.
3
4 mod issues;
5 mod push_refs;
6 mod settings;
7
8 use axum::routing::get;
9
10 use crate::{
11 csrf::{post_csrf, post_csrf_skip, CsrfRouter},
12 routes::git::{resolve_repo, repos_root},
13 AppState,
14 };
15
16 /// Register all git issue routes.
17 pub fn git_issue_routes() -> CsrfRouter<AppState> {
18 CsrfRouter::new()
19 // Issue list + detail (read-only)
20 .route_get("/git/{owner}/{repo}/issues", get(issues::issue_list))
21 .route_get("/git/{owner}/{repo}/issues/{number}", get(issues::issue_detail))
22 // Repo settings
23 .route_get("/git/{owner}/{repo}/settings", get(settings::repo_settings_form))
24 .route("/git/{owner}/{repo}/settings", post_csrf(settings::repo_settings_save))
25 .route("/git/{owner}/{repo}/settings/delete", post_csrf(settings::repo_settings_delete))
26 // Internal: commit-message issue references
27 .route("/api/internal/issues/process-push", post_csrf_skip("internal git push hook, HMAC bearer", push_refs::process_push))
28 }
29
30 /// Get the default branch name for a repo (for nav bar links).
31 fn default_ref(state: &AppState, owner: &str, repo_name: &str) -> String {
32 let root = match repos_root(state) {
33 Ok(r) => r,
34 Err(_) => return "main".to_string(),
35 };
36 match crate::git::open_repo(&root, owner, repo_name) {
37 Ok(repo) => {
38 let info = crate::git::repo_info(&repo, repo_name);
39 info.default_branch
40 }
41 Err(_) => "main".to_string(),
42 }
43 }
44