Skip to content

Commit 1c11a63

Browse files
committed
controllers/summary: Extract popular_keywords and encode_crates()
1 parent c5973bb commit 1c11a63

File tree

1 file changed

+57
-52
lines changed

1 file changed

+57
-52
lines changed

src/controllers/summary.rs

Lines changed: 57 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ use crate::models::{Category, Crate, CrateVersions, Keyword, TopVersions, Versio
33
use crate::schema::{
44
crate_downloads, crates, default_versions, keywords, metadata, recent_crate_downloads, versions,
55
};
6-
use crate::tasks::spawn_blocking;
7-
use crate::util::diesel::Conn;
86
use crate::util::errors::AppResult;
97
use crate::views::{EncodableCategory, EncodableCrate, EncodableKeyword};
108
use axum::Json;
119
use diesel::QueryResult;
12-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
1310
use diesel_async::AsyncPgConnection;
1411
use serde_json::Value;
1512

@@ -26,7 +23,15 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
2623
async fn inner(
2724
conn: &mut AsyncPgConnection,
2825
config: &crate::config::Server,
29-
) -> QueryResult<(i64, i64, Vec<Record>, Vec<Record>, Vec<Record>, Vec<Record>)> {
26+
) -> QueryResult<(
27+
i64,
28+
i64,
29+
Vec<Record>,
30+
Vec<Record>,
31+
Vec<Record>,
32+
Vec<Record>,
33+
Vec<EncodableKeyword>,
34+
)> {
3035
use diesel::{
3136
ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl, SelectableHelper,
3237
};
@@ -102,13 +107,23 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
102107
.load(conn)
103108
.await?;
104109

110+
let popular_keywords = keywords::table
111+
.order(keywords::crates_cnt.desc())
112+
.limit(10)
113+
.load(conn)
114+
.await?
115+
.into_iter()
116+
.map(Keyword::into)
117+
.collect::<Vec<EncodableKeyword>>();
118+
105119
Ok((
106120
num_crates,
107121
num_downloads,
108122
new_crates,
109123
just_updated,
110124
most_downloaded,
111125
most_recently_downloaded,
126+
popular_keywords,
112127
))
113128
}
114129

@@ -120,59 +135,49 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
120135
just_updated,
121136
most_downloaded,
122137
most_recently_downloaded,
138+
popular_keywords,
123139
) = inner(&mut conn, config).await?;
124140

125-
spawn_blocking(move || {
126-
use diesel::prelude::*;
127-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
128-
129-
fn encode_crates(
130-
conn: &mut impl Conn,
131-
data: Vec<Record>,
132-
) -> AppResult<Vec<EncodableCrate>> {
133-
let krates = data.iter().map(|(c, ..)| c).collect::<Vec<_>>();
134-
let versions: Vec<Version> = krates.versions().load(conn)?;
135-
versions
136-
.grouped_by(&krates)
137-
.into_iter()
138-
.map(TopVersions::from_versions)
139-
.zip(data)
140-
.map(
141-
|(top_versions, (krate, total, recent, default_version, yanked))| {
142-
Ok(EncodableCrate::from_minimal(
143-
krate,
144-
default_version.as_deref(),
145-
yanked,
146-
Some(&top_versions),
147-
false,
148-
total,
149-
recent,
150-
))
151-
},
152-
)
153-
.collect()
154-
}
141+
async fn encode_crates(
142+
conn: &mut AsyncPgConnection,
143+
data: Vec<Record>,
144+
) -> AppResult<Vec<EncodableCrate>> {
145+
use diesel::GroupedBy;
146+
use diesel_async::RunQueryDsl;
155147

156-
let popular_keywords = keywords::table
157-
.order(keywords::crates_cnt.desc())
158-
.limit(10)
159-
.load(conn)?
148+
let krates = data.iter().map(|(c, ..)| c).collect::<Vec<_>>();
149+
let versions: Vec<Version> = krates.versions().load(conn).await?;
150+
versions
151+
.grouped_by(&krates)
160152
.into_iter()
161-
.map(Keyword::into)
162-
.collect::<Vec<EncodableKeyword>>();
153+
.map(TopVersions::from_versions)
154+
.zip(data)
155+
.map(
156+
|(top_versions, (krate, total, recent, default_version, yanked))| {
157+
Ok(EncodableCrate::from_minimal(
158+
krate,
159+
default_version.as_deref(),
160+
yanked,
161+
Some(&top_versions),
162+
false,
163+
total,
164+
recent,
165+
))
166+
},
167+
)
168+
.collect()
169+
}
163170

164-
Ok(Json(json!({
165-
"num_downloads": num_downloads,
166-
"num_crates": num_crates,
167-
"new_crates": encode_crates(conn, new_crates)?,
168-
"most_downloaded": encode_crates(conn, most_downloaded)?,
169-
"most_recently_downloaded": encode_crates(conn, most_recently_downloaded)?,
170-
"just_updated": encode_crates(conn, just_updated)?,
171-
"popular_keywords": popular_keywords,
172-
"popular_categories": popular_categories,
173-
})))
174-
})
175-
.await
171+
Ok(Json(json!({
172+
"num_downloads": num_downloads,
173+
"num_crates": num_crates,
174+
"new_crates": encode_crates(&mut conn, new_crates).await?,
175+
"most_downloaded": encode_crates(&mut conn, most_downloaded).await?,
176+
"most_recently_downloaded": encode_crates(&mut conn, most_recently_downloaded).await?,
177+
"just_updated": encode_crates(&mut conn, just_updated).await?,
178+
"popular_keywords": popular_keywords,
179+
"popular_categories": popular_categories,
180+
})))
176181
}
177182

178183
type Record = (Crate, i64, Option<i64>, Option<String>, Option<bool>);

0 commit comments

Comments
 (0)