diff --git a/src/controllers/krate/owners.rs b/src/controllers/krate/owners.rs index 179643a81e3..5fcbfb105d0 100644 --- a/src/controllers/krate/owners.rs +++ b/src/controllers/krate/owners.rs @@ -19,26 +19,24 @@ use tokio::runtime::Handle; /// Handles the `GET /crates/:crate_id/owners` route. pub async fn owners(state: AppState, Path(crate_name): Path) -> AppResult> { - let conn = state.db_read().await?; - spawn_blocking(move || { - use diesel::RunQueryDsl; + use diesel_async::RunQueryDsl; - let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into(); + let mut conn = state.db_read().await?; - let krate: Crate = Crate::by_name(&crate_name) - .first(conn) - .optional()? - .ok_or_else(|| crate_not_found(&crate_name))?; + let krate: Crate = Crate::by_name(&crate_name) + .first(&mut conn) + .await + .optional()? + .ok_or_else(|| crate_not_found(&crate_name))?; - let owners = krate - .owners(conn)? - .into_iter() - .map(Owner::into) - .collect::>(); + let owners = krate + .async_owners(&mut conn) + .await? + .into_iter() + .map(Owner::into) + .collect::>(); - Ok(Json(json!({ "users": owners }))) - }) - .await + Ok(Json(json!({ "users": owners }))) } /// Handles the `GET /crates/:crate_id/owner_team` route. diff --git a/src/models/krate.rs b/src/models/krate.rs index 27a98728ee3..794b0da643f 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -355,6 +355,30 @@ impl Crate { )) } + pub async fn async_owners(&self, conn: &mut AsyncPgConnection) -> QueryResult> { + use diesel_async::RunQueryDsl; + + let users = CrateOwner::by_owner_kind(OwnerKind::User) + .filter(crate_owners::crate_id.eq(self.id)) + .inner_join(users::table) + .select(User::as_select()) + .load(conn) + .await? + .into_iter() + .map(Owner::User); + + let teams = CrateOwner::by_owner_kind(OwnerKind::Team) + .filter(crate_owners::crate_id.eq(self.id)) + .inner_join(teams::table) + .select(Team::as_select()) + .load(conn) + .await? + .into_iter() + .map(Owner::Team); + + Ok(users.chain(teams).collect()) + } + pub fn owners(&self, conn: &mut impl Conn) -> QueryResult> { use diesel::RunQueryDsl;