From bf14f554ee2003a1485bfb2d7b59f2f56e3e56d1 Mon Sep 17 00:00:00 2001 From: Leonora Tindall Date: Tue, 1 Nov 2022 14:11:19 -0500 Subject: [PATCH] Don't pagniate, just fetch everything --- README.md | 2 ++ src/main.rs | 33 ++++++++++++++++++++++++--------- src/syndication.rs | 17 +++-------------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 3b595d7..baaea59 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,10 @@ ports to use for development and deployment. - [ ] Handle redirects - [x] RSS feeds for projects - [x] Index page explaining what's going on +- [ ] More robust parsing (defaults for all!) - [ ] RSS feeds for tags - [x] Atom Extension pagination support +- [x] Disable pagination and just go for it lmao - [ ] Read More support - [ ] Dublin Core support - [ ] Media Envelope support diff --git a/src/main.rs b/src/main.rs index f5aacd0..11b18a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,6 +61,26 @@ enum ErrorResponse { InternalError(String), } +async fn get_full_post_data( + client: &mut Client, + project_id: &str, +) -> Result { + let mut page = 0; + let mut merged_page = get_page_data(client, project_id, page).await?; + loop { + let mut new_page = get_page_data(client, project_id, page).await?; + if new_page.items.is_empty() { + // Once there are no posts, we're done. + break; + } else { + page += 1; + merged_page.number_items += new_page.number_items; + merged_page.items.append(&mut new_page.items); + } + } + Ok(merged_page) +} + async fn get_page_data( client: &mut Client, project_id: &str, @@ -99,19 +119,14 @@ async fn get_page_data( } } -#[get("//feed.rss?")] -async fn syndication_rss_route( - project: &str, - page: Option, -) -> Result { - let page = page.unwrap_or(0); +#[get("//feed.rss")] +async fn syndication_rss_route(project: &str) -> Result { let mut client = get_client()?; let project_data = get_project_data(&mut client, project).await?; - let page_data = get_page_data(&mut client, project, page).await?; + let page_data = get_full_post_data(&mut client, project).await?; Ok(RssResponse { - inner: syndication::channel_for_posts_page(project, page, project_data, page_data) - .to_string(), + inner: syndication::channel_for_posts_page(project, project_data, page_data).to_string(), }) } diff --git a/src/syndication.rs b/src/syndication.rs index a3c4c8e..495e842 100644 --- a/src/syndication.rs +++ b/src/syndication.rs @@ -20,7 +20,6 @@ fn rel_link_for(rel: &str, project_name: &str, page_number: u64) -> Link { pub fn channel_for_posts_page( project_name: impl AsRef, - page_number: u64, project: CohostAccount, mut page: CohostPostsPage, ) -> Channel { @@ -34,23 +33,13 @@ pub fn channel_for_posts_page( env!("CARGO_CRATE_NAME"), env!("CARGO_PKG_VERSION") ))) - .link(format!( - "https://cohost.org/{}?page={}", - project_name, page_number - )); + .link(format!("https://cohost.org/{}", project_name,)); let mut atom = AtomExtensionBuilder::default(); - let mut links = vec![ - rel_link_for("self", project_name, page_number), + let links = vec![ + rel_link_for("self", project_name, 0), rel_link_for("first", project_name, 0), ]; - if page_number > 0 { - links.push(rel_link_for("previous", project_name, page_number - 1)); - } - if page.number_items > 0 { - // Cohost API is wrong about the pagination so we can only guess. If there are posts, there might be more posts. - links.push(rel_link_for("next", project_name, page_number + 1)); - } atom.links(links); builder.atom_ext(Some(atom.build()));