@@ -128,14 +128,22 @@ pub async fn find_crate(
128128 . as_ref ( )
129129 . filter ( |_| include. default_version && !include. versions )
130130 {
131- let version = krate. find_version ( & mut conn, default_version) . await ?;
132- let version = version. ok_or_else ( || version_not_found ( & krate. name , default_version) ) ?;
133-
134- let ( actions, published_by) = tokio:: try_join!(
135- VersionOwnerAction :: by_version( & mut conn, & version) ,
136- version. published_by( & mut conn) ,
137- ) ?;
138- versions_publishers_and_audit_actions = Some ( vec ! [ ( version, published_by, actions) ] ) ;
131+ let versions_and_publishers =
132+ load_default_versions_and_publishers ( & mut conn, & krate, Some ( default_version) , true )
133+ . await ?
134+ . expect ( "default_version should exists" ) ;
135+ let versions = versions_and_publishers
136+ . iter ( )
137+ . map ( |( v, _) | v)
138+ . collect :: < Vec < _ > > ( ) ;
139+ let actions = VersionOwnerAction :: for_versions ( & mut conn, & versions) . await ?;
140+ versions_publishers_and_audit_actions = Some (
141+ versions_and_publishers
142+ . into_iter ( )
143+ . zip ( actions)
144+ . map ( |( ( v, pb) , aas) | ( v, pb, aas) )
145+ . collect :: < Vec < _ > > ( ) ,
146+ )
139147 } ;
140148
141149 let kws = if include. keywords {
@@ -235,12 +243,48 @@ fn load_versions_and_publishers<'a>(
235243 return always_ready ( || Ok ( None ) ) . boxed ( ) ;
236244 }
237245
238- let fut = Version :: belonging_to ( & krate)
246+ _load_versions_and_publishers ( conn, krate, None )
247+ }
248+
249+ fn load_default_versions_and_publishers < ' a > (
250+ conn : & mut AsyncPgConnection ,
251+ krate : & ' a Crate ,
252+ version_num : Option < & ' a str > ,
253+ includes : bool ,
254+ ) -> BoxFuture < ' a , AppResult < Option < Vec < VersionsAndPublishers > > > > {
255+ if !includes || version_num. is_none ( ) {
256+ return always_ready ( || Ok ( None ) ) . boxed ( ) ;
257+ }
258+
259+ let fut = _load_versions_and_publishers ( conn, krate, version_num) ;
260+ async move {
261+ let records = fut. await ?. ok_or_else ( || {
262+ version_not_found (
263+ & krate. name ,
264+ version_num. expect ( "default_version should not be None" ) ,
265+ )
266+ } ) ?;
267+ Ok ( Some ( records) )
268+ }
269+ . boxed ( )
270+ }
271+
272+ fn _load_versions_and_publishers < ' a > (
273+ conn : & mut AsyncPgConnection ,
274+ krate : & ' a Crate ,
275+ version_num : Option < & ' a str > ,
276+ ) -> BoxFuture < ' a , AppResult < Option < Vec < VersionsAndPublishers > > > > {
277+ let mut query = Version :: belonging_to ( & krate)
239278 . left_outer_join ( users:: table)
240279 . select ( <( Version , Option < User > ) >:: as_select ( ) )
241280 . order_by ( versions:: id. desc ( ) )
242- . load ( conn) ;
281+ . into_boxed ( ) ;
282+
283+ if let Some ( num) = version_num {
284+ query = query. filter ( versions:: num. eq ( num) ) ;
285+ }
243286
287+ let fut = query. load ( conn) ;
244288 async move { Ok ( Some ( fut. await ?) ) } . boxed ( )
245289}
246290
0 commit comments