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} ;
2
4
use axum:: Router ;
3
5
use conduit:: { Handler , HandlerResult , RequestExt } ;
4
- use conduit_axum:: CauseField ;
6
+ use conduit_axum:: { CauseField , ConduitAxumHandler } ;
5
7
use conduit_router:: { RouteBuilder , RoutePattern } ;
6
8
7
9
use crate :: app:: AppState ;
8
10
use crate :: controllers:: * ;
9
- use crate :: middleware:: app:: RequestApp ;
11
+ use crate :: middleware:: app:: { add_app_state_extension , RequestApp } ;
10
12
use crate :: util:: errors:: { AppError , RouteBlocked } ;
11
13
use crate :: util:: EndpointResult ;
12
14
use crate :: Env ;
13
15
14
16
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
+
15
22
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
+ )
16
157
. route (
17
158
"/api/v1/site_metadata" ,
18
159
get ( site_metadata:: show_deployed_sha) ,
19
160
)
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
+ ) ;
21
189
22
190
// Only serve the local checkout of the git index in development mode.
23
191
// In production, for crates.io, cargo gets the index from
@@ -33,157 +201,7 @@ pub fn build_axum_router(state: AppState) -> Router {
33
201
}
34
202
35
203
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 ( )
187
205
}
188
206
189
207
struct C ( pub fn ( & mut dyn RequestExt ) -> EndpointResult ) ;
0 commit comments