From b0089e59b748efb4face86a4d73cce180fa3e4cc Mon Sep 17 00:00:00 2001 From: Baptiste Gelez Date: Thu, 13 Dec 2018 22:20:19 +0100 Subject: [PATCH] Remove useless pagination routes (#351) Rocket 0.4 let us have routes with optional query parameter --- src/main.rs | 11 ------ src/routes/blogs.rs | 10 ++---- src/routes/comments.rs | 2 +- src/routes/instance.rs | 50 +++++++++------------------- src/routes/likes.rs | 2 +- src/routes/mod.rs | 22 ++++++++---- src/routes/notifications.rs | 14 +++----- src/routes/posts.rs | 22 +++++------- src/routes/reshares.rs | 2 +- src/routes/search.rs | 4 +-- src/routes/session.rs | 15 ++------- src/routes/tags.rs | 8 ++--- src/routes/user.rs | 10 ++---- templates/base.rs.html | 4 +-- templates/blogs/details.rs.html | 2 +- templates/instance/admin.rs.html | 4 +-- templates/instance/federated.rs.html | 10 +++--- templates/instance/feed.rs.html | 6 ++-- templates/instance/index.rs.html | 20 +++++------ templates/instance/list.rs.html | 4 +-- templates/instance/local.rs.html | 10 +++--- templates/instance/users.rs.html | 4 +-- templates/partials/post_card.rs.html | 8 +++-- templates/posts/details.rs.html | 10 +++--- templates/users/dashboard.rs.html | 2 +- templates/users/details.rs.html | 2 +- templates/users/followers.rs.html | 2 +- 27 files changed, 105 insertions(+), 155 deletions(-) diff --git a/src/main.rs b/src/main.rs index 78664cbd..61bdf20f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -79,7 +79,6 @@ fn main() { rocket::ignite() .mount("/", routes![ - routes::blogs::paginated_details, routes::blogs::details, routes::blogs::activity_details, routes::blogs::outbox, @@ -93,17 +92,12 @@ fn main() { routes::comments::activity_pub, routes::instance::index, - routes::instance::paginated_local, routes::instance::local, - routes::instance::paginated_feed, routes::instance::feed, - routes::instance::paginated_federated, routes::instance::federated, routes::instance::admin, routes::instance::admin_instances, - routes::instance::admin_instances_paginated, routes::instance::admin_users, - routes::instance::admin_users_paginated, routes::instance::ban, routes::instance::toggle_block, routes::instance::update_settings, @@ -122,12 +116,10 @@ fn main() { routes::medias::delete, routes::medias::set_avatar, - routes::notifications::paginated_notifications, routes::notifications::notifications, routes::notifications::notifications_auth, routes::posts::details, - routes::posts::details_response, routes::posts::activity_details, routes::posts::edit, routes::posts::update, @@ -142,20 +134,17 @@ fn main() { routes::search::search, routes::session::new, - routes::session::new_message, routes::session::create, routes::session::delete, routes::static_files, routes::tags::tag, - routes::tags::paginated_tag, routes::user::me, routes::user::details, routes::user::dashboard, routes::user::dashboard_auth, - routes::user::followers_paginated, routes::user::followers, routes::user::edit, routes::user::edit_auth, diff --git a/src/routes/blogs.rs b/src/routes/blogs.rs index 45790050..3cfab251 100644 --- a/src/routes/blogs.rs +++ b/src/routes/blogs.rs @@ -24,7 +24,8 @@ use template_utils::Ructe; use Searcher; #[get("/~/?", rank = 2)] -pub fn paginated_details(intl: I18n, name: String, conn: DbConn, user: Option, page: Page) -> Result { +pub fn details(intl: I18n, name: String, conn: DbConn, user: Option, page: Option) -> Result { + let page = page.unwrap_or_default(); let blog = Blog::find_by_fqn(&*conn, &name) .ok_or_else(|| render!(errors::not_found(&(&*conn, &intl.catalog, user.clone()))))?; let posts = Post::blog_page(&*conn, &blog, page.limits()); @@ -44,11 +45,6 @@ pub fn paginated_details(intl: I18n, name: String, conn: DbConn, user: Option", rank = 3)] -pub fn details(intl: I18n, name: String, conn: DbConn, user: Option) -> Result { - paginated_details(intl, name, conn, user, Page::first()) -} - #[get("/~/", rank = 1)] pub fn activity_details(name: String, conn: DbConn, _ap: ApRequest) -> Option> { let blog = Blog::find_local(&*conn, &name)?; @@ -118,7 +114,7 @@ pub fn create(conn: DbConn, form: LenientForm, user: User, intl: I1 is_owner: true }); - Ok(Redirect::to(uri!(details: name = slug.clone()))) + Ok(Redirect::to(uri!(details: name = slug.clone(), page = _))) } else { Err(render!(blogs::new( &(&*conn, &intl.catalog, Some(user)), diff --git a/src/routes/comments.rs b/src/routes/comments.rs index 880c06b2..534964b4 100644 --- a/src/routes/comments.rs +++ b/src/routes/comments.rs @@ -57,7 +57,7 @@ pub fn create(blog_name: String, slug: String, form: LenientForm let user_clone = user.clone(); worker.execute(move || broadcast(&user_clone, new_comment, dest)); - Redirect::to(uri!(super::posts::details: blog = blog_name, slug = slug)) + Redirect::to(uri!(super::posts::details: blog = blog_name, slug = slug, responding_to = _)) }) .map_err(|errors| { // TODO: de-duplicate this code diff --git a/src/routes/instance.rs b/src/routes/instance.rs index dd1250fc..76a19d46 100644 --- a/src/routes/instance.rs +++ b/src/routes/instance.rs @@ -25,13 +25,13 @@ use Searcher; pub fn index(conn: DbConn, user: Option, intl: I18n) -> Ructe { match Instance::get_local(&*conn) { Some(inst) => { - let federated = Post::get_recents_page(&*conn, Page::first().limits()); - let local = Post::get_instance_page(&*conn, inst.id, Page::first().limits()); + let federated = Post::get_recents_page(&*conn, Page::default().limits()); + let local = Post::get_instance_page(&*conn, inst.id, Page::default().limits()); let user_feed = user.clone().map(|user| { let followed = user.get_following(&*conn); let mut in_feed = followed.into_iter().map(|u| u.id).collect::>(); in_feed.push(user.id); - Post::user_feed_page(&*conn, in_feed, Page::first().limits()) + Post::user_feed_page(&*conn, in_feed, Page::default().limits()) }); render!(instance::index( @@ -53,7 +53,8 @@ pub fn index(conn: DbConn, user: Option, intl: I18n) -> Ructe { } #[get("/local?")] -pub fn paginated_local(conn: DbConn, user: Option, page: Page, intl: I18n) -> Ructe { +pub fn local(conn: DbConn, user: Option, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); let instance = Instance::get_local(&*conn).expect("instance::paginated_local: local instance not found error"); let articles = Post::get_instance_page(&*conn, instance.id, page.limits()); render!(instance::local( @@ -65,18 +66,9 @@ pub fn paginated_local(conn: DbConn, user: Option, page: Page, intl: I18n) )) } -#[get("/local")] -pub fn local(conn: DbConn, user: Option, intl: I18n) -> Ructe { - paginated_local(conn, user, Page::first(), intl) -} - -#[get("/feed")] -pub fn feed(conn: DbConn, user: User, intl: I18n) -> Ructe { - paginated_feed(conn, user, Page::first(), intl) -} - #[get("/feed?")] -pub fn paginated_feed(conn: DbConn, user: User, page: Page, intl: I18n) -> Ructe { +pub fn feed(conn: DbConn, user: User, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); let followed = user.get_following(&*conn); let mut in_feed = followed.into_iter().map(|u| u.id).collect::>(); in_feed.push(user.id); @@ -89,13 +81,9 @@ pub fn paginated_feed(conn: DbConn, user: User, page: Page, intl: I18n) -> Ructe )) } -#[get("/federated")] -pub fn federated(conn: DbConn, user: Option, intl: I18n) -> Ructe { - paginated_federated(conn, user, Page::first(), intl) -} - #[get("/federated?")] -pub fn paginated_federated(conn: DbConn, user: Option, page: Page, intl: I18n) -> Ructe { +pub fn federated(conn: DbConn, user: Option, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); let articles = Post::get_recents_page(&*conn, page.limits()); render!(instance::federated( &(&*conn, &intl.catalog, user), @@ -156,13 +144,9 @@ pub fn update_settings(conn: DbConn, admin: Admin, form: LenientForm Ructe { - admin_instances_paginated(admin, conn, Page::first(), intl) -} - #[get("/admin/instances?")] -pub fn admin_instances_paginated(admin: Admin, conn: DbConn, page: Page, intl: I18n) -> Ructe { +pub fn admin_instances(admin: Admin, conn: DbConn, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); let instances = Instance::page(&*conn, page.limits()); render!(instance::list( &(&*conn, &intl.catalog, Some(admin.0)), @@ -179,16 +163,12 @@ pub fn toggle_block(_admin: Admin, conn: DbConn, id: i32) -> Redirect { inst.toggle_block(&*conn); } - Redirect::to(uri!(admin_instances)) -} - -#[get("/admin/users")] -pub fn admin_users(admin: Admin, conn: DbConn, intl: I18n) -> Ructe { - admin_users_paginated(admin, conn, Page::first(), intl) + Redirect::to(uri!(admin_instances: page = _)) } #[get("/admin/users?")] -pub fn admin_users_paginated(admin: Admin, conn: DbConn, page: Page, intl: I18n) -> Ructe { +pub fn admin_users(admin: Admin, conn: DbConn, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); render!(instance::users( &(&*conn, &intl.catalog, Some(admin.0)), User::get_local_page(&*conn, page.limits()), @@ -202,7 +182,7 @@ pub fn ban(_admin: Admin, conn: DbConn, id: i32, searcher: Searcher) -> Redirect if let Some(u) = User::get(&*conn, id) { u.delete(&*conn, &searcher); } - Redirect::to(uri!(admin_users)) + Redirect::to(uri!(admin_users: page = _)) } #[post("/inbox", data = "")] diff --git a/src/routes/likes.rs b/src/routes/likes.rs index be08e645..9ad95c95 100644 --- a/src/routes/likes.rs +++ b/src/routes/likes.rs @@ -36,7 +36,7 @@ pub fn create(blog: String, slug: String, user: User, conn: DbConn, worker: Work worker.execute(move || broadcast(&user, delete_act, dest)); } - Some(Redirect::to(uri!(super::posts::details: blog = blog, slug = slug))) + Some(Redirect::to(uri!(super::posts::details: blog = blog, slug = slug, responding_to = _))) } #[post("/~///like", rank = 2)] diff --git a/src/routes/mod.rs b/src/routes/mod.rs index df283a93..5f5bdd90 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,6 +1,6 @@ use atom_syndication::{ContentBuilder, Entry, EntryBuilder, LinkBuilder, Person, PersonBuilder}; use rocket::{ - http::RawStr, + http::{RawStr, uri::{FromUriParam, Query}}, request::FromFormValue, response::NamedFile, }; @@ -10,7 +10,7 @@ use plume_models::{Connection, posts::Post}; const ITEMS_PER_PAGE: i32 = 12; -#[derive(Copy, Clone)] +#[derive(Copy, Clone, UriDisplayQuery)] pub struct Page(i32); impl<'v> FromFormValue<'v> for Page { @@ -23,11 +23,15 @@ impl<'v> FromFormValue<'v> for Page { } } -impl Page { - pub fn first() -> Page { - Page(1) - } +impl FromUriParam> for Page { + type Target = Page; + fn from_uri_param(val: Option) -> Page { + val.unwrap_or_default() + } +} + +impl Page { /// Computes the total number of pages needed to display n_items pub fn total(n_items: i32) -> i32 { if n_items % ITEMS_PER_PAGE == 0 { @@ -42,6 +46,12 @@ impl Page { } } +impl Default for Page { + fn default() -> Self { + Page(1) + } +} + pub fn post_to_atom(post: Post, conn: &Connection) -> Entry { EntryBuilder::default() .title(format!("", post.title)) diff --git a/src/routes/notifications.rs b/src/routes/notifications.rs index 1c75877f..6f8ba1d0 100644 --- a/src/routes/notifications.rs +++ b/src/routes/notifications.rs @@ -7,7 +7,8 @@ use routes::Page; use template_utils::Ructe; #[get("/notifications?")] -pub fn paginated_notifications(conn: DbConn, user: User, page: Page, intl: I18n) -> Ructe { +pub fn notifications(conn: DbConn, user: User, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); render!(notifications::index( &(&*conn, &intl.catalog, Some(user.clone())), Notification::page_for_user(&*conn, &user, page.limits()), @@ -16,15 +17,10 @@ pub fn paginated_notifications(conn: DbConn, user: User, page: Page, intl: I18n) )) } -#[get("/notifications")] -pub fn notifications(conn: DbConn, user: User, intl: I18n) -> Ructe { - paginated_notifications(conn, user, Page::first(), intl) -} - -#[get("/notifications", rank = 2)] -pub fn notifications_auth(i18n: I18n) -> Flash{ +#[get("/notifications?", rank = 2)] +pub fn notifications_auth(i18n: I18n, page: Option) -> Flash{ utils::requires_login( i18n!(i18n.catalog, "You need to be logged in order to see your notifications"), - uri!(notifications) + uri!(notifications: page = page) ) } diff --git a/src/routes/posts.rs b/src/routes/posts.rs index 5a585958..4e530768 100644 --- a/src/routes/posts.rs +++ b/src/routes/posts.rs @@ -26,14 +26,8 @@ use template_utils::Ructe; use Worker; use Searcher; -// See: https://github.com/SergioBenitez/Rocket/pull/454 -#[get("/~//", rank = 5)] -pub fn details(blog: String, slug: String, conn: DbConn, user: Option, intl: I18n) -> Result { - details_response(blog, slug, conn, user, None, intl) -} - #[get("/~//?", rank = 4)] -pub fn details_response(blog: String, slug: String, conn: DbConn, user: Option, responding_to: Option, intl: I18n) -> Result { +pub fn details(blog: String, slug: String, conn: DbConn, user: Option, responding_to: Option, intl: I18n) -> Result { let blog = Blog::find_by_fqn(&*conn, &blog).ok_or_else(|| render!(errors::not_found(&(&*conn, &intl.catalog, user.clone()))))?; let post = Post::find_by_slug(&*conn, &slug, blog.id).ok_or_else(|| render!(errors::not_found(&(&*conn, &intl.catalog, user.clone()))))?; if post.published || post.get_authors(&*conn).into_iter().any(|a| a.id == user.clone().map(|u| u.id).unwrap_or(0)) { @@ -205,7 +199,7 @@ pub fn update(blog: String, slug: String, user: User, conn: DbConn, form: Lenien if errors.is_empty() { if !user.is_author_in(&*conn, &b) { // actually it's not "Ok"… - Ok(Redirect::to(uri!(super::blogs::details: name = blog))) + Ok(Redirect::to(uri!(super::blogs::details: name = blog, page = _))) } else { let (content, mentions, hashtags) = utils::md_to_html(form.content.to_string().as_ref()); @@ -252,7 +246,7 @@ pub fn update(blog: String, slug: String, user: User, conn: DbConn, form: Lenien } } - Ok(Redirect::to(uri!(details: blog = blog, slug = new_slug))) + Ok(Redirect::to(uri!(details: blog = blog, slug = new_slug, responding_to = _))) } } else { let medias = Media::for_user(&*conn, user.id); @@ -313,7 +307,7 @@ pub fn create(blog_name: String, form: LenientForm, user: User, con if errors.is_empty() { if !user.is_author_in(&*conn, &blog) { // actually it's not "Ok"… - Ok(Redirect::to(uri!(super::blogs::details: name = blog_name))) + Ok(Redirect::to(uri!(super::blogs::details: name = blog_name, page = _))) } else { let (content, mentions, hashtags) = utils::md_to_html(form.content.to_string().as_ref()); @@ -367,7 +361,7 @@ pub fn create(blog_name: String, form: LenientForm, user: User, con worker.execute(move || broadcast(&user, act, dest)); } - Ok(Redirect::to(uri!(details: blog = blog_name, slug = slug))) + Ok(Redirect::to(uri!(details: blog = blog_name, slug = slug, responding_to = _))) } } else { let medias = Media::for_user(&*conn, user.id); @@ -391,15 +385,15 @@ pub fn delete(blog_name: String, slug: String, conn: DbConn, user: User, worker: if let Some(post) = post { if !post.get_authors(&*conn).into_iter().any(|a| a.id == user.id) { - Redirect::to(uri!(details: blog = blog_name.clone(), slug = slug.clone())) + Redirect::to(uri!(details: blog = blog_name.clone(), slug = slug.clone(), responding_to = _)) } else { let dest = User::one_by_instance(&*conn); let delete_activity = post.delete(&(&conn, &searcher)); worker.execute(move || broadcast(&user, delete_activity, dest)); - Redirect::to(uri!(super::blogs::details: name = blog_name)) + Redirect::to(uri!(super::blogs::details: name = blog_name, page = _)) } } else { - Redirect::to(uri!(super::blogs::details: name = blog_name)) + Redirect::to(uri!(super::blogs::details: name = blog_name, page = _)) } } diff --git a/src/routes/reshares.rs b/src/routes/reshares.rs index 86e6c75b..4ad5455d 100644 --- a/src/routes/reshares.rs +++ b/src/routes/reshares.rs @@ -37,7 +37,7 @@ pub fn create(blog: String, slug: String, user: User, conn: DbConn, worker: Work worker.execute(move || broadcast(&user, delete_act, dest)); } - Some(Redirect::to(uri!(super::posts::details: blog = blog, slug = slug))) + Some(Redirect::to(uri!(super::posts::details: blog = blog, slug = slug, responding_to = _))) } #[post("/~///reshare", rank=1)] diff --git a/src/routes/search.rs b/src/routes/search.rs index f0f1b280..e4ca036d 100644 --- a/src/routes/search.rs +++ b/src/routes/search.rs @@ -55,7 +55,7 @@ macro_rules! param_to_query { #[get("/search?")] pub fn search(query: Form, conn: DbConn, searcher: Searcher, user: Option, intl: I18n) -> Ructe { - let page = query.page.unwrap_or(Page::first()); + let page = query.page.unwrap_or_default(); let mut parsed_query = Query::from_str(&query.q.as_ref().map(|q| q.as_str()).unwrap_or_default()); param_to_query!(query, parsed_query; normal: title, subtitle, content, tag, @@ -71,7 +71,7 @@ pub fn search(query: Form, conn: DbConn, searcher: Searcher, user: )) } else { let res = searcher.search_document(&conn, parsed_query, page.limits()); - let next_page = if res.is_empty() { 0 } else { page.0+1 }; + let next_page = if res.is_empty() { 0 } else { page.0 + 1 }; render!(search::result( &(&*conn, &intl.catalog, user), &str_query, diff --git a/src/routes/session.rs b/src/routes/session.rs index d79b224b..86a7346f 100644 --- a/src/routes/session.rs +++ b/src/routes/session.rs @@ -14,27 +14,16 @@ use plume_models::{ users::{User, AUTH_COOKIE} }; -#[get("/login")] -pub fn new(user: Option, conn: DbConn, intl: I18n) -> Ructe { - render!(session::login( - &(&*conn, &intl.catalog, user), - None, - &LoginForm::default(), - ValidationErrors::default() - )) -} - #[get("/login?")] -pub fn new_message(user: Option, m: String, conn: DbConn, intl: I18n) -> Ructe { +pub fn new(user: Option, conn: DbConn, m: Option, intl: I18n) -> Ructe { render!(session::login( &(&*conn, &intl.catalog, user), - Some(m), + m, &LoginForm::default(), ValidationErrors::default() )) } - #[derive(Default, FromForm, Validate, Serialize)] pub struct LoginForm { #[validate(length(min = "1", message = "We need an email or a username to identify you"))] diff --git a/src/routes/tags.rs b/src/routes/tags.rs index fb0194eb..c3d8b31b 100644 --- a/src/routes/tags.rs +++ b/src/routes/tags.rs @@ -8,13 +8,9 @@ use plume_models::{ use routes::Page; use template_utils::Ructe; -#[get("/tag/")] -pub fn tag(user: Option, conn: DbConn, name: String, intl: I18n) -> Ructe { - paginated_tag(user, conn, name, Page::first(), intl) -} - #[get("/tag/?")] -pub fn paginated_tag(user: Option, conn: DbConn, name: String, page: Page, intl: I18n) -> Ructe { +pub fn tag(user: Option, conn: DbConn, name: String, page: Option, intl: I18n) -> Ructe { + let page = page.unwrap_or_default(); let posts = Post::list_by_tag(&*conn, name.clone(), page.limits()); render!(tags::index( &(&*conn, &intl.catalog, user), diff --git a/src/routes/user.rs b/src/routes/user.rs index ed028000..f10ceda9 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -165,7 +165,8 @@ pub fn follow_auth(name: String, i18n: I18n) -> Flash { } #[get("/@//followers?")] -pub fn followers_paginated(name: String, conn: DbConn, account: Option, page: Page, intl: I18n) -> Result { +pub fn followers(name: String, conn: DbConn, account: Option, page: Option, intl: I18n) -> Result { + let page = page.unwrap_or_default(); let user = User::find_by_fqn(&*conn, &name).ok_or_else(|| render!(errors::not_found(&(&*conn, &intl.catalog, account.clone()))))?; let followers_count = user.get_followers(&*conn).len(); // TODO: count in DB @@ -181,11 +182,6 @@ pub fn followers_paginated(name: String, conn: DbConn, account: Option, pa ))) } -#[get("/@//followers", rank = 2)] -pub fn followers(name: String, conn: DbConn, account: Option, intl: I18n) -> Result { - followers_paginated(name, conn, account, Page::first(), intl) -} - #[get("/@/", rank = 1)] pub fn activity_details( name: String, @@ -331,7 +327,7 @@ pub fn create(conn: DbConn, form: LenientForm, intl: I18n) -> Resul form.email.to_string(), User::hash_pass(&form.password), ).update_boxes(&*conn); - Redirect::to(uri!(super::session::new)) + Redirect::to(uri!(super::session::new: m = _)) }) .map_err(|err| { render!(users::new( diff --git a/templates/base.rs.html b/templates/base.rs.html index 43a4359b..9d1815fb 100644 --- a/templates/base.rs.html +++ b/templates/base.rs.html @@ -34,7 +34,7 @@ @i18n!(ctx.1, "Dashboard") - + @i18n!(ctx.1, "Notifications") @@ -47,7 +47,7 @@ @i18n!(ctx.1, "My account") } else { - + @i18n!(ctx.1, "Log In") diff --git a/templates/blogs/details.rs.html b/templates/blogs/details.rs.html index 4e31ab15..b4c11bab 100644 --- a/templates/blogs/details.rs.html +++ b/templates/blogs/details.rs.html @@ -8,7 +8,7 @@ @(ctx: BaseContext, blog: Blog, fqn: String, authors: &Vec, total_articles: usize, page: i32, n_pages: i32, is_author: bool, posts: Vec) @:base(ctx, blog.title.as_ref(), {}, { - @blog.title + @blog.title }, {