@@ -12,6 +12,43 @@ use diesel_async::RunQueryDsl;
12
12
use http:: { StatusCode , request:: Parts } ;
13
13
use serde:: Serialize ;
14
14
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
+
15
52
/// Handles the `GET /api/private/admin_list/{username}` endpoint.
16
53
pub async fn list (
17
54
state : AppState ,
@@ -41,19 +78,7 @@ pub async fn list(
41
78
. first :: < ( User , Option < bool > , Option < String > ) > ( & mut conn)
42
79
. await ?;
43
80
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 )
57
82
. inner_join ( crates:: table)
58
83
. left_join ( crate_downloads:: table. on ( crates:: id. eq ( crate_downloads:: crate_id) ) )
59
84
. left_join (
@@ -62,27 +87,15 @@ pub async fn list(
62
87
. inner_join ( default_versions:: table. on ( crates:: id. eq ( default_versions:: crate_id) ) )
63
88
. inner_join ( versions:: table. on ( default_versions:: version_id. eq ( versions:: id) ) )
64
89
. 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 ( ) )
78
91
. order ( crates:: name. asc ( ) )
79
92
. load ( & mut conn)
80
93
. await ?;
81
94
82
95
let crates = crates
83
96
. into_iter ( )
84
- . map (
85
- | (
97
+ . map ( |database_crate_info| {
98
+ let DatabaseCrateInfo {
86
99
name,
87
100
description,
88
101
updated_at,
@@ -94,22 +107,22 @@ pub async fn list(
94
107
crate_size,
95
108
bin_names,
96
109
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
+ } )
113
126
. collect ( ) ;
114
127
Ok ( Json ( AdminListResponse {
115
128
user_email,
0 commit comments