66
77use axum:: extract:: Path ;
88use axum:: Json ;
9+ use crates_io_database:: schema:: { crates, dependencies} ;
910use crates_io_worker:: BackgroundJob ;
10- use diesel:: {
11- BoolExpressionMethods , ExpressionMethods , PgExpressionMethods , QueryDsl , RunQueryDsl ,
12- } ;
1311use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
1412use http:: request:: Parts ;
1513use http:: StatusCode ;
@@ -21,11 +19,13 @@ use crate::app::AppState;
2119use crate :: auth:: AuthCheck ;
2220use crate :: models:: token:: EndpointScope ;
2321use crate :: models:: {
24- insert_version_owner_action, Crate , Rights , Version , VersionAction , VersionOwnerAction ,
22+ insert_version_owner_action, Crate , Dependency , Rights , Version , VersionAction ,
23+ VersionOwnerAction ,
2524} ;
2625use crate :: rate_limiter:: LimitedAction ;
2726use crate :: schema:: versions;
2827use crate :: tasks:: spawn_blocking;
28+ use crate :: util:: diesel:: prelude:: * ;
2929use crate :: util:: diesel:: Conn ;
3030use crate :: util:: errors:: { bad_request, custom, version_not_found, AppResult } ;
3131use crate :: views:: { EncodableDependency , EncodableVersion } ;
@@ -54,24 +54,26 @@ pub async fn dependencies(
5454 state : AppState ,
5555 Path ( ( crate_name, version) ) : Path < ( String , String ) > ,
5656) -> AppResult < Json < Value > > {
57+ use diesel_async:: RunQueryDsl ;
58+
5759 if semver:: Version :: parse ( & version) . is_err ( ) {
5860 return Err ( version_not_found ( & crate_name, & version) ) ;
5961 }
6062
6163 let mut conn = state. db_read ( ) . await ?;
6264 let ( version, _) = version_and_crate ( & mut conn, & crate_name, & version) . await ?;
63- spawn_blocking ( move || {
64- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
6565
66- let deps = version. dependencies ( conn) ?;
67- let deps = deps
68- . into_iter ( )
69- . map ( |( dep, crate_name) | EncodableDependency :: from_dep ( dep, & crate_name) )
70- . collect :: < Vec < _ > > ( ) ;
71-
72- Ok ( Json ( json ! ( { "dependencies" : deps } ) ) )
73- } )
74- . await
66+ let deps = Dependency :: belonging_to ( & version)
67+ . inner_join ( crates:: table)
68+ . select ( ( Dependency :: as_select ( ) , crates:: name) )
69+ . order ( ( dependencies:: optional, crates:: name) )
70+ . load :: < ( Dependency , String ) > ( & mut conn)
71+ . await ?
72+ . into_iter ( )
73+ . map ( |( dep, crate_name) | EncodableDependency :: from_dep ( dep, & crate_name) )
74+ . collect :: < Vec < _ > > ( ) ;
75+
76+ Ok ( Json ( json ! ( { "dependencies" : deps } ) ) )
7577}
7678
7779/// Handles the `GET /crates/:crate_id/:version/authors` route.
@@ -173,6 +175,8 @@ pub fn perform_version_yank_update(
173175 yanked : Option < bool > ,
174176 yank_message : Option < String > ,
175177) -> AppResult < ( ) > {
178+ use diesel:: RunQueryDsl ;
179+
176180 let auth = AuthCheck :: default ( )
177181 . with_endpoint_scope ( EndpointScope :: Yank )
178182 . for_crate ( & krate. name )
0 commit comments