Skip to content

Commit 7e2892e

Browse files
committed
controllers/krate/metadata: Migrate reverse dependencies endpoint to diesel-async
1 parent e4d2ead commit 7e2892e

File tree

2 files changed

+49
-44
lines changed

2 files changed

+49
-44
lines changed

src/controllers/krate/metadata.rs

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -249,51 +249,55 @@ pub async fn reverse_dependencies(
249249
Path(name): Path<String>,
250250
req: Parts,
251251
) -> AppResult<Json<Value>> {
252-
let conn = app.db_read().await?;
253-
spawn_blocking(move || {
254-
use diesel::RunQueryDsl;
252+
use diesel_async::RunQueryDsl;
255253

256-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
254+
let mut conn = app.db_read().await?;
257255

258-
let pagination_options = PaginationOptions::builder().gather(&req)?;
256+
let pagination_options = PaginationOptions::builder().gather(&req)?;
259257

260-
let krate: Crate = Crate::by_name(&name)
261-
.first(conn)
262-
.optional()?
263-
.ok_or_else(|| crate_not_found(&name))?;
258+
let krate: Crate = Crate::by_name(&name)
259+
.first(&mut conn)
260+
.await
261+
.optional()?
262+
.ok_or_else(|| crate_not_found(&name))?;
264263

265-
let (rev_deps, total) = krate.reverse_dependencies(conn, pagination_options)?;
266-
let rev_deps: Vec<_> = rev_deps
267-
.into_iter()
268-
.map(|dep| EncodableDependency::from_reverse_dep(dep, &krate.name))
269-
.collect();
264+
let (rev_deps, total) = krate
265+
.reverse_dependencies(&mut conn, pagination_options)
266+
.await?;
270267

271-
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
268+
let rev_deps: Vec<_> = rev_deps
269+
.into_iter()
270+
.map(|dep| EncodableDependency::from_reverse_dep(dep, &krate.name))
271+
.collect();
272272

273-
let versions_and_publishers: Vec<(Version, CrateName, Option<User>)> = versions::table
274-
.filter(versions::id.eq_any(version_ids))
275-
.inner_join(crates::table)
276-
.left_outer_join(users::table)
277-
.select(<(Version, CrateName, Option<User>)>::as_select())
278-
.load(conn)?;
279-
let versions = versions_and_publishers
280-
.iter()
281-
.map(|(v, ..)| v)
282-
.collect::<Vec<_>>();
283-
let actions = VersionOwnerAction::for_versions(conn, &versions)?;
284-
let versions = versions_and_publishers
285-
.into_iter()
286-
.zip(actions)
287-
.map(|((version, krate_name, published_by), actions)| {
288-
EncodableVersion::from(version, &krate_name.name, published_by, actions)
289-
})
290-
.collect::<Vec<_>>();
273+
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
291274

292-
Ok(Json(json!({
293-
"dependencies": rev_deps,
294-
"versions": versions,
295-
"meta": { "total": total },
296-
})))
297-
})
298-
.await
275+
let versions_and_publishers: Vec<(Version, CrateName, Option<User>)> = versions::table
276+
.filter(versions::id.eq_any(version_ids))
277+
.inner_join(crates::table)
278+
.left_outer_join(users::table)
279+
.select(<(Version, CrateName, Option<User>)>::as_select())
280+
.load(&mut conn)
281+
.await?;
282+
283+
let versions = versions_and_publishers
284+
.iter()
285+
.map(|(v, ..)| v)
286+
.collect::<Vec<_>>();
287+
288+
let actions = VersionOwnerAction::async_for_versions(&mut conn, &versions).await?;
289+
290+
let versions = versions_and_publishers
291+
.into_iter()
292+
.zip(actions)
293+
.map(|((version, krate_name, published_by), actions)| {
294+
EncodableVersion::from(version, &krate_name.name, published_by, actions)
295+
})
296+
.collect::<Vec<_>>();
297+
298+
Ok(Json(json!({
299+
"dependencies": rev_deps,
300+
"versions": versions,
301+
"meta": { "total": total },
302+
})))
299303
}

src/models/krate.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,22 +464,23 @@ impl Crate {
464464

465465
/// Returns (dependency, dependent crate name, dependent crate downloads)
466466
#[instrument(skip_all, fields(krate.name = %self.name))]
467-
pub(crate) fn reverse_dependencies(
467+
pub(crate) async fn reverse_dependencies(
468468
&self,
469-
conn: &mut impl Conn,
469+
conn: &mut AsyncPgConnection,
470470
options: PaginationOptions,
471471
) -> QueryResult<(Vec<ReverseDependency>, i64)> {
472472
use diesel::sql_query;
473473
use diesel::sql_types::{BigInt, Integer};
474-
use diesel::RunQueryDsl;
474+
use diesel_async::RunQueryDsl;
475475

476476
let offset = options.offset().unwrap_or_default();
477477
let rows: Vec<WithCount<ReverseDependency>> =
478478
sql_query(include_str!("krate_reverse_dependencies.sql"))
479479
.bind::<Integer, _>(self.id)
480480
.bind::<BigInt, _>(offset)
481481
.bind::<BigInt, _>(options.per_page)
482-
.load(conn)?;
482+
.load(conn)
483+
.await?;
483484

484485
Ok(rows.records_and_total())
485486
}

0 commit comments

Comments
 (0)