@@ -3,13 +3,10 @@ use crate::models::{Category, Crate, CrateVersions, Keyword, TopVersions, Versio
33use crate :: schema:: {
44 crate_downloads, crates, default_versions, keywords, metadata, recent_crate_downloads, versions,
55} ;
6- use crate :: tasks:: spawn_blocking;
7- use crate :: util:: diesel:: Conn ;
86use crate :: util:: errors:: AppResult ;
97use crate :: views:: { EncodableCategory , EncodableCrate , EncodableKeyword } ;
108use axum:: Json ;
119use diesel:: QueryResult ;
12- use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
1310use diesel_async:: AsyncPgConnection ;
1411use serde_json:: Value ;
1512
@@ -26,7 +23,15 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
2623 async fn inner (
2724 conn : & mut AsyncPgConnection ,
2825 config : & crate :: config:: Server ,
29- ) -> QueryResult < ( i64 , i64 , Vec < Record > , Vec < Record > , Vec < Record > , Vec < Record > ) > {
26+ ) -> QueryResult < (
27+ i64 ,
28+ i64 ,
29+ Vec < Record > ,
30+ Vec < Record > ,
31+ Vec < Record > ,
32+ Vec < Record > ,
33+ Vec < EncodableKeyword > ,
34+ ) > {
3035 use diesel:: {
3136 ExpressionMethods , JoinOnDsl , NullableExpressionMethods , QueryDsl , SelectableHelper ,
3237 } ;
@@ -102,13 +107,23 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
102107 . load ( conn)
103108 . await ?;
104109
110+ let popular_keywords = keywords:: table
111+ . order ( keywords:: crates_cnt. desc ( ) )
112+ . limit ( 10 )
113+ . load ( conn)
114+ . await ?
115+ . into_iter ( )
116+ . map ( Keyword :: into)
117+ . collect :: < Vec < EncodableKeyword > > ( ) ;
118+
105119 Ok ( (
106120 num_crates,
107121 num_downloads,
108122 new_crates,
109123 just_updated,
110124 most_downloaded,
111125 most_recently_downloaded,
126+ popular_keywords,
112127 ) )
113128 }
114129
@@ -120,59 +135,49 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
120135 just_updated,
121136 most_downloaded,
122137 most_recently_downloaded,
138+ popular_keywords,
123139 ) = inner ( & mut conn, config) . await ?;
124140
125- spawn_blocking ( move || {
126- use diesel:: prelude:: * ;
127- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
128-
129- fn encode_crates (
130- conn : & mut impl Conn ,
131- data : Vec < Record > ,
132- ) -> AppResult < Vec < EncodableCrate > > {
133- let krates = data. iter ( ) . map ( |( c, ..) | c) . collect :: < Vec < _ > > ( ) ;
134- let versions: Vec < Version > = krates. versions ( ) . load ( conn) ?;
135- versions
136- . grouped_by ( & krates)
137- . into_iter ( )
138- . map ( TopVersions :: from_versions)
139- . zip ( data)
140- . map (
141- |( top_versions, ( krate, total, recent, default_version, yanked) ) | {
142- Ok ( EncodableCrate :: from_minimal (
143- krate,
144- default_version. as_deref ( ) ,
145- yanked,
146- Some ( & top_versions) ,
147- false ,
148- total,
149- recent,
150- ) )
151- } ,
152- )
153- . collect ( )
154- }
141+ async fn encode_crates (
142+ conn : & mut AsyncPgConnection ,
143+ data : Vec < Record > ,
144+ ) -> AppResult < Vec < EncodableCrate > > {
145+ use diesel:: GroupedBy ;
146+ use diesel_async:: RunQueryDsl ;
155147
156- let popular_keywords = keywords :: table
157- . order ( keywords :: crates_cnt . desc ( ) )
158- . limit ( 10 )
159- . load ( conn ) ?
148+ let krates = data . iter ( ) . map ( | ( c , .. ) | c ) . collect :: < Vec < _ > > ( ) ;
149+ let versions : Vec < Version > = krates . versions ( ) . load ( conn ) . await ? ;
150+ versions
151+ . grouped_by ( & krates )
160152 . into_iter ( )
161- . map ( Keyword :: into)
162- . collect :: < Vec < EncodableKeyword > > ( ) ;
153+ . map ( TopVersions :: from_versions)
154+ . zip ( data)
155+ . map (
156+ |( top_versions, ( krate, total, recent, default_version, yanked) ) | {
157+ Ok ( EncodableCrate :: from_minimal (
158+ krate,
159+ default_version. as_deref ( ) ,
160+ yanked,
161+ Some ( & top_versions) ,
162+ false ,
163+ total,
164+ recent,
165+ ) )
166+ } ,
167+ )
168+ . collect ( )
169+ }
163170
164- Ok ( Json ( json ! ( {
165- "num_downloads" : num_downloads,
166- "num_crates" : num_crates,
167- "new_crates" : encode_crates( conn, new_crates) ?,
168- "most_downloaded" : encode_crates( conn, most_downloaded) ?,
169- "most_recently_downloaded" : encode_crates( conn, most_recently_downloaded) ?,
170- "just_updated" : encode_crates( conn, just_updated) ?,
171- "popular_keywords" : popular_keywords,
172- "popular_categories" : popular_categories,
173- } ) ) )
174- } )
175- . await
171+ Ok ( Json ( json ! ( {
172+ "num_downloads" : num_downloads,
173+ "num_crates" : num_crates,
174+ "new_crates" : encode_crates( & mut conn, new_crates) . await ?,
175+ "most_downloaded" : encode_crates( & mut conn, most_downloaded) . await ?,
176+ "most_recently_downloaded" : encode_crates( & mut conn, most_recently_downloaded) . await ?,
177+ "just_updated" : encode_crates( & mut conn, just_updated) . await ?,
178+ "popular_keywords" : popular_keywords,
179+ "popular_categories" : popular_categories,
180+ } ) ) )
176181}
177182
178183type Record = ( Crate , i64 , Option < i64 > , Option < String > , Option < bool > ) ;
0 commit comments