Skip to content

Commit 28ead19

Browse files
committed
Break out include modes into specific categories
1 parent b9c7fff commit 28ead19

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

src/controllers/krate/metadata.rs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
122122
let conn = req.db_read_only()?;
123123
let krate: Crate = Crate::by_name(name).first(&*conn)?;
124124

125-
let versions_publishers_and_audit_actions = if include.full {
125+
let versions_publishers_and_audit_actions = if include.versions {
126126
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
127127
.all_versions()
128128
.left_outer_join(users::table)
@@ -150,7 +150,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
150150
.as_ref()
151151
.map(|vps| vps.iter().map(|v| v.0.id).collect());
152152

153-
let kws = if include.full {
153+
let kws = if include.keywords {
154154
Some(
155155
CrateKeyword::belonging_to(&krate)
156156
.inner_join(keywords::table)
@@ -160,7 +160,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
160160
} else {
161161
None
162162
};
163-
let cats = if include.full {
163+
let cats = if include.categories {
164164
Some(
165165
CrateCategory::belonging_to(&krate)
166166
.inner_join(categories::table)
@@ -170,7 +170,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
170170
} else {
171171
None
172172
};
173-
let recent_downloads = if include.full {
173+
let recent_downloads = if include.downloads {
174174
RecentCrateDownloads::belonging_to(&krate)
175175
.select(recent_crate_downloads::downloads)
176176
.get_result(&*conn)
@@ -179,7 +179,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
179179
None
180180
};
181181

182-
let badges = if include.full {
182+
let badges = if include.badges {
183183
Some(
184184
badges::table
185185
.filter(badges::crate_id.eq(krate.id))
@@ -188,7 +188,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
188188
} else {
189189
None
190190
};
191-
let top_versions = if include.full {
191+
let top_versions = if include.versions {
192192
Some(krate.top_versions(&conn)?)
193193
} else {
194194
None
@@ -229,27 +229,63 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
229229

230230
#[derive(Debug)]
231231
struct ShowIncludeMode {
232-
full: bool,
232+
versions: bool,
233+
keywords: bool,
234+
categories: bool,
235+
badges: bool,
236+
downloads: bool,
233237
}
234238

235239
impl Default for ShowIncludeMode {
236240
fn default() -> Self {
237241
// Send everything for legacy clients that expect the full response
238-
Self { full: true }
242+
Self {
243+
versions: true,
244+
keywords: true,
245+
categories: true,
246+
badges: true,
247+
downloads: true,
248+
}
239249
}
240250
}
241251

252+
impl ShowIncludeMode {
253+
const INVALID_COMPONENT: &'static str =
254+
"invalid component for ?mode= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', or 'full')";
255+
}
256+
242257
impl FromStr for ShowIncludeMode {
243258
type Err = Box<dyn AppError>;
244259

245260
fn from_str(s: &str) -> Result<Self, Self::Err> {
246-
match s {
247-
"" => Ok(ShowIncludeMode { full: false }),
248-
"full" => Ok(ShowIncludeMode { full: true }),
249-
_ => Err(bad_request(
250-
"invalid value for ?mode= (expected '' or 'full')",
251-
)),
261+
let mut mode = Self {
262+
versions: false,
263+
keywords: false,
264+
categories: false,
265+
badges: false,
266+
downloads: false,
267+
};
268+
for component in s.split(',') {
269+
match component {
270+
"" => {}
271+
"full" => {
272+
mode = Self {
273+
versions: true,
274+
keywords: true,
275+
categories: true,
276+
badges: true,
277+
downloads: true,
278+
}
279+
}
280+
"versions" => mode.versions = true,
281+
"keywords" => mode.keywords = true,
282+
"categories" => mode.categories = true,
283+
"badges" => mode.badges = true,
284+
"downloads" => mode.downloads = true,
285+
_ => return Err(bad_request(Self::INVALID_COMPONENT)),
286+
}
252287
}
288+
Ok(mode)
253289
}
254290
}
255291

0 commit comments

Comments
 (0)