From e9c38782c78e306e1e15ea8887923e79293b264d Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Mon, 15 Jan 2024 11:53:42 +0100 Subject: [PATCH] Remove deprecated `/api/v1/versions` endpoints --- src/controllers/version.rs | 1 - src/controllers/version/deprecated.rs | 75 ------------------- src/router.rs | 6 -- src/tests/builders/version.rs | 1 + src/tests/routes/mod.rs | 1 - src/tests/routes/versions/list.rs | 36 --------- src/tests/routes/versions/mod.rs | 2 - src/tests/routes/versions/read.rs | 26 ------- .../all__routes__versions__list__index-2.snap | 66 ---------------- .../all__routes__versions__list__index.snap | 7 -- ...l__routes__versions__read__show_by_id.snap | 35 --------- 11 files changed, 1 insertion(+), 255 deletions(-) delete mode 100644 src/controllers/version/deprecated.rs delete mode 100644 src/tests/routes/versions/list.rs delete mode 100644 src/tests/routes/versions/mod.rs delete mode 100644 src/tests/routes/versions/read.rs delete mode 100644 src/tests/routes/versions/snapshots/all__routes__versions__list__index-2.snap delete mode 100644 src/tests/routes/versions/snapshots/all__routes__versions__list__index.snap delete mode 100644 src/tests/routes/versions/snapshots/all__routes__versions__read__show_by_id.snap diff --git a/src/controllers/version.rs b/src/controllers/version.rs index d114641765e..097bfd95ae1 100644 --- a/src/controllers/version.rs +++ b/src/controllers/version.rs @@ -1,4 +1,3 @@ -pub mod deprecated; pub mod downloads; pub mod metadata; pub mod yank; diff --git a/src/controllers/version/deprecated.rs b/src/controllers/version/deprecated.rs deleted file mode 100644 index 9edc73d122d..00000000000 --- a/src/controllers/version/deprecated.rs +++ /dev/null @@ -1,75 +0,0 @@ -//! Deprecated api endpoints -//! -//! There are no known uses of these endpoints. There is currently no plan for -//! removing these endpoints. At a minimum, logs should be reviewed over a -//! period of time to ensure there are no external users of an endpoint before -//! it is removed. - -use crate::controllers::frontend_prelude::*; - -use crate::models::{Crate, User, Version, VersionOwnerAction}; -use crate::schema::*; -use crate::views::EncodableVersion; - -/// Handles the `GET /versions` route. -pub async fn index(app: AppState, req: Parts) -> AppResult> { - spawn_blocking(move || { - let conn = &mut *app.db_read()?; - - // Extract all ids requested. - let query = url::form_urlencoded::parse(req.uri.query().unwrap_or("").as_bytes()); - let ids = query - .filter_map(|(ref a, ref b)| if *a == "ids[]" { b.parse().ok() } else { None }) - .collect::>(); - - let versions_and_publishers: Vec<(Version, String, Option)> = versions::table - .inner_join(crates::table) - .left_outer_join(users::table) - .select(( - versions::all_columns, - crates::name, - users::all_columns.nullable(), - )) - .filter(versions::id.eq_any(ids)) - .load(conn)?; - let versions = versions_and_publishers - .iter() - .map(|(v, _, _)| v) - .cloned() - .collect::>(); - let versions = versions_and_publishers - .into_iter() - .zip(VersionOwnerAction::for_versions(conn, &versions)?) - .map(|((version, crate_name, published_by), actions)| { - EncodableVersion::from(version, &crate_name, published_by, actions) - }) - .collect::>(); - - Ok(Json(json!({ "versions": versions }))) - }) - .await -} - -/// Handles the `GET /versions/:version_id` route. -/// The frontend doesn't appear to hit this endpoint. Instead, the version information appears to -/// be returned by `krate::show`. -pub async fn show_by_id(state: AppState, Path(id): Path) -> AppResult> { - spawn_blocking(move || { - let conn = &mut *state.db_read()?; - let (version, krate, published_by): (Version, Crate, Option) = versions::table - .find(id) - .inner_join(crates::table) - .left_outer_join(users::table) - .select(( - versions::all_columns, - Crate::as_select(), - users::all_columns.nullable(), - )) - .first(conn)?; - let audit_actions = VersionOwnerAction::by_version(conn, &version)?; - - let version = EncodableVersion::from(version, &krate.name, published_by, audit_actions); - Ok(Json(json!({ "version": version }))) - }) - .await -} diff --git a/src/router.rs b/src/router.rs index d44fc60699c..fe3cc073227 100644 --- a/src/router.rs +++ b/src/router.rs @@ -40,12 +40,6 @@ pub fn build_axum_router(state: AppState) -> Router<()> { "/api/v1/crates/:crate_id/:version/download", get(version::downloads::download), ) - // Routes that appear to be unused - .route("/api/v1/versions", get(version::deprecated::index)) - .route( - "/api/v1/versions/:version_id", - get(version::deprecated::show_by_id), - ) // Routes used by the frontend .route("/api/v1/crates/:crate_id", get(krate::metadata::show)) .route( diff --git a/src/tests/builders/version.rs b/src/tests/builders/version.rs index 9a11b57bca2..ead4d75628b 100644 --- a/src/tests/builders/version.rs +++ b/src/tests/builders/version.rs @@ -22,6 +22,7 @@ pub struct VersionBuilder<'a> { rust_version: Option, } +#[allow(dead_code)] impl<'a> VersionBuilder<'a> { /// Creates a VersionBuilder from a string slice `num` representing the version's number. /// diff --git a/src/tests/routes/mod.rs b/src/tests/routes/mod.rs index 49163c72174..80ccc87f413 100644 --- a/src/tests/routes/mod.rs +++ b/src/tests/routes/mod.rs @@ -20,4 +20,3 @@ pub mod metrics; pub mod session; pub mod summary; pub mod users; -pub mod versions; diff --git a/src/tests/routes/versions/list.rs b/src/tests/routes/versions/list.rs deleted file mode 100644 index 9ebde1c0433..00000000000 --- a/src/tests/routes/versions/list.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::builders::{CrateBuilder, VersionBuilder}; -use crate::util::insta::{self, assert_json_snapshot}; -use crate::util::{RequestHelper, TestApp}; -use crates_io::schema::versions; -use diesel::{QueryDsl, RunQueryDsl}; -use serde_json::Value; - -#[test] -fn index() { - let (app, anon, user) = TestApp::init().with_user(); - let user = user.as_model(); - - let url = "/api/v1/versions"; - - let json: Value = anon.get(url).good(); - assert_json_snapshot!(json); - - let (v1, v2) = app.db(|conn| { - CrateBuilder::new("foo_vers_index", user.id) - .version(VersionBuilder::new("2.0.0").license(Some("MIT"))) - .version(VersionBuilder::new("2.0.1").license(Some("MIT/Apache-2.0"))) - .expect_build(conn); - let ids: Vec = versions::table.select(versions::id).load(conn).unwrap(); - (ids[0], ids[1]) - }); - - let query = format!("ids[]={v1}&ids[]={v2}"); - let json: Value = anon.get_with_query(url, &query).good(); - assert_json_snapshot!(json, { - ".versions" => insta::sorted_redaction(), - ".versions[].id" => insta::any_id_redaction(), - ".versions[].created_at" => "[datetime]", - ".versions[].updated_at" => "[datetime]", - ".versions[].published_by.id" => insta::id_redaction(user.id), - }); -} diff --git a/src/tests/routes/versions/mod.rs b/src/tests/routes/versions/mod.rs deleted file mode 100644 index fb0099e9a7c..00000000000 --- a/src/tests/routes/versions/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod list; -pub mod read; diff --git a/src/tests/routes/versions/read.rs b/src/tests/routes/versions/read.rs deleted file mode 100644 index 7ce64920317..00000000000 --- a/src/tests/routes/versions/read.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::builders::{CrateBuilder, VersionBuilder}; -use crate::util::insta::{self, assert_json_snapshot}; -use crate::util::{RequestHelper, TestApp}; -use serde_json::Value; - -#[test] -fn show_by_id() { - let (app, anon, user) = TestApp::init().with_user(); - let user = user.as_model(); - - let v = app.db(|conn| { - let krate = CrateBuilder::new("foo_vers_show_id", user.id).expect_build(conn); - VersionBuilder::new("2.0.0") - .size(1234) - .expect_build(krate.id, user.id, conn) - }); - - let url = format!("/api/v1/versions/{}", v.id); - let json: Value = anon.get(&url).good(); - assert_json_snapshot!(json, { - ".version.id" => insta::id_redaction(v.id), - ".version.created_at" => "[datetime]", - ".version.updated_at" => "[datetime]", - ".version.published_by.id" => insta::id_redaction(user.id), - }); -} diff --git a/src/tests/routes/versions/snapshots/all__routes__versions__list__index-2.snap b/src/tests/routes/versions/snapshots/all__routes__versions__list__index-2.snap deleted file mode 100644 index 2ef4bff79ea..00000000000 --- a/src/tests/routes/versions/snapshots/all__routes__versions__list__index-2.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: src/tests/routes/versions/list.rs -expression: json ---- -{ - "versions": [ - { - "audit_actions": [], - "checksum": " ", - "crate": "foo_vers_index", - "crate_size": 0, - "created_at": "[datetime]", - "dl_path": "/api/v1/crates/foo_vers_index/2.0.0/download", - "downloads": 0, - "features": {}, - "id": "[id]", - "license": "MIT", - "links": { - "authors": "/api/v1/crates/foo_vers_index/2.0.0/authors", - "dependencies": "/api/v1/crates/foo_vers_index/2.0.0/dependencies", - "version_downloads": "/api/v1/crates/foo_vers_index/2.0.0/downloads" - }, - "num": "2.0.0", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo_vers_index/2.0.0/readme", - "rust_version": null, - "updated_at": "[datetime]", - "yanked": false - }, - { - "audit_actions": [], - "checksum": " ", - "crate": "foo_vers_index", - "crate_size": 0, - "created_at": "[datetime]", - "dl_path": "/api/v1/crates/foo_vers_index/2.0.1/download", - "downloads": 0, - "features": {}, - "id": "[id]", - "license": "MIT/Apache-2.0", - "links": { - "authors": "/api/v1/crates/foo_vers_index/2.0.1/authors", - "dependencies": "/api/v1/crates/foo_vers_index/2.0.1/dependencies", - "version_downloads": "/api/v1/crates/foo_vers_index/2.0.1/downloads" - }, - "num": "2.0.1", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo_vers_index/2.0.1/readme", - "rust_version": null, - "updated_at": "[datetime]", - "yanked": false - } - ] -} diff --git a/src/tests/routes/versions/snapshots/all__routes__versions__list__index.snap b/src/tests/routes/versions/snapshots/all__routes__versions__list__index.snap deleted file mode 100644 index 274bbabd186..00000000000 --- a/src/tests/routes/versions/snapshots/all__routes__versions__list__index.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: src/tests/routes/versions/list.rs -expression: json ---- -{ - "versions": [] -} diff --git a/src/tests/routes/versions/snapshots/all__routes__versions__read__show_by_id.snap b/src/tests/routes/versions/snapshots/all__routes__versions__read__show_by_id.snap deleted file mode 100644 index c1124fddfa5..00000000000 --- a/src/tests/routes/versions/snapshots/all__routes__versions__read__show_by_id.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: src/tests/routes/versions/read.rs -expression: json ---- -{ - "version": { - "audit_actions": [], - "checksum": " ", - "crate": "foo_vers_show_id", - "crate_size": 1234, - "created_at": "[datetime]", - "dl_path": "/api/v1/crates/foo_vers_show_id/2.0.0/download", - "downloads": 0, - "features": {}, - "id": "[id]", - "license": null, - "links": { - "authors": "/api/v1/crates/foo_vers_show_id/2.0.0/authors", - "dependencies": "/api/v1/crates/foo_vers_show_id/2.0.0/dependencies", - "version_downloads": "/api/v1/crates/foo_vers_show_id/2.0.0/downloads" - }, - "num": "2.0.0", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo_vers_show_id/2.0.0/readme", - "rust_version": null, - "updated_at": "[datetime]", - "yanked": false - } -}