Skip to content

Commit f08ba7c

Browse files
committed
Extract a type to describe the select expression that's gotten complicated
1 parent be65713 commit f08ba7c

File tree

1 file changed

+57
-44
lines changed

1 file changed

+57
-44
lines changed

src/controllers/admin.rs

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,43 @@ use diesel_async::RunQueryDsl;
1212
use http::{StatusCode, request::Parts};
1313
use 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.
1653
pub 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

Comments
 (0)