@@ -12,6 +12,43 @@ use diesel_async::RunQueryDsl;
1212use http:: { StatusCode , request:: Parts } ;
1313use serde:: Serialize ;
1414
15+ #[ derive( Debug , Queryable , Selectable ) ]
16+ #[ diesel( check_for_backend( diesel:: pg:: Pg ) ) ]
17+ struct DatabaseCrateInfo {
18+ #[ diesel( select_expression = crates:: columns:: name) ]
19+ name : String ,
20+
21+ #[ diesel( select_expression = crates:: columns:: description) ]
22+ description : Option < String > ,
23+
24+ #[ diesel( select_expression = crates:: columns:: updated_at) ]
25+ updated_at : DateTime < Utc > ,
26+
27+ #[ diesel( select_expression = crate_downloads:: columns:: downloads. nullable( ) ) ]
28+ downloads : Option < i64 > ,
29+
30+ #[ diesel( select_expression = recent_crate_downloads:: columns:: downloads. nullable( ) ) ]
31+ recent_crate_downloads : Option < i64 > ,
32+
33+ #[ diesel( select_expression = default_versions:: columns:: num_versions) ]
34+ num_versions : Option < i32 > ,
35+
36+ #[ diesel( select_expression = versions:: columns:: yanked) ]
37+ yanked : bool ,
38+
39+ #[ diesel( select_expression = versions:: columns:: num) ]
40+ default_version_num : String ,
41+
42+ #[ diesel( select_expression = versions:: columns:: crate_size) ]
43+ crate_size : i32 ,
44+
45+ #[ diesel( select_expression = versions:: columns:: bin_names) ]
46+ bin_names : Option < Vec < Option < String > > > ,
47+
48+ #[ diesel( select_expression = rev_deps_subquery( ) ) ]
49+ num_rev_deps : i64 ,
50+ }
51+
1552/// Handles the `GET /api/private/admin_list/{username}` endpoint.
1653pub async fn list (
1754 state : AppState ,
@@ -41,19 +78,7 @@ pub async fn list(
4178 . first :: < ( User , Option < bool > , Option < String > ) > ( & mut conn)
4279 . await ?;
4380
44- let crates: Vec < (
45- String ,
46- Option < String > ,
47- DateTime < Utc > ,
48- Option < i64 > ,
49- Option < i64 > ,
50- Option < i32 > ,
51- bool ,
52- String ,
53- i32 ,
54- Option < Vec < Option < String > > > ,
55- i64 ,
56- ) > = CrateOwner :: by_owner_kind ( OwnerKind :: User )
81+ let crates: Vec < DatabaseCrateInfo > = CrateOwner :: by_owner_kind ( OwnerKind :: User )
5782 . inner_join ( crates:: table)
5883 . left_join ( crate_downloads:: table. on ( crates:: id. eq ( crate_downloads:: crate_id) ) )
5984 . left_join (
@@ -62,27 +87,15 @@ pub async fn list(
6287 . inner_join ( default_versions:: table. on ( crates:: id. eq ( default_versions:: crate_id) ) )
6388 . inner_join ( versions:: table. on ( default_versions:: version_id. eq ( versions:: id) ) )
6489 . filter ( crate_owners:: owner_id. eq ( user. id ) )
65- . select ( (
66- crates:: name,
67- crates:: description,
68- crates:: updated_at,
69- crate_downloads:: downloads. nullable ( ) ,
70- recent_crate_downloads:: downloads. nullable ( ) ,
71- default_versions:: num_versions,
72- versions:: yanked,
73- versions:: num,
74- versions:: crate_size,
75- versions:: bin_names,
76- rev_deps_subquery ( ) ,
77- ) )
90+ . select ( DatabaseCrateInfo :: as_select ( ) )
7891 . order ( crates:: name. asc ( ) )
7992 . load ( & mut conn)
8093 . await ?;
8194
8295 let crates = crates
8396 . into_iter ( )
84- . map (
85- | (
97+ . map ( |database_crate_info| {
98+ let DatabaseCrateInfo {
8699 name,
87100 description,
88101 updated_at,
@@ -94,22 +107,22 @@ pub async fn list(
94107 crate_size,
95108 bin_names,
96109 num_rev_deps,
97- ) | {
98- AdminCrateInfo {
99- name ,
100- description ,
101- updated_at ,
102- downloads : downloads . unwrap_or_default ( )
103- + recent_crate_downloads . unwrap_or_default ( ) ,
104- num_rev_deps ,
105- num_versions : num_versions . unwrap_or_default ( ) as usize ,
106- yanked ,
107- default_version_num ,
108- crate_size ,
109- bin_names ,
110- }
111- } ,
112- )
110+ } = database_crate_info ;
111+
112+ AdminCrateInfo {
113+ name ,
114+ description ,
115+ updated_at ,
116+ downloads : downloads . unwrap_or_default ( )
117+ + recent_crate_downloads . unwrap_or_default ( ) ,
118+ num_rev_deps ,
119+ num_versions : num_versions . unwrap_or_default ( ) as usize ,
120+ yanked ,
121+ default_version_num ,
122+ crate_size ,
123+ bin_names ,
124+ }
125+ } )
113126 . collect ( ) ;
114127 Ok ( Json ( AdminListResponse {
115128 user_email,
0 commit comments