@@ -6,7 +6,6 @@ use crate::views::EncodableApiTokenWithToken;
66use crate :: app:: AppState ;
77use crate :: auth:: AuthCheck ;
88use crate :: models:: token:: { CrateScope , EndpointScope } ;
9- use crate :: tasks:: spawn_blocking;
109use crate :: util:: diesel:: prelude:: * ;
1110use crate :: util:: errors:: { bad_request, AppResult } ;
1211use axum:: extract:: { Path , Query } ;
@@ -17,7 +16,7 @@ use axum_extra::response::ErasedJson;
1716use chrono:: NaiveDateTime ;
1817use diesel:: data_types:: PgInterval ;
1918use diesel:: dsl:: { now, IntervalDsl } ;
20- use diesel_async:: async_connection_wrapper :: AsyncConnectionWrapper ;
19+ use diesel_async:: RunQueryDsl ;
2120use http:: request:: Parts ;
2221use http:: StatusCode ;
2322
@@ -42,8 +41,6 @@ pub async fn list(
4241 Query ( params) : Query < GetParams > ,
4342 req : Parts ,
4443) -> AppResult < ErasedJson > {
45- use diesel_async:: RunQueryDsl ;
46-
4744 let mut conn = app. db_read_prefer_primary ( ) . await ?;
4845 let auth = AuthCheck :: only_cookie ( ) . check ( & req, & mut conn) . await ?;
4946 let user = auth. user ( ) ;
@@ -91,89 +88,85 @@ pub async fn new(
9188
9289 let mut conn = app. db_write ( ) . await ?;
9390 let auth = AuthCheck :: default ( ) . check ( & parts, & mut conn) . await ?;
94- spawn_blocking ( move || {
95- use diesel:: RunQueryDsl ;
96-
97- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
9891
99- if auth. api_token_id ( ) . is_some ( ) {
100- return Err ( bad_request (
101- "cannot use an API token to create a new API token" ,
102- ) ) ;
103- }
92+ if auth. api_token_id ( ) . is_some ( ) {
93+ return Err ( bad_request (
94+ "cannot use an API token to create a new API token" ,
95+ ) ) ;
96+ }
10497
105- let user = auth. user ( ) ;
98+ let user = auth. user ( ) ;
10699
107- let max_token_per_user = 500 ;
108- let count: i64 = ApiToken :: belonging_to ( user) . count ( ) . get_result ( conn) ?;
109- if count >= max_token_per_user {
110- return Err ( bad_request ( format ! (
111- "maximum tokens per user is: {max_token_per_user}"
112- ) ) ) ;
113- }
100+ let max_token_per_user = 500 ;
101+ let count: i64 = ApiToken :: belonging_to ( user)
102+ . count ( )
103+ . get_result ( & mut conn)
104+ . await ?;
105+ if count >= max_token_per_user {
106+ return Err ( bad_request ( format ! (
107+ "maximum tokens per user is: {max_token_per_user}"
108+ ) ) ) ;
109+ }
114110
115- let crate_scopes = new
116- . api_token
117- . crate_scopes
118- . map ( |scopes| {
119- scopes
120- . into_iter ( )
121- . map ( CrateScope :: try_from)
122- . collect :: < Result < Vec < _ > , _ > > ( )
123- } )
124- . transpose ( )
125- . map_err ( |_err| bad_request ( "invalid crate scope" ) ) ?;
126-
127- let endpoint_scopes = new
128- . api_token
129- . endpoint_scopes
130- . map ( |scopes| {
131- scopes
132- . into_iter ( )
133- . map ( |scope| EndpointScope :: try_from ( scope. as_bytes ( ) ) )
134- . collect :: < Result < Vec < _ > , _ > > ( )
135- } )
136- . transpose ( )
137- . map_err ( |_err| bad_request ( "invalid endpoint scope" ) ) ?;
138-
139- let recipient = user. email ( conn) ?;
140-
141- let api_token = ApiToken :: insert_with_scopes (
142- conn,
143- user. id ,
144- & new. api_token . name ,
145- crate_scopes,
146- endpoint_scopes,
147- new. api_token . expired_at ,
148- ) ? ;
149-
150- if let Some ( recipient ) = recipient {
151- let email = NewTokenEmail {
152- token_name : & new . api_token . name ,
153- user_name : & user . gh_login ,
154- domain : & app . emails . domain ,
155- } ;
156-
157- // At this point the token has been created so failing to send the
158- // email should not cause an error response to be returned to the
159- // caller.
160- let email_ret = app . emails . send ( & recipient , email ) ;
161- if let Err ( e ) = email_ret {
162- error ! ( "Failed to send token creation email: {e}" )
163- }
111+ let crate_scopes = new
112+ . api_token
113+ . crate_scopes
114+ . map ( |scopes| {
115+ scopes
116+ . into_iter ( )
117+ . map ( CrateScope :: try_from)
118+ . collect :: < Result < Vec < _ > , _ > > ( )
119+ } )
120+ . transpose ( )
121+ . map_err ( |_err| bad_request ( "invalid crate scope" ) ) ?;
122+
123+ let endpoint_scopes = new
124+ . api_token
125+ . endpoint_scopes
126+ . map ( |scopes| {
127+ scopes
128+ . into_iter ( )
129+ . map ( |scope| EndpointScope :: try_from ( scope. as_bytes ( ) ) )
130+ . collect :: < Result < Vec < _ > , _ > > ( )
131+ } )
132+ . transpose ( )
133+ . map_err ( |_err| bad_request ( "invalid endpoint scope" ) ) ?;
134+
135+ let recipient = user. async_email ( & mut conn) . await ?;
136+
137+ let api_token = ApiToken :: insert_with_scopes (
138+ & mut conn,
139+ user. id ,
140+ & new. api_token . name ,
141+ crate_scopes,
142+ endpoint_scopes,
143+ new. api_token . expired_at ,
144+ )
145+ . await ? ;
146+
147+ if let Some ( recipient ) = recipient {
148+ let email = NewTokenEmail {
149+ token_name : & new . api_token . name ,
150+ user_name : & user . gh_login ,
151+ domain : & app . emails . domain ,
152+ } ;
153+
154+ // At this point the token has been created so failing to send the
155+ // email should not cause an error response to be returned to the
156+ // caller.
157+ let email_ret = app . emails . async_send ( & recipient , email ) . await ;
158+ if let Err ( e ) = email_ret {
159+ error ! ( "Failed to send token creation email: {e}" )
164160 }
161+ }
165162
166- let api_token = EncodableApiTokenWithToken :: from ( api_token) ;
163+ let api_token = EncodableApiTokenWithToken :: from ( api_token) ;
167164
168- Ok ( json ! ( { "api_token" : api_token } ) )
169- } )
170- . await
165+ Ok ( json ! ( { "api_token" : api_token } ) )
171166}
172167
173168/// Handles the `GET /me/tokens/:id` route.
174169pub async fn show ( app : AppState , Path ( id) : Path < i32 > , req : Parts ) -> AppResult < ErasedJson > {
175- use diesel_async:: RunQueryDsl ;
176-
177170 let mut conn = app. db_write ( ) . await ?;
178171 let auth = AuthCheck :: default ( ) . check ( & req, & mut conn) . await ?;
179172 let user = auth. user ( ) ;
@@ -188,8 +181,6 @@ pub async fn show(app: AppState, Path(id): Path<i32>, req: Parts) -> AppResult<E
188181
189182/// Handles the `DELETE /me/tokens/:id` route.
190183pub async fn revoke ( app : AppState , Path ( id) : Path < i32 > , req : Parts ) -> AppResult < ErasedJson > {
191- use diesel_async:: RunQueryDsl ;
192-
193184 let mut conn = app. db_write ( ) . await ?;
194185 let auth = AuthCheck :: default ( ) . check ( & req, & mut conn) . await ?;
195186 let user = auth. user ( ) ;
@@ -203,8 +194,6 @@ pub async fn revoke(app: AppState, Path(id): Path<i32>, req: Parts) -> AppResult
203194
204195/// Handles the `DELETE /tokens/current` route.
205196pub async fn revoke_current ( app : AppState , req : Parts ) -> AppResult < Response > {
206- use diesel_async:: RunQueryDsl ;
207-
208197 let mut conn = app. db_write ( ) . await ?;
209198 let auth = AuthCheck :: default ( ) . check ( & req, & mut conn) . await ?;
210199 let api_token_id = auth
0 commit comments