Don't pagniate, just fetch everything
This commit is contained in:
parent
bd012f491a
commit
bf14f554ee
|
@ -16,8 +16,10 @@ ports to use for development and deployment.
|
||||||
- [ ] Handle redirects
|
- [ ] Handle redirects
|
||||||
- [x] RSS feeds for projects
|
- [x] RSS feeds for projects
|
||||||
- [x] Index page explaining what's going on
|
- [x] Index page explaining what's going on
|
||||||
|
- [ ] More robust parsing (defaults for all!)
|
||||||
- [ ] RSS feeds for tags
|
- [ ] RSS feeds for tags
|
||||||
- [x] Atom Extension pagination support
|
- [x] Atom Extension pagination support
|
||||||
|
- [x] Disable pagination and just go for it lmao
|
||||||
- [ ] Read More support
|
- [ ] Read More support
|
||||||
- [ ] Dublin Core support
|
- [ ] Dublin Core support
|
||||||
- [ ] Media Envelope support
|
- [ ] Media Envelope support
|
||||||
|
|
33
src/main.rs
33
src/main.rs
|
@ -61,6 +61,26 @@ enum ErrorResponse {
|
||||||
InternalError(String),
|
InternalError(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_full_post_data(
|
||||||
|
client: &mut Client,
|
||||||
|
project_id: &str,
|
||||||
|
) -> Result<CohostPostsPage, ErrorResponse> {
|
||||||
|
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(
|
async fn get_page_data(
|
||||||
client: &mut Client,
|
client: &mut Client,
|
||||||
project_id: &str,
|
project_id: &str,
|
||||||
|
@ -99,19 +119,14 @@ async fn get_page_data(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/<project>/feed.rss?<page>")]
|
#[get("/<project>/feed.rss")]
|
||||||
async fn syndication_rss_route(
|
async fn syndication_rss_route(project: &str) -> Result<RssResponse, ErrorResponse> {
|
||||||
project: &str,
|
|
||||||
page: Option<u64>,
|
|
||||||
) -> Result<RssResponse, ErrorResponse> {
|
|
||||||
let page = page.unwrap_or(0);
|
|
||||||
let mut client = get_client()?;
|
let mut client = get_client()?;
|
||||||
|
|
||||||
let project_data = get_project_data(&mut client, project).await?;
|
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 {
|
Ok(RssResponse {
|
||||||
inner: syndication::channel_for_posts_page(project, page, project_data, page_data)
|
inner: syndication::channel_for_posts_page(project, project_data, page_data).to_string(),
|
||||||
.to_string(),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ fn rel_link_for(rel: &str, project_name: &str, page_number: u64) -> Link {
|
||||||
|
|
||||||
pub fn channel_for_posts_page(
|
pub fn channel_for_posts_page(
|
||||||
project_name: impl AsRef<str>,
|
project_name: impl AsRef<str>,
|
||||||
page_number: u64,
|
|
||||||
project: CohostAccount,
|
project: CohostAccount,
|
||||||
mut page: CohostPostsPage,
|
mut page: CohostPostsPage,
|
||||||
) -> Channel {
|
) -> Channel {
|
||||||
|
@ -34,23 +33,13 @@ pub fn channel_for_posts_page(
|
||||||
env!("CARGO_CRATE_NAME"),
|
env!("CARGO_CRATE_NAME"),
|
||||||
env!("CARGO_PKG_VERSION")
|
env!("CARGO_PKG_VERSION")
|
||||||
)))
|
)))
|
||||||
.link(format!(
|
.link(format!("https://cohost.org/{}", project_name,));
|
||||||
"https://cohost.org/{}?page={}",
|
|
||||||
project_name, page_number
|
|
||||||
));
|
|
||||||
|
|
||||||
let mut atom = AtomExtensionBuilder::default();
|
let mut atom = AtomExtensionBuilder::default();
|
||||||
let mut links = vec![
|
let links = vec![
|
||||||
rel_link_for("self", project_name, page_number),
|
rel_link_for("self", project_name, 0),
|
||||||
rel_link_for("first", 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);
|
atom.links(links);
|
||||||
|
|
||||||
builder.atom_ext(Some(atom.build()));
|
builder.atom_ext(Some(atom.build()));
|
||||||
|
|
Loading…
Reference in New Issue