Skip to content

Commit be018e8

Browse files
committed
controllers/krate/metadata: Extract load_default_versions_and_publishers() fn
1 parent 8048be0 commit be018e8

File tree

1 file changed

+54
-10
lines changed

1 file changed

+54
-10
lines changed

src/controllers/krate/metadata.rs

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)