File tree 2 files changed +38
-16
lines changed 2 files changed +38
-16
lines changed Original file line number Diff line number Diff line change @@ -19,26 +19,24 @@ use tokio::runtime::Handle;
19
19
20
20
/// Handles the `GET /crates/:crate_id/owners` route.
21
21
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 ;
25
23
26
- let conn : & mut AsyncConnectionWrapper < _ > = & mut conn . into ( ) ;
24
+ let mut conn = state . db_read ( ) . await ? ;
27
25
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) ) ?;
32
31
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 > > ( ) ;
38
38
39
- Ok ( Json ( json ! ( { "users" : owners } ) ) )
40
- } )
41
- . await
39
+ Ok ( Json ( json ! ( { "users" : owners } ) ) )
42
40
}
43
41
44
42
/// Handles the `GET /crates/:crate_id/owner_team` route.
Original file line number Diff line number Diff line change @@ -355,6 +355,30 @@ impl Crate {
355
355
) )
356
356
}
357
357
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
+
358
382
pub fn owners ( & self , conn : & mut impl Conn ) -> QueryResult < Vec < Owner > > {
359
383
use diesel:: RunQueryDsl ;
360
384
You can’t perform that action at this time.
0 commit comments