Skip to content

Commit 5952463

Browse files
committed
Use axum router
1 parent 04a9964 commit 5952463

File tree

1 file changed

+173
-155
lines changed

1 file changed

+173
-155
lines changed

src/router.rs

Lines changed: 173 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,191 @@
1-
use axum::routing::get;
1+
use axum::handler::Handler as AxumHandler;
2+
use axum::middleware::from_fn_with_state;
3+
use axum::routing::{delete, get, post, put};
24
use axum::Router;
35
use conduit::{Handler, HandlerResult, RequestExt};
4-
use conduit_axum::CauseField;
6+
use conduit_axum::{CauseField, ConduitAxumHandler};
57
use conduit_router::{RouteBuilder, RoutePattern};
68

79
use crate::app::AppState;
810
use crate::controllers::*;
9-
use crate::middleware::app::RequestApp;
11+
use crate::middleware::app::{add_app_state_extension, RequestApp};
1012
use crate::util::errors::{AppError, RouteBlocked};
1113
use crate::util::EndpointResult;
1214
use crate::Env;
1315

1416
pub fn build_axum_router(state: AppState) -> Router {
17+
let conduit = |handler| {
18+
ConduitAxumHandler::wrap(C(handler))
19+
.layer(from_fn_with_state(state.clone(), add_app_state_extension))
20+
};
21+
1522
let mut router = Router::new()
23+
// Route used by both `cargo search` and the frontend
24+
.route("/api/v1/crates", get(conduit(krate::search::search)))
25+
// Routes used by `cargo`
26+
.route("/api/v1/crates/new", put(conduit(krate::publish::publish)))
27+
.route(
28+
"/api/v1/crates/:crate_id/owners",
29+
get(conduit(krate::owners::owners))
30+
.put(conduit(krate::owners::add_owners))
31+
.delete(conduit(krate::owners::remove_owners)),
32+
)
33+
.route(
34+
"/api/v1/crates/:crate_id/:version/yank",
35+
delete(conduit(version::yank::yank)),
36+
)
37+
.route(
38+
"/api/v1/crates/:crate_id/:version/unyank",
39+
put(conduit(version::yank::unyank)),
40+
)
41+
.route(
42+
"/api/v1/crates/:crate_id/:version/download",
43+
get(conduit(version::downloads::download)),
44+
)
45+
// Routes that appear to be unused
46+
.route("/api/v1/versions", get(conduit(version::deprecated::index)))
47+
.route(
48+
"/api/v1/versions/:version_id",
49+
get(conduit(version::deprecated::show_by_id)),
50+
)
51+
// Routes used by the frontend
52+
.route(
53+
"/api/v1/crates/:crate_id",
54+
get(conduit(krate::metadata::show)),
55+
)
56+
.route(
57+
"/api/v1/crates/:crate_id/:version",
58+
get(conduit(version::metadata::show)),
59+
)
60+
.route(
61+
"/api/v1/crates/:crate_id/:version/readme",
62+
get(conduit(krate::metadata::readme)),
63+
)
64+
.route(
65+
"/api/v1/crates/:crate_id/:version/dependencies",
66+
get(conduit(version::metadata::dependencies)),
67+
)
68+
.route(
69+
"/api/v1/crates/:crate_id/:version/downloads",
70+
get(conduit(version::downloads::downloads)),
71+
)
72+
.route(
73+
"/api/v1/crates/:crate_id/:version/authors",
74+
get(conduit(version::metadata::authors)),
75+
)
76+
.route(
77+
"/api/v1/crates/:crate_id/downloads",
78+
get(conduit(krate::downloads::downloads)),
79+
)
80+
.route(
81+
"/api/v1/crates/:crate_id/versions",
82+
get(conduit(krate::metadata::versions)),
83+
)
84+
.route(
85+
"/api/v1/crates/:crate_id/follow",
86+
put(conduit(krate::follow::follow)).delete(conduit(krate::follow::unfollow)),
87+
)
88+
.route(
89+
"/api/v1/crates/:crate_id/following",
90+
get(conduit(krate::follow::following)),
91+
)
92+
.route(
93+
"/api/v1/crates/:crate_id/owner_team",
94+
get(conduit(krate::owners::owner_team)),
95+
)
96+
.route(
97+
"/api/v1/crates/:crate_id/owner_user",
98+
get(conduit(krate::owners::owner_user)),
99+
)
100+
.route(
101+
"/api/v1/crates/:crate_id/reverse_dependencies",
102+
get(conduit(krate::metadata::reverse_dependencies)),
103+
)
104+
.route("/api/v1/keywords", get(conduit(keyword::index)))
105+
.route("/api/v1/keywords/:keyword_id", get(keyword::show))
106+
.route("/api/v1/categories", get(conduit(category::index)))
107+
.route(
108+
"/api/v1/categories/:category_id",
109+
get(conduit(category::show)),
110+
)
111+
.route("/api/v1/category_slugs", get(conduit(category::slugs)))
112+
.route(
113+
"/api/v1/users/:user_id",
114+
get(conduit(user::other::show)).put(conduit(user::me::update_user)),
115+
)
116+
.route(
117+
"/api/v1/users/:user_id/stats",
118+
get(conduit(user::other::stats)),
119+
)
120+
.route("/api/v1/teams/:team_id", get(conduit(team::show_team)))
121+
.route("/api/v1/me", get(conduit(user::me::me)))
122+
.route("/api/v1/me/updates", get(conduit(user::me::updates)))
123+
.route(
124+
"/api/v1/me/tokens",
125+
get(conduit(token::list)).put(conduit(token::new)),
126+
)
127+
.route("/api/v1/me/tokens/:id", delete(conduit(token::revoke)))
128+
.route(
129+
"/api/v1/tokens/current",
130+
delete(conduit(token::revoke_current)),
131+
)
132+
.route(
133+
"/api/v1/me/crate_owner_invitations",
134+
get(conduit(crate_owner_invitation::list)),
135+
)
136+
.route(
137+
"/api/v1/me/crate_owner_invitations/:crate_id",
138+
put(conduit(crate_owner_invitation::handle_invite)),
139+
)
140+
.route(
141+
"/api/v1/me/crate_owner_invitations/accept/:token",
142+
put(conduit(crate_owner_invitation::handle_invite_with_token)),
143+
)
144+
.route(
145+
"/api/v1/me/email_notifications",
146+
put(conduit(user::me::update_email_notifications)),
147+
)
148+
.route("/api/v1/summary", get(conduit(krate::metadata::summary)))
149+
.route(
150+
"/api/v1/confirm/:email_token",
151+
put(conduit(user::me::confirm_user_email)),
152+
)
153+
.route(
154+
"/api/v1/users/:user_id/resend",
155+
put(conduit(user::me::regenerate_token_and_send)),
156+
)
16157
.route(
17158
"/api/v1/site_metadata",
18159
get(site_metadata::show_deployed_sha),
19160
)
20-
.route("/api/v1/keywords/:keyword_id", get(keyword::show));
161+
// Session management
162+
.route(
163+
"/api/private/session/begin",
164+
get(conduit(user::session::begin)),
165+
)
166+
.route(
167+
"/api/private/session/authorize",
168+
get(conduit(user::session::authorize)),
169+
)
170+
.route(
171+
"/api/private/session",
172+
delete(conduit(user::session::logout)),
173+
)
174+
// Metrics
175+
.route(
176+
"/api/private/metrics/:kind",
177+
get(conduit(metrics::prometheus)),
178+
)
179+
// Crate ownership invitations management in the frontend
180+
.route(
181+
"/api/private/crate_owner_invitations",
182+
get(conduit(crate_owner_invitation::private_list)),
183+
)
184+
// Alerts from GitHub scanning for exposed API tokens
185+
.route(
186+
"/api/github/secret-scanning/verify",
187+
post(conduit(github::secret_scanning::verify)),
188+
);
21189

22190
// Only serve the local checkout of the git index in development mode.
23191
// In production, for crates.io, cargo gets the index from
@@ -33,157 +201,7 @@ pub fn build_axum_router(state: AppState) -> Router {
33201
}
34202

35203
pub fn build_router() -> RouteBuilder {
36-
let mut router = RouteBuilder::new();
37-
38-
// Route used by both `cargo search` and the frontend
39-
router.get("/api/v1/crates", C(krate::search::search));
40-
41-
// Routes used by `cargo`
42-
router.put("/api/v1/crates/new", C(krate::publish::publish));
43-
router.get("/api/v1/crates/:crate_id/owners", C(krate::owners::owners));
44-
router.put(
45-
"/api/v1/crates/:crate_id/owners",
46-
C(krate::owners::add_owners),
47-
);
48-
router.delete(
49-
"/api/v1/crates/:crate_id/owners",
50-
C(krate::owners::remove_owners),
51-
);
52-
router.delete(
53-
"/api/v1/crates/:crate_id/:version/yank",
54-
C(version::yank::yank),
55-
);
56-
router.put(
57-
"/api/v1/crates/:crate_id/:version/unyank",
58-
C(version::yank::unyank),
59-
);
60-
router.get(
61-
"/api/v1/crates/:crate_id/:version/download",
62-
C(version::downloads::download),
63-
);
64-
65-
// Routes that appear to be unused
66-
router.get("/api/v1/versions", C(version::deprecated::index));
67-
router.get(
68-
"/api/v1/versions/:version_id",
69-
C(version::deprecated::show_by_id),
70-
);
71-
72-
// Routes used by the frontend
73-
router.get("/api/v1/crates/:crate_id", C(krate::metadata::show));
74-
router.get(
75-
"/api/v1/crates/:crate_id/:version",
76-
C(version::metadata::show),
77-
);
78-
router.get(
79-
"/api/v1/crates/:crate_id/:version/readme",
80-
C(krate::metadata::readme),
81-
);
82-
router.get(
83-
"/api/v1/crates/:crate_id/:version/dependencies",
84-
C(version::metadata::dependencies),
85-
);
86-
router.get(
87-
"/api/v1/crates/:crate_id/:version/downloads",
88-
C(version::downloads::downloads),
89-
);
90-
router.get(
91-
"/api/v1/crates/:crate_id/:version/authors",
92-
C(version::metadata::authors),
93-
);
94-
router.get(
95-
"/api/v1/crates/:crate_id/downloads",
96-
C(krate::downloads::downloads),
97-
);
98-
router.get(
99-
"/api/v1/crates/:crate_id/versions",
100-
C(krate::metadata::versions),
101-
);
102-
router.put("/api/v1/crates/:crate_id/follow", C(krate::follow::follow));
103-
router.delete(
104-
"/api/v1/crates/:crate_id/follow",
105-
C(krate::follow::unfollow),
106-
);
107-
router.get(
108-
"/api/v1/crates/:crate_id/following",
109-
C(krate::follow::following),
110-
);
111-
router.get(
112-
"/api/v1/crates/:crate_id/owner_team",
113-
C(krate::owners::owner_team),
114-
);
115-
router.get(
116-
"/api/v1/crates/:crate_id/owner_user",
117-
C(krate::owners::owner_user),
118-
);
119-
router.get(
120-
"/api/v1/crates/:crate_id/reverse_dependencies",
121-
C(krate::metadata::reverse_dependencies),
122-
);
123-
router.get("/api/v1/keywords", C(keyword::index));
124-
router.get("/api/v1/categories", C(category::index));
125-
router.get("/api/v1/categories/:category_id", C(category::show));
126-
router.get("/api/v1/category_slugs", C(category::slugs));
127-
router.get("/api/v1/users/:user_id", C(user::other::show));
128-
router.put("/api/v1/users/:user_id", C(user::me::update_user));
129-
router.get("/api/v1/users/:user_id/stats", C(user::other::stats));
130-
router.get("/api/v1/teams/:team_id", C(team::show_team));
131-
router.get("/api/v1/me", C(user::me::me));
132-
router.get("/api/v1/me/updates", C(user::me::updates));
133-
router.get("/api/v1/me/tokens", C(token::list));
134-
router.put("/api/v1/me/tokens", C(token::new));
135-
router.delete("/api/v1/me/tokens/:id", C(token::revoke));
136-
router.delete("/api/v1/tokens/current", C(token::revoke_current));
137-
router.get(
138-
"/api/v1/me/crate_owner_invitations",
139-
C(crate_owner_invitation::list),
140-
);
141-
router.put(
142-
"/api/v1/me/crate_owner_invitations/:crate_id",
143-
C(crate_owner_invitation::handle_invite),
144-
);
145-
router.put(
146-
"/api/v1/me/crate_owner_invitations/accept/:token",
147-
C(crate_owner_invitation::handle_invite_with_token),
148-
);
149-
router.put(
150-
"/api/v1/me/email_notifications",
151-
C(user::me::update_email_notifications),
152-
);
153-
router.get("/api/v1/summary", C(krate::metadata::summary));
154-
router.put(
155-
"/api/v1/confirm/:email_token",
156-
C(user::me::confirm_user_email),
157-
);
158-
router.put(
159-
"/api/v1/users/:user_id/resend",
160-
C(user::me::regenerate_token_and_send),
161-
);
162-
163-
// Session management
164-
router.get("/api/private/session/begin", C(user::session::begin));
165-
router.get(
166-
"/api/private/session/authorize",
167-
C(user::session::authorize),
168-
);
169-
router.delete("/api/private/session", C(user::session::logout));
170-
171-
// Metrics
172-
router.get("/api/private/metrics/:kind", C(metrics::prometheus));
173-
174-
// Crate ownership invitations management in the frontend
175-
router.get(
176-
"/api/private/crate_owner_invitations",
177-
C(crate_owner_invitation::private_list),
178-
);
179-
180-
// Alerts from GitHub scanning for exposed API tokens
181-
router.post(
182-
"/api/github/secret-scanning/verify",
183-
C(github::secret_scanning::verify),
184-
);
185-
186-
router
204+
RouteBuilder::new()
187205
}
188206

189207
struct C(pub fn(&mut dyn RequestExt) -> EndpointResult);

0 commit comments

Comments
 (0)