Skip to content

Commit 523f3fe

Browse files
authored
Merge pull request #9901 from Turbo87/async-owners
models/krate: Add `async_owners()` fn
2 parents 0e6d1a4 + c480761 commit 523f3fe

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

src/controllers/krate/owners.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,24 @@ use tokio::runtime::Handle;
1919

2020
/// Handles the `GET /crates/:crate_id/owners` route.
2121
pub async fn owners(state: AppState, Path(crate_name): Path<String>) -> AppResult<Json<Value>> {
22-
let conn = state.db_read().await?;
23-
spawn_blocking(move || {
24-
use diesel::RunQueryDsl;
22+
use diesel_async::RunQueryDsl;
2523

26-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
24+
let mut conn = state.db_read().await?;
2725

28-
let krate: Crate = Crate::by_name(&crate_name)
29-
.first(conn)
30-
.optional()?
31-
.ok_or_else(|| crate_not_found(&crate_name))?;
26+
let krate: Crate = Crate::by_name(&crate_name)
27+
.first(&mut conn)
28+
.await
29+
.optional()?
30+
.ok_or_else(|| crate_not_found(&crate_name))?;
3231

33-
let owners = krate
34-
.owners(conn)?
35-
.into_iter()
36-
.map(Owner::into)
37-
.collect::<Vec<EncodableOwner>>();
32+
let owners = krate
33+
.async_owners(&mut conn)
34+
.await?
35+
.into_iter()
36+
.map(Owner::into)
37+
.collect::<Vec<EncodableOwner>>();
3838

39-
Ok(Json(json!({ "users": owners })))
40-
})
41-
.await
39+
Ok(Json(json!({ "users": owners })))
4240
}
4341

4442
/// Handles the `GET /crates/:crate_id/owner_team` route.

src/models/krate.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,30 @@ impl Crate {
355355
))
356356
}
357357

358+
pub async fn async_owners(&self, conn: &mut AsyncPgConnection) -> QueryResult<Vec<Owner>> {
359+
use diesel_async::RunQueryDsl;
360+
361+
let users = CrateOwner::by_owner_kind(OwnerKind::User)
362+
.filter(crate_owners::crate_id.eq(self.id))
363+
.inner_join(users::table)
364+
.select(User::as_select())
365+
.load(conn)
366+
.await?
367+
.into_iter()
368+
.map(Owner::User);
369+
370+
let teams = CrateOwner::by_owner_kind(OwnerKind::Team)
371+
.filter(crate_owners::crate_id.eq(self.id))
372+
.inner_join(teams::table)
373+
.select(Team::as_select())
374+
.load(conn)
375+
.await?
376+
.into_iter()
377+
.map(Owner::Team);
378+
379+
Ok(users.chain(teams).collect())
380+
}
381+
358382
pub fn owners(&self, conn: &mut impl Conn) -> QueryResult<Vec<Owner>> {
359383
use diesel::RunQueryDsl;
360384

0 commit comments

Comments
 (0)