@@ -5,7 +5,6 @@ use axum::response::Response;
55use axum:: Json ;
66use axum_extra:: json;
77use axum_extra:: response:: ErasedJson ;
8- use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
98use http:: request:: Parts ;
109use std:: collections:: HashMap ;
1110
@@ -15,7 +14,6 @@ use crate::controllers::helpers::{ok_true, Paginate};
1514use crate :: models:: krate:: CrateName ;
1615use crate :: models:: { CrateOwner , Follow , OwnerKind , User , Version , VersionOwnerAction } ;
1716use crate :: schema:: { crate_owners, crates, emails, follows, users, versions} ;
18- use crate :: tasks:: spawn_blocking;
1917use crate :: util:: errors:: { bad_request, AppResult } ;
2018use crate :: util:: BytesRequest ;
2119use crate :: views:: { EncodableMe , EncodablePrivateUser , EncodableVersion , OwnedCrate } ;
@@ -69,41 +67,39 @@ pub async fn me(app: AppState, req: Parts) -> AppResult<Json<EncodableMe>> {
6967pub async fn updates ( app : AppState , req : Parts ) -> AppResult < ErasedJson > {
7068 let mut conn = app. db_read_prefer_primary ( ) . await ?;
7169 let auth = AuthCheck :: only_cookie ( ) . check ( & req, & mut conn) . await ?;
72- spawn_blocking ( move || {
73- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
74-
75- let user = auth. user ( ) ;
76-
77- let followed_crates = Follow :: belonging_to ( user) . select ( follows:: crate_id) ;
78- let query = versions:: table
79- . inner_join ( crates:: table)
80- . left_outer_join ( users:: table)
81- . filter ( crates:: id. eq_any ( followed_crates) )
82- . order ( versions:: created_at. desc ( ) )
83- . select ( <( Version , CrateName , Option < User > ) >:: as_select ( ) )
84- . pages_pagination ( PaginationOptions :: builder ( ) . gather ( & req) ?) ;
85- let data: Paginated < ( Version , CrateName , Option < User > ) > = query. load ( conn) ?;
86- let more = data. next_page_params ( ) . is_some ( ) ;
87- let versions = data. iter ( ) . map ( |( v, ..) | v) . collect :: < Vec < _ > > ( ) ;
88- let actions = VersionOwnerAction :: for_versions ( conn, & versions) ?;
89- let data = data
90- . into_iter ( )
91- . zip ( actions)
92- . map ( |( ( v, cn, pb) , voas) | ( v, cn, pb, voas) ) ;
93-
94- let versions = data
95- . into_iter ( )
96- . map ( |( version, crate_name, published_by, actions) | {
97- EncodableVersion :: from ( version, & crate_name. name , published_by, actions)
98- } )
99- . collect :: < Vec < _ > > ( ) ;
100-
101- Ok ( json ! ( {
102- "versions" : versions,
103- "meta" : { "more" : more } ,
104- } ) )
105- } )
106- . await ?
70+
71+ let user = auth. user ( ) ;
72+
73+ let followed_crates = Follow :: belonging_to ( user) . select ( follows:: crate_id) ;
74+ let query = versions:: table
75+ . inner_join ( crates:: table)
76+ . left_outer_join ( users:: table)
77+ . filter ( crates:: id. eq_any ( followed_crates) )
78+ . order ( versions:: created_at. desc ( ) )
79+ . select ( <( Version , CrateName , Option < User > ) >:: as_select ( ) )
80+ . pages_pagination ( PaginationOptions :: builder ( ) . gather ( & req) ?) ;
81+
82+ let data: Paginated < ( Version , CrateName , Option < User > ) > = query. async_load ( & mut conn) . await ?;
83+
84+ let more = data. next_page_params ( ) . is_some ( ) ;
85+ let versions = data. iter ( ) . map ( |( v, ..) | v) . collect :: < Vec < _ > > ( ) ;
86+ let actions = VersionOwnerAction :: async_for_versions ( & mut conn, & versions) . await ?;
87+ let data = data
88+ . into_iter ( )
89+ . zip ( actions)
90+ . map ( |( ( v, cn, pb) , voas) | ( v, cn, pb, voas) ) ;
91+
92+ let versions = data
93+ . into_iter ( )
94+ . map ( |( version, crate_name, published_by, actions) | {
95+ EncodableVersion :: from ( version, & crate_name. name , published_by, actions)
96+ } )
97+ . collect :: < Vec < _ > > ( ) ;
98+
99+ Ok ( json ! ( {
100+ "versions" : versions,
101+ "meta" : { "more" : more } ,
102+ } ) )
107103}
108104
109105/// Handles the `PUT /confirm/:email_token` route
0 commit comments