Skip to content

Commit 1364c27

Browse files
committed
Move several version routes to version::deprecated::*
1 parent c156edb commit 1364c27

File tree

3 files changed

+84
-61
lines changed

3 files changed

+84
-61
lines changed

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,12 @@ pub fn middleware(app: Arc<App>) -> MiddlewareBuilder {
153153
);
154154

155155
// Routes that appear to be unused
156-
api_router.get("/versions", C(version::index));
157-
api_router.get("/versions/:version_id", C(version::show));
156+
api_router.get("/versions", C(version::deprecated::index));
157+
api_router.get("/versions/:version_id", C(version::deprecated::show));
158158

159159
// Routes used by the frontend
160160
api_router.get("/crates/:crate_id", C(krate::metadata::show));
161-
api_router.get("/crates/:crate_id/:version", C(version::show));
161+
api_router.get("/crates/:crate_id/:version", C(version::deprecated::show));
162162
api_router.get(
163163
"/crates/:crate_id/:version/readme",
164164
C(krate::metadata::readme),

src/version/deprecated.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//! Deprecated api endpoints
2+
//!
3+
//! There are no known uses of these endpoints. There is currently no plan for
4+
//! removing these endpoints. At a minimum, logs should be reviewed over a
5+
//! period of time to ensure there are no external users of an endpoint before
6+
//! it is removed.
7+
8+
use conduit_router::RequestParams;
9+
use conduit::{Request, Response};
10+
use diesel::prelude::*;
11+
use url;
12+
13+
use db::RequestTransaction;
14+
use schema::*;
15+
use util::{CargoResult, RequestUtils};
16+
17+
use super::{version_and_crate, EncodableVersion, Version};
18+
19+
/// Handles the `GET /versions` route.
20+
pub fn index(req: &mut Request) -> CargoResult<Response> {
21+
use diesel::expression::dsl::any;
22+
let conn = req.db_conn()?;
23+
24+
// Extract all ids requested.
25+
let query = url::form_urlencoded::parse(req.query_string().unwrap_or("").as_bytes());
26+
let ids = query
27+
.filter_map(|(ref a, ref b)| if *a == "ids[]" {
28+
b.parse().ok()
29+
} else {
30+
None
31+
})
32+
.collect::<Vec<i32>>();
33+
34+
let versions = versions::table
35+
.inner_join(crates::table)
36+
.select((versions::all_columns, crates::name))
37+
.filter(versions::id.eq(any(ids)))
38+
.load::<(Version, String)>(&*conn)?
39+
.into_iter()
40+
.map(|(version, crate_name)| version.encodable(&crate_name))
41+
.collect();
42+
43+
#[derive(Serialize)]
44+
struct R {
45+
versions: Vec<EncodableVersion>,
46+
}
47+
Ok(req.json(&R { versions: versions }))
48+
}
49+
50+
/// Handles the `GET /versions/:version_id` and
51+
/// `GET /crates/:crate_id/:version` routes.
52+
///
53+
/// The frontend doesn't appear to hit either of these endpoints. Instead the
54+
/// version information appears to be returned by `krate::show`.
55+
///
56+
/// FIXME: These two routes have very different semantics and should be split into
57+
/// a separate function for each endpoint.
58+
pub fn show(req: &mut Request) -> CargoResult<Response> {
59+
let (version, krate) = match req.params().find("crate_id") {
60+
Some(..) => version_and_crate(req)?,
61+
None => {
62+
let id = &req.params()["version_id"];
63+
let id = id.parse().unwrap_or(0);
64+
let conn = req.db_conn()?;
65+
versions::table
66+
.find(id)
67+
.inner_join(crates::table)
68+
.select((versions::all_columns, ::krate::ALL_COLUMNS))
69+
.first(&*conn)?
70+
}
71+
};
72+
73+
#[derive(Serialize)]
74+
struct R {
75+
version: EncodableVersion,
76+
}
77+
Ok(req.json(&R {
78+
version: version.encodable(&krate.name),
79+
}))
80+
}

src/version/mod.rs

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use diesel::pg::Pg;
88
use diesel::prelude::*;
99
use semver;
1010
use serde_json;
11-
use url;
1211

1312
use Crate;
1413
use app::RequestApp;
@@ -22,6 +21,7 @@ use util::errors::CargoError;
2221
use util::{human, CargoResult, RequestUtils};
2322
use license_exprs;
2423

24+
pub mod deprecated;
2525
pub mod downloads;
2626

2727
// Queryable has a custom implementation below
@@ -259,63 +259,6 @@ impl Queryable<versions::SqlType, Pg> for Version {
259259
}
260260
}
261261

262-
/// Handles the `GET /versions` route.
263-
// FIXME: where/how is this used?
264-
pub fn index(req: &mut Request) -> CargoResult<Response> {
265-
use diesel::expression::dsl::any;
266-
let conn = req.db_conn()?;
267-
268-
// Extract all ids requested.
269-
let query = url::form_urlencoded::parse(req.query_string().unwrap_or("").as_bytes());
270-
let ids = query
271-
.filter_map(|(ref a, ref b)| if *a == "ids[]" {
272-
b.parse().ok()
273-
} else {
274-
None
275-
})
276-
.collect::<Vec<i32>>();
277-
278-
let versions = versions::table
279-
.inner_join(crates::table)
280-
.select((versions::all_columns, crates::name))
281-
.filter(versions::id.eq(any(ids)))
282-
.load::<(Version, String)>(&*conn)?
283-
.into_iter()
284-
.map(|(version, crate_name)| version.encodable(&crate_name))
285-
.collect();
286-
287-
#[derive(Serialize)]
288-
struct R {
289-
versions: Vec<EncodableVersion>,
290-
}
291-
Ok(req.json(&R { versions: versions }))
292-
}
293-
294-
/// Handles the `GET /versions/:version_id` route.
295-
pub fn show(req: &mut Request) -> CargoResult<Response> {
296-
let (version, krate) = match req.params().find("crate_id") {
297-
Some(..) => version_and_crate(req)?,
298-
None => {
299-
let id = &req.params()["version_id"];
300-
let id = id.parse().unwrap_or(0);
301-
let conn = req.db_conn()?;
302-
versions::table
303-
.find(id)
304-
.inner_join(crates::table)
305-
.select((versions::all_columns, ::krate::ALL_COLUMNS))
306-
.first(&*conn)?
307-
}
308-
};
309-
310-
#[derive(Serialize)]
311-
struct R {
312-
version: EncodableVersion,
313-
}
314-
Ok(req.json(&R {
315-
version: version.encodable(&krate.name),
316-
}))
317-
}
318-
319262
fn version_and_crate(req: &mut Request) -> CargoResult<(Version, Crate)> {
320263
let crate_name = &req.params()["crate_id"];
321264
let semver = &req.params()["version"];

0 commit comments

Comments
 (0)