Skip to content
Clone

feat(webapi): assemble five-crate router with session layer and merged ApiDoc

ZhenYi committed
parent 08175f8 commit f413d80 Browse files

5 files changed

+144 −110

File tree 5
Modified lib/git/src/routes.rs View lib/git/src/routes.rs
@@ -46,8 +46,6 @@
4646use crate::handler::graphql::graphql_get;
4747use crate::handler::graphql::graphql_post;
4848use crate::handler::hooks::execute_script::execute_script;
49use crate::handler::hooks::post_receive::post_receive as hook_post_receive;
50use crate::handler::hooks::pre_receive::pre_receive as hook_pre_receive;
5149use crate::handler::logs::commits_between::log_commits_between;
5250use crate::handler::logs::graph::log_graph;
5351use crate::handler::logs::last_commit::log_last_commit as log_last;
@@ -105,265 +103,253 @@
105103use crate::handler::trees::walk::tree_walk;
106104use crate::service::GitService;
107105
108/// Build the git-data API router (`/repos/...` + `/graphql`).
109/// The GraphQL schema is constructed once and exposed via `Extension`.
110106pub fn router(service: GitService) -> Router<GitService> {
111107 let schema = crate::graphql::build_schema(service.state.clone());
112
113108 Router::new()
114109 .route("/graphql", post(graphql_post).get(graphql_get))
115110 .nest("/repos", repos_router())
116111 .layer(Extension(schema))
117 .with_state(service)
118112}
119113
120114fn repos_router() -> Router<GitService> {
121115 Router::new()
122 .route("/:space_name", post(repo_create).get(repo_list))
116 .route("/{space_name}", post(repo_create).get(repo_list))
123117 .route(
124 "/:space_name/:repo_name",
118 "/{space_name}/{repo_name}",
125119 get(repo_get).patch(repo_update).delete(repo_archive),
126120 )
127 .route("/:space_name/:repo_name/archive", post(repo_archive))
128 .route("/:space_name/:repo_name/branches", get(branch_list).post(branch_create))
121 .route("/{space_name}/{repo_name}/archive", post(repo_archive))
122 .route("/{space_name}/{repo_name}/branches", get(branch_list).post(branch_create))
129123 .route(
130 "/:space_name/:repo_name/branches/:name",
124 "/{space_name}/{repo_name}/branches/{name}",
131125 get(branch_get).delete(branch_delete),
132126 )
133127 .route(
134 "/:space_name/:repo_name/branches/:from",
128 "/{space_name}/{repo_name}/branches/{from}",
135129 patch(branch_rename),
136130 )
137131 .route(
138 "/:space_name/:repo_name/branches/:name/default",
132 "/{space_name}/{repo_name}/branches/{name}/default",
139133 post(branch_set_default),
140134 )
141 .route("/:space_name/:repo_name/tags", get(tag_list).post(tag_create))
135 .route("/{space_name}/{repo_name}/tags", get(tag_list).post(tag_create))
142136 .route(
143 "/:space_name/:repo_name/tags/:name",
137 "/{space_name}/{repo_name}/tags/{name}",
144138 get(tag_get).delete(tag_delete),
145139 )
146140 .route(
147 "/:space_name/:repo_name/tags/:name/verify",
141 "/{space_name}/{repo_name}/tags/{name}/verify",
148142 get(tag_verify),
149143 )
150 .route("/:space_name/:repo_name/refs", get(refs_list))
151 .route("/:space_name/:repo_name/refs/head", get(refs_head))
144 .route("/{space_name}/{repo_name}/refs", get(refs_list))
145 .route("/{space_name}/{repo_name}/refs/head", get(refs_head))
152146 .route(
153 "/:space_name/:repo_name/refs/branches",
147 "/{space_name}/{repo_name}/refs/branches",
154148 get(refs_branches),
155149 )
156 .route("/:space_name/:repo_name/refs/filtered", get(filtered))
150 .route("/{space_name}/{repo_name}/refs/filtered", get(filtered))
157151 .route(
158 "/:space_name/:repo_name/refs/contains",
152 "/{space_name}/{repo_name}/refs/contains",
159153 get(is_object_in_ref),
160154 )
161155 .route(
162 "/:space_name/:repo_name/refs/:name",
156 "/{space_name}/{repo_name}/refs/{name}",
163157 get(refs_get).patch(refs_update).delete(refs_delete),
164158 )
165159 .route(
166 "/:space_name/:repo_name/refs/:name/resolve",
160 "/{space_name}/{repo_name}/refs/{name}/resolve",
167161 get(refs_resolve),
168162 )
169163 .route(
170 "/:space_name/:repo_name/commits",
164 "/{space_name}/{repo_name}/commits",
171165 get(list_commits),
172166 )
173167 .route(
174 "/:space_name/:repo_name/commits/:revision",
168 "/{space_name}/{repo_name}/commits/{revision}",
175169 get(get_commit),
176170 )
177171 .route(
178 "/:space_name/:repo_name/commits/stats",
172 "/{space_name}/{repo_name}/commits/stats",
179173 get(commit_stats),
180174 )
181175 .route(
182 "/:space_name/:repo_name/commits/:revision/tree",
176 "/{space_name}/{repo_name}/commits/{revision}/tree",
183177 get(commit_tree_entries),
184178 )
185179 .route(
186 "/:space_name/:repo_name/commits/ancestor",
180 "/{space_name}/{repo_name}/commits/ancestor",
187181 get(is_ancestor),
188182 )
189183 .route(
190 "/:space_name/:repo_name/commits/:revision/sync",
184 "/{space_name}/{repo_name}/commits/{revision}/sync",
191185 post(sync_commit),
192186 )
193187 .route(
194 "/:space_name/:repo_name/rev/:revision",
188 "/{space_name}/{repo_name}/rev/{revision}",
195189 get(rev_parse),
196190 )
197191 .route(
198 "/:space_name/:repo_name/commit-statuses",
192 "/{space_name}/{repo_name}/commit-statuses",
199193 post(set_commit_status),
200194 )
201195 .route(
202 "/:space_name/:repo_name/commit-statuses/:sha",
196 "/{space_name}/{repo_name}/commit-statuses/{sha}",
203197 get(list_commit_statuses),
204198 )
205 .route("/:space_name/:repo_name/logs", get(log_list_handler))
199 .route("/{space_name}/{repo_name}/logs", get(log_list_handler))
206200 .route(
207 "/:space_name/:repo_name/logs/between",
201 "/{space_name}/{repo_name}/logs/between",
208202 get(log_commits_between),
209203 )
210 .route("/:space_name/:repo_name/logs/last", get(log_last))
211 .route("/:space_name/:repo_name/logs/graph", get(log_graph))
204 .route("/{space_name}/{repo_name}/logs/last", get(log_last))
205 .route("/{space_name}/{repo_name}/logs/graph", get(log_graph))
212206 .route(
213 "/:space_name/:repo_name/path-log",
207 "/{space_name}/{repo_name}/path-log",
214208 get(path_log),
215209 )
216210 .route(
217 "/:space_name/:repo_name/blobs/:oid/metadata",
211 "/{space_name}/{repo_name}/blobs/{oid}/metadata",
218212 get(blob_metadata),
219213 )
220214 .route(
221 "/:space_name/:repo_name/blobs/:oid/content",
215 "/{space_name}/{repo_name}/blobs/{oid}/content",
222216 get(blob_content),
223217 )
224218 .route(
225 "/:space_name/:repo_name/blobs/:oid/raw",
219 "/{space_name}/{repo_name}/blobs/{oid}/raw",
226220 get(blob_raw),
227221 )
228222 .route(
229 "/:space_name/:repo_name/lfs-pointers",
223 "/{space_name}/{repo_name}/lfs-pointers",
230224 get(list_lfs_pointers),
231225 )
232226 .route(
233 "/:space_name/:repo_name/tree/:revision",
227 "/{space_name}/{repo_name}/tree/{revision}",
234228 get(tree_read),
235229 )
236 .route("/:space_name/:repo_name/tree/resolve", get(tree_resolve_path))
237 .route("/:space_name/:repo_name/tree/walk", get(tree_walk))
238 .route("/:space_name/:repo_name/tree/follow", get(tree_follow))
230 .route("/{space_name}/{repo_name}/tree/resolve", get(tree_resolve_path))
231 .route("/{space_name}/{repo_name}/tree/walk", get(tree_walk))
232 .route("/{space_name}/{repo_name}/tree/follow", get(tree_follow))
239233 .route(
240 "/:space_name/:repo_name/tree/last-updated",
234 "/{space_name}/{repo_name}/tree/last-updated",
241235 get(tree_last_updated),
242236 )
243 .route("/:space_name/:repo_name/blame", get(blame_handler))
237 .route("/{space_name}/{repo_name}/blame", get(blame_handler))
244238 .route(
245 "/:space_name/:repo_name/submodules",
239 "/{space_name}/{repo_name}/submodules",
246240 get(submodules_list),
247241 )
248242 .route(
249 "/:space_name/:repo_name/submodules/resolve",
243 "/{space_name}/{repo_name}/submodules/resolve",
250244 get(submodules_resolve),
251245 )
252246 .route(
253 "/:space_name/:repo_name/signatures/commit/:sha",
247 "/{space_name}/{repo_name}/signatures/commit/{sha}",
254248 get(verify_commit),
255249 )
256250 .route(
257 "/:space_name/:repo_name/signatures/tag/:name",
251 "/{space_name}/{repo_name}/signatures/tag/{name}",
258252 get(verify_tag),
259253 )
260254 .route(
261 "/:space_name/:repo_name/diff/raw",
255 "/{space_name}/{repo_name}/diff/raw",
262256 get(diff_raw),
263257 )
264258 .route(
265 "/:space_name/:repo_name/diff/files",
259 "/{space_name}/{repo_name}/diff/files",
266260 get(files_changed_between),
267261 )
268262 .route(
269 "/:space_name/:repo_name/diff/shortstat",
263 "/{space_name}/{repo_name}/diff/shortstat",
270264 get(diff_short_stat),
271265 )
272266 .route(
273 "/:space_name/:repo_name/diff/stats",
267 "/{space_name}/{repo_name}/diff/stats",
274268 get(diff_stats),
275269 )
276270 .route(
277 "/:space_name/:repo_name/diff/files-with-context",
271 "/{space_name}/{repo_name}/diff/files-with-context",
278272 get(diff_files),
279273 )
280274 .route(
281 "/:space_name/:repo_name/diff/for-commit/:commit",
275 "/{space_name}/{repo_name}/diff/for-commit/{commit}",
282276 get(diff_for_commit),
283277 )
284278 .route(
285 "/:space_name/:repo_name/diff/tree",
279 "/{space_name}/{repo_name}/diff/tree",
286280 get(diff_tree),
287281 )
288282 .route(
289 "/:space_name/:repo_name/diff/range",
283 "/{space_name}/{repo_name}/diff/range",
290284 post(range_diff),
291285 )
292286 .route(
293 "/:space_name/:repo_name/patch/generate",
287 "/{space_name}/{repo_name}/patch/generate",
294288 get(patch_generate),
295289 )
296290 .route(
297 "/:space_name/:repo_name/patch/apply",
291 "/{space_name}/{repo_name}/patch/apply",
298292 post(patch_apply),
299293 )
300294 .route("/_/patch/parse", post(patch_parse))
301295 .route(
302 "/:space_name/:repo_name/conflicts/check",
296 "/{space_name}/{repo_name}/conflicts/check",
303297 get(conflict_check),
304298 )
305299 .route(
306 "/:space_name/:repo_name/conflicts/files",
300 "/{space_name}/{repo_name}/conflicts/files",
307301 get(conflicted_files),
308302 )
309303 .route(
310 "/:space_name/:repo_name/conflicts/detail",
304 "/{space_name}/{repo_name}/conflicts/detail",
311305 get(conflict_detail),
312306 )
313307 .route(
314 "/:space_name/:repo_name/conflicts/check-threeway",
308 "/{space_name}/{repo_name}/conflicts/check-threeway",
315309 post(conflict_check_threeway),
316310 )
317311 .route(
318 "/:space_name/:repo_name/remotes/import",
312 "/{space_name}/{repo_name}/remotes/import",
319313 post(remote_clone_import),
320314 )
321315 .route(
322 "/:space_name/:repo_name/remotes/fetch",
316 "/{space_name}/{repo_name}/remotes/fetch",
323317 post(remote_fetch),
324318 )
325319 .route(
326 "/:space_name/:repo_name/remotes/push",
320 "/{space_name}/{repo_name}/remotes/push",
327321 post(remote_push),
328322 )
329323 .route(
330 "/:space_name/:repo_name/remotes/:name",
324 "/{space_name}/{repo_name}/remotes/{name}",
331325 post(remote_add).delete(remote_remove),
332326 )
333327 .route(
334 "/:space_name/:repo_name/lfs/locks",
328 "/{space_name}/{repo_name}/lfs/locks",
335329 get(list_locks).post(lock).delete(unlock),
336330 )
337331 .route(
338 "/:space_name/:repo_name/lfs/locks/verify",
332 "/{space_name}/{repo_name}/lfs/locks/verify",
339333 post(verify_locks),
340334 )
341335 .route(
342 "/:space_name/:repo_name/lfs/locks/:lock_id",
336 "/{space_name}/{repo_name}/lfs/locks/{lock_id}",
343337 delete(unlock_by_id),
344338 )
345339 .route(
346 "/:space_name/:repo_name/lfs/cleanup",
340 "/{space_name}/{repo_name}/lfs/cleanup",
347341 post(cleanup_unreferenced),
348342 )
349343 .route(
350 "/_/hooks/pre-receive",
351 post(hook_pre_receive),
352 )
353 .route(
354 "/_/hooks/post-receive",
355 post(hook_post_receive),
356 )
357 .route(
358 "/:space_name/:repo_name/hooks/:script",
344 "/{space_name}/{repo_name}/hooks/{script}",
359345 post(execute_script),
360346 )
361347 .route(
362 "/:space_name/:repo_name/pipelines/trigger",
348 "/{space_name}/{repo_name}/pipelines/trigger",
363349 post(trigger),
364350 )
365351 .route(
366 "/:space_name/:repo_name/pipelines/schedule",
352 "/{space_name}/{repo_name}/pipelines/schedule",
367353 post(schedule),
368354 )
369355 .route(
@@ -371,23 +357,23 @@
371357 post(cancel),
372358 )
373359 .route(
374 "/:space_name/:repo_name/packs/stats",
360 "/{space_name}/{repo_name}/packs/stats",
375361 get(pack_stats),
376362 )
377363 .route(
378 "/:space_name/:repo_name/packs/ingest",
364 "/{space_name}/{repo_name}/packs/ingest",
379365 post(pack_ingest),
380366 )
381367 .route(
382 "/:space_name/:repo_name/packs/repack",
368 "/{space_name}/{repo_name}/packs/repack",
383369 post(pack_repack),
384370 )
385371 .route(
386 "/:space_name/:repo_name/maintenance/prune",
372 "/{space_name}/{repo_name}/maintenance/prune",
387373 post(prune),
388374 )
389375 .route(
390 "/:space_name/:repo_name/maintenance/fsck",
376 "/{space_name}/{repo_name}/maintenance/fsck",
391377 post(fsck),
392378 )
393379 .route(
@@ -395,39 +381,39 @@
395381 post(caller_signature),
396382 )
397383 .route(
398 "/:space_name/:repo_name/contents/blobs",
384 "/{space_name}/{repo_name}/contents/blobs",
399385 post(write_blob),
400386 )
401387 .route(
402 "/:space_name/:repo_name/contents/trees",
388 "/{space_name}/{repo_name}/contents/trees",
403389 post(write_tree_from_files),
404390 )
405391 .route(
406 "/:space_name/:repo_name/contents/commits",
392 "/{space_name}/{repo_name}/contents/commits",
407393 post(commit_object),
408394 )
409395 .route(
410 "/:space_name/:repo_name/analysis/languages",
396 "/{space_name}/{repo_name}/analysis/languages",
411397 get(languages_read).post(languages),
412398 )
413399 .route(
414 "/:space_name/:repo_name/analysis/contributors",
400 "/{space_name}/{repo_name}/analysis/contributors",
415401 get(contributors),
416402 )
417403 .route(
418 "/:space_name/:repo_name/analysis/code-activity",
404 "/{space_name}/{repo_name}/analysis/code-activity",
419405 get(code_activity),
420406 )
421407 .route(
422 "/:space_name/:repo_name/archives/create/:revision",
408 "/{space_name}/{repo_name}/archives/create/{revision}",
423409 post(archive_create),
424410 )
425411 .route(
426 "/:space_name/:repo_name/archives/download/:revision",
412 "/{space_name}/{repo_name}/archives/download/{revision}",
427413 get(archive_download),
428414 )
429415 .route(
430 "/:space_name/:repo_name/archives/bundle",
416 "/{space_name}/{repo_name}/archives/bundle",
431417 post(create_bundle),
432418 )
433419}
No newline at end of file
Modified lib/webapi/src/lib.rs View lib/webapi/src/lib.rs
@@ -1,14 +1,25 @@
1pub fn add(left: u64, right: u64) -> u64 {
2 left + right
3}
1pub mod openapi;
42
5#[cfg(test)]
6mod tests {
7 use super::*;
3use axum::Router;
4use export::AppState;
5use session::{store, SessionLayer};
86
9 #[test]
10 fn it_works() {
11 let result = add(2, 2);
12 assert_eq!(result, 4);
13 }
14}
7pub async fn router(state: AppState) -> Result<Router, axum_session::SessionError> {
8 let store = store::connect(state.redis.clone(), &state.config.session).await?;
9
10 let auth = auth::services::AuthService::new(state.clone());
11 let issues = issues::services::service::IssueService::new(state.clone());
12 let space = space::services::service::SpaceService::new(state.clone());
13 let user = user::services::service::UserService::new(state.clone());
14 let git = git::service::GitService::new(state);
15
16 let router: Router = Router::new()
17 .merge(auth::routes::router(auth.clone()).with_state(auth))
18 .merge(issues::routes::router(issues.clone()).with_state(issues))
19 .merge(space::routes::router(space.clone()).with_state(space))
20 .merge(user::routes::router(user.clone()).with_state(user))
21 .merge(git::routes::router(git.clone()).with_state(git))
22 .layer(SessionLayer::new(store));
23
24 Ok(router)
25}
No newline at end of file
Added lib/webapi/src/openapi.rs View lib/webapi/src/openapi.rs
@@ -0,0 +1,15 @@
1use utoipa::OpenApi;
2
3#[derive(OpenApi)]
4#[openapi(info(title = "gitdata api", version = "1.0"))]
5pub struct WebApiDoc;
6
7pub fn api_doc() -> utoipa::openapi::OpenApi {
8 let mut doc = WebApiDoc::openapi();
9 doc.merge(auth::openapi::AuthApiDoc::openapi());
10 doc.merge(issues::openapi::IssuesApiDoc::openapi());
11 doc.merge(space::openapi::SpaceApiDoc::openapi());
12 doc.merge(user::openapi::UserApiDoc::openapi());
13 doc.merge(git::openapi::GitApiDoc::openapi());
14 doc
15}
No newline at end of file
Modified lib/webapi/Cargo.toml View lib/webapi/Cargo.toml
@@ -4,3 +4,13 @@
44edition.workspace = true
55
66[dependencies]
7auth = { workspace = true }
8issues = { workspace = true }
9space = { workspace = true }
10user = { workspace = true }
11git = { workspace = true }
12export = { workspace = true }
13session = { workspace = true }
14axum = { workspace = true }
15axum_session = { workspace = true }
16utoipa = { version = "5.5", features = ["axum_extras", "time", "uuid"] }
No newline at end of file
Modified Cargo.lock View Cargo.lock
@@ -8656,6 +8656,18 @@
86568656[[package]]
86578657name = "webapi"
86588658version = "1.0.0"
8659dependencies = [
8660 "auth",
8661 "axum",
8662 "axum_session",
8663 "export",
8664 "git",
8665 "issues",
8666 "session",
8667 "space",
8668 "user",
8669 "utoipa",
8670]
86598671
86608672[[package]]
86618673name = "webpki-root-certs"