diff --git a/src/web/releases.rs b/src/web/releases.rs index f5c798cfe..2404d40bd 100644 --- a/src/web/releases.rs +++ b/src/web/releases.rs @@ -114,61 +114,6 @@ pub(crate) fn get_releases( .collect() } -fn get_releases_by_owner( - conn: &mut Client, - page: i64, - limit: i64, - owner: &str, -) -> (String, Vec) { - let offset = (page - 1) * limit; - - let query = "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - builds.build_time, - releases.rustdoc_status, - repositories.stars, - owners.name, - owners.login - FROM crates - INNER JOIN releases ON releases.id = crates.latest_version_id - INNER JOIN builds ON releases.id = builds.rid - INNER JOIN owner_rels ON owner_rels.cid = crates.id - INNER JOIN owners ON owners.id = owner_rels.oid - LEFT JOIN repositories ON releases.repository_id = repositories.id - WHERE owners.login = $1 - ORDER BY repositories.stars DESC NULLS LAST - LIMIT $2 OFFSET $3"; - let query = conn.query(query, &[&owner, &limit, &offset]).unwrap(); - - let mut owner_name = None; - let packages = query - .into_iter() - .map(|row| { - if owner_name.is_none() { - owner_name = Some(if !row.get::(7).is_empty() { - row.get(7) - } else { - row.get(8) - }); - } - - Release { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - build_time: row.get(4), - rustdoc_status: row.get(5), - stars: row.get::<_, Option>(6).unwrap_or(0), - } - }) - .collect(); - - (owner_name.unwrap_or_default(), packages) -} - struct SearchResult { pub results: Vec, pub executed_query: Option, @@ -355,7 +300,6 @@ pub(super) enum ReleaseType { Stars, RecentFailures, Failures, - Owner, Search, } @@ -379,9 +323,9 @@ fn releases_handler(req: &mut Request, release_type: ReleaseType) -> IronResult< true, ), - ReleaseType::Owner | ReleaseType::Search => panic!( - "The owners and search page have special requirements and cannot use this handler", - ), + ReleaseType::Search => { + panic!("The search page has special requirements and cannot use this handler",) + } }; let releases = { @@ -431,45 +375,14 @@ pub fn releases_failures_by_stars_handler(req: &mut Request) -> IronResult IronResult { let router = extension!(req, Router); - // page number of releases - let page_number: i64 = router - .find("page") - .and_then(|page_num| page_num.parse().ok()) - .unwrap_or(1); - let owner_route_value = router.find("owner").unwrap(); - - let (owner_name, releases) = { - let mut conn = extension!(req, Pool).get()?; - - // We need to keep the owner_route_value unchanged, as we may render paginated links in the page. - // Changing the owner_route_value directly will cause the link to change, for example: @foobar -> foobar. - let mut owner = owner_route_value; - if owner.starts_with('@') { - owner = &owner[1..]; - } - get_releases_by_owner(&mut conn, page_number, RELEASES_IN_RELEASES, owner) - }; - - if releases.is_empty() { - return Err(Nope::OwnerNotFound.into()); + let mut owner = router.find("owner").unwrap(); + if owner.starts_with('@') { + owner = &owner[1..]; } - - // Show next and previous page buttons - let (show_next_page, show_previous_page) = ( - releases.len() == RELEASES_IN_RELEASES as usize, - page_number != 1, - ); - - ViewReleases { - releases, - description: format!("Crates from {}", owner_name), - release_type: ReleaseType::Owner, - show_next_page, - show_previous_page, - page_number, - owner: Some(owner_route_value.into()), + match format!("https://crates.io/users/{}", owner).parse() { + Ok(url) => Ok(super::redirect(url)), + Err(_) => Err(Nope::OwnerNotFound.into()), } - .into_response(req) } #[derive(Debug, Clone, PartialEq, Serialize)] @@ -783,7 +696,9 @@ pub fn build_queue_handler(req: &mut Request) -> IronResult { mod tests { use super::*; use crate::index::api::CrateOwner; - use crate::test::{assert_redirect, assert_success, wrapper, TestFrontend}; + use crate::test::{ + assert_redirect, assert_redirect_unchecked, assert_success, wrapper, TestFrontend, + }; use anyhow::Error; use chrono::{Duration, TimeZone}; use kuchiki::traits::TendrilSink; @@ -1457,83 +1372,6 @@ mod tests { }); } - #[test] - fn nonexistent_owner_page() { - wrapper(|env| { - env.fake_release() - .name("some_random_crate") - .add_owner(CrateOwner { - login: "foobar".into(), - avatar: "https://example.org/foobar".into(), - name: "Foo Bar".into(), - email: "foobar@example.org".into(), - }) - .create()?; - let page = kuchiki::parse_html().one( - env.frontend() - .get("/releases/random-author") - .send()? - .text()?, - ); - - assert_eq!(page.select("#crate-title").unwrap().count(), 1); - assert_eq!( - page.select("#crate-title") - .unwrap() - .next() - .unwrap() - .text_contents(), - "The requested owner does not exist", - ); - - Ok(()) - }); - } - - #[test] - fn owners_page() { - wrapper(|env| { - let web = env.frontend(); - env.fake_release() - .name("some_random_crate") - .add_owner(CrateOwner { - login: "foobar".into(), - avatar: "https://example.org/foobar".into(), - name: "Foo Bar".into(), - email: "foobar@example.org".into(), - }) - .create()?; - // Request an owner without @ sign. - assert_success("/releases/foobar", web)?; - // Request an owner with @ sign. - assert_success("/releases/@foobar", web) - }) - } - - #[test] - fn owners_pagination() { - wrapper(|env| { - let web = env.frontend(); - for i in 0..RELEASES_IN_RELEASES { - env.fake_release() - .name(&format!("some_random_crate_{}", i)) - .add_owner(CrateOwner { - login: "foobar".into(), - avatar: "https://example.org/foobar".into(), - name: "Foo Bar".into(), - email: "foobar@example.org".into(), - }) - .create()?; - } - let page = kuchiki::parse_html().one(web.get("/releases/@foobar").send()?.text()?); - let button = page.select_first("a[href='/releases/@foobar/2']"); - - assert!(button.is_ok()); - - Ok(()) - }) - } - #[test] fn home_page_links() { wrapper(|env| { @@ -1636,4 +1474,14 @@ mod tests { Ok(()) }); } + + #[test] + fn check_owner_releases_redirect() { + wrapper(|env| { + let web = env.frontend(); + + assert_redirect_unchecked("/releases/someone", "https://crates.io/users/someone", web)?; + Ok(()) + }); + } } diff --git a/templates/crate/details.html b/templates/crate/details.html index 8b76655bc..9fb08caa9 100644 --- a/templates/crate/details.html +++ b/templates/crate/details.html @@ -127,7 +127,7 @@
  • Owners
  • {%- for owner in details.owners -%} - + {{ owner[0] }} {%- endfor -%} diff --git a/templates/releases/releases.html b/templates/releases/releases.html index 9ce743a83..c83c3bd9f 100644 --- a/templates/releases/releases.html +++ b/templates/releases/releases.html @@ -58,20 +58,14 @@
  • - + {{ "user" | fas(fw=true) }} {{ owner[0] }}