@@ -10,12 +10,10 @@ use axum_extra::json;
1010use axum_extra:: response:: ErasedJson ;
1111use crates_io_database:: schema:: { crates, dependencies} ;
1212use crates_io_worker:: BackgroundJob ;
13- use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
1413use diesel_async:: AsyncPgConnection ;
1514use http:: request:: Parts ;
1615use http:: StatusCode ;
1716use serde:: Deserialize ;
18- use tokio:: runtime:: Handle ;
1917
2018use crate :: app:: AppState ;
2119use crate :: auth:: { AuthCheck , Authentication } ;
@@ -25,9 +23,7 @@ use crate::models::{
2523} ;
2624use crate :: rate_limiter:: LimitedAction ;
2725use crate :: schema:: versions;
28- use crate :: tasks:: spawn_blocking;
2926use crate :: util:: diesel:: prelude:: * ;
30- use crate :: util:: diesel:: Conn ;
3127use crate :: util:: errors:: { bad_request, custom, version_not_found, AppResult } ;
3228use crate :: views:: { EncodableDependency , EncodableVersion } ;
3329use crate :: worker:: jobs:: { SyncToGitIndex , SyncToSparseIndex , UpdateDefaultVersion } ;
@@ -102,16 +98,11 @@ pub async fn show(
10298
10399 let mut conn = state. db_read ( ) . await ?;
104100 let ( version, krate) = version_and_crate ( & mut conn, & crate_name, & version) . await ?;
105- spawn_blocking ( move || {
106- let conn : & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
101+ let published_by = version . published_by ( & mut conn ) . await ? ;
102+ let actions = VersionOwnerAction :: by_version ( & mut conn, & version ) . await ? ;
107103
108- let published_by = version. published_by ( conn) ?;
109- let actions = VersionOwnerAction :: by_version ( conn, & version) ?;
110-
111- let version = EncodableVersion :: from ( version, & krate. name , published_by, actions) ;
112- Ok ( json ! ( { "version" : version } ) )
113- } )
114- . await
104+ let version = EncodableVersion :: from ( version, & krate. name , published_by, actions) ;
105+ Ok ( json ! ( { "version" : version } ) )
115106}
116107
117108/// Handles the `PATCH /crates/:crate/:version` route.
@@ -137,25 +128,21 @@ pub async fn update(
137128 . check_rate_limit ( auth. user_id ( ) , LimitedAction :: YankUnyank , & mut conn)
138129 . await ?;
139130
140- spawn_blocking ( move || {
141- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
142-
143- perform_version_yank_update (
144- & state,
145- conn,
146- & mut version,
147- & krate,
148- & auth,
149- update_request. version . yanked ,
150- update_request. version . yank_message ,
151- ) ?;
152-
153- let published_by = version. published_by ( conn) ?;
154- let actions = VersionOwnerAction :: by_version ( conn, & version) ?;
155- let updated_version = EncodableVersion :: from ( version, & krate. name , published_by, actions) ;
156- Ok ( json ! ( { "version" : updated_version } ) )
157- } )
158- . await
131+ perform_version_yank_update (
132+ & state,
133+ & mut conn,
134+ & mut version,
135+ & krate,
136+ & auth,
137+ update_request. version . yanked ,
138+ update_request. version . yank_message ,
139+ )
140+ . await ?;
141+
142+ let published_by = version. published_by ( & mut conn) . await ?;
143+ let actions = VersionOwnerAction :: by_version ( & mut conn, & version) . await ?;
144+ let updated_version = EncodableVersion :: from ( version, & krate. name , published_by, actions) ;
145+ Ok ( json ! ( { "version" : updated_version } ) )
159146}
160147
161148fn validate_yank_update ( update_data : & VersionUpdate , version : & Version ) -> AppResult < ( ) > {
@@ -186,24 +173,24 @@ pub async fn authenticate(
186173 . await
187174}
188175
189- pub fn perform_version_yank_update (
176+ pub async fn perform_version_yank_update (
190177 state : & AppState ,
191- conn : & mut impl Conn ,
178+ conn : & mut AsyncPgConnection ,
192179 version : & mut Version ,
193180 krate : & Crate ,
194181 auth : & Authentication ,
195182 yanked : Option < bool > ,
196183 yank_message : Option < String > ,
197184) -> AppResult < ( ) > {
198- use diesel :: RunQueryDsl ;
185+ use diesel_async :: RunQueryDsl ;
199186
200187 let api_token_id = auth. api_token_id ( ) ;
201188 let user = auth. user ( ) ;
202- let owners = krate. owners ( conn) ?;
189+ let owners = krate. async_owners ( conn) . await ?;
203190
204191 let yanked = yanked. unwrap_or ( version. yanked ) ;
205192
206- if Handle :: current ( ) . block_on ( user. rights ( state, & owners) ) ? < Rights :: Publish {
193+ if user. rights ( state, & owners) . await ? < Rights :: Publish {
207194 if user. is_admin {
208195 let action = if yanked { "yanking" } else { "unyanking" } ;
209196 warn ! (
@@ -230,7 +217,8 @@ pub fn perform_version_yank_update(
230217 versions:: yanked. eq ( yanked) ,
231218 versions:: yank_message. eq ( & yank_message) ,
232219 ) )
233- . execute ( conn) ?;
220+ . execute ( conn)
221+ . await ?;
234222
235223 // If no rows were updated, return early
236224 if updated_cnt == 0 {
@@ -252,11 +240,16 @@ pub fn perform_version_yank_update(
252240 . maybe_api_token_id ( api_token_id)
253241 . action ( action)
254242 . build ( )
255- . insert ( conn) ?;
243+ . async_insert ( conn)
244+ . await ?;
256245
257- SyncToGitIndex :: new ( & krate. name ) . enqueue ( conn) ?;
258- SyncToSparseIndex :: new ( & krate. name ) . enqueue ( conn) ?;
259- UpdateDefaultVersion :: new ( krate. id ) . enqueue ( conn) ?;
246+ SyncToGitIndex :: new ( & krate. name ) . async_enqueue ( conn) . await ?;
247+ SyncToSparseIndex :: new ( & krate. name )
248+ . async_enqueue ( conn)
249+ . await ?;
250+ UpdateDefaultVersion :: new ( krate. id )
251+ . async_enqueue ( conn)
252+ . await ?;
260253
261254 Ok ( ( ) )
262255}
0 commit comments