Skip to main content

max / makenotwork

2.1 KB · 68 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 AppState,
12 config::Config,
13 csrf::{CsrfRouter, post_csrf, post_csrf_skip},
14 routes::git::{repos_root, resolve_repo},
15 };
16
17 /// Register all git issue routes.
18 pub fn git_issue_routes() -> CsrfRouter<AppState> {
19 CsrfRouter::new()
20 // Issue list + detail (read-only)
21 .route_get("/git/{owner}/{repo}/issues", get(issues::issue_list))
22 .route_get(
23 "/git/{owner}/{repo}/issues/{number}",
24 get(issues::issue_detail),
25 )
26 // Repo settings
27 .route_get(
28 "/git/{owner}/{repo}/settings",
29 get(settings::repo_settings_form),
30 )
31 .route(
32 "/git/{owner}/{repo}/settings",
33 post_csrf(settings::repo_settings_save),
34 )
35 .route(
36 "/git/{owner}/{repo}/settings/delete",
37 post_csrf(settings::repo_settings_delete),
38 )
39 // Internal: commit-message issue references
40 .route(
41 "/api/internal/issues/process-push",
42 post_csrf_skip(
43 "internal git push hook, HMAC bearer",
44 push_refs::process_push,
45 ),
46 )
47 }
48
49 /// Get the default branch name for a repo (for nav bar links).
50 async fn default_ref(config: &Config, owner: &str, repo_name: &str) -> String {
51 let Ok(root) = repos_root(config) else {
52 return "main".to_string();
53 };
54 let owner = owner.to_string();
55 let repo_name = repo_name.to_string();
56 // libgit2 open + repo_info are blocking filesystem work; run them on the
57 // blocking pool so a nav-bar ref lookup can't stall a worker thread
58 // (ultra-fuzz Run 10 Perf S4).
59 tokio::task::spawn_blocking(
60 move || match crate::git::open_repo(&root, &owner, &repo_name) {
61 Ok(repo) => crate::git::repo_info(&repo, &repo_name).default_branch,
62 Err(_) => "main".to_string(),
63 },
64 )
65 .await
66 .unwrap_or_else(|_| "main".to_string())
67 }
68