mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-22 14:45:10 +00:00
Add limit and pagination to feeds (#2980)
* adds limit and pagination to all rss feeds * consistent ordering * refactor page and limit and add after * revert back to using page * remove offset change * refactor to impl adding helper methods * clippy
This commit is contained in:
parent
25275b79ee
commit
5f92125e44
|
@ -31,13 +31,30 @@ use rss::{
|
||||||
};
|
};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::{collections::BTreeMap, str::FromStr};
|
use std::{collections::BTreeMap, str::FromStr};
|
||||||
use strum::ParseError;
|
|
||||||
|
|
||||||
const RSS_FETCH_LIMIT: i64 = 20;
|
const RSS_FETCH_LIMIT: i64 = 20;
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Params {
|
struct Params {
|
||||||
sort: Option<String>,
|
sort: Option<String>,
|
||||||
|
limit: Option<i64>,
|
||||||
|
page: Option<i64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Params {
|
||||||
|
fn sort_type(&self) -> Result<SortType, Error> {
|
||||||
|
let sort_query = self
|
||||||
|
.sort
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_else(|| SortType::Hot.to_string());
|
||||||
|
SortType::from_str(&sort_query).map_err(ErrorBadRequest)
|
||||||
|
}
|
||||||
|
fn get_limit(&self) -> i64 {
|
||||||
|
self.limit.unwrap_or(RSS_FETCH_LIMIT)
|
||||||
|
}
|
||||||
|
fn get_page(&self) -> i64 {
|
||||||
|
self.page.unwrap_or(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum RequestType {
|
enum RequestType {
|
||||||
|
@ -68,8 +85,16 @@ async fn get_all_feed(
|
||||||
info: web::Query<Params>,
|
info: web::Query<Params>,
|
||||||
context: web::Data<LemmyContext>,
|
context: web::Data<LemmyContext>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let sort_type = get_sort_type(info).map_err(ErrorBadRequest)?;
|
Ok(
|
||||||
Ok(get_feed_data(&context, ListingType::All, sort_type).await?)
|
get_feed_data(
|
||||||
|
&context,
|
||||||
|
ListingType::All,
|
||||||
|
info.sort_type()?,
|
||||||
|
info.get_limit(),
|
||||||
|
info.get_page(),
|
||||||
|
)
|
||||||
|
.await?,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
|
@ -77,8 +102,16 @@ async fn get_local_feed(
|
||||||
info: web::Query<Params>,
|
info: web::Query<Params>,
|
||||||
context: web::Data<LemmyContext>,
|
context: web::Data<LemmyContext>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let sort_type = get_sort_type(info).map_err(ErrorBadRequest)?;
|
Ok(
|
||||||
Ok(get_feed_data(&context, ListingType::Local, sort_type).await?)
|
get_feed_data(
|
||||||
|
&context,
|
||||||
|
ListingType::Local,
|
||||||
|
info.sort_type()?,
|
||||||
|
info.get_limit(),
|
||||||
|
info.get_page(),
|
||||||
|
)
|
||||||
|
.await?,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
|
@ -86,6 +119,8 @@ async fn get_feed_data(
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
listing_type: ListingType,
|
listing_type: ListingType,
|
||||||
sort_type: SortType,
|
sort_type: SortType,
|
||||||
|
limit: i64,
|
||||||
|
page: i64,
|
||||||
) -> Result<HttpResponse, LemmyError> {
|
) -> Result<HttpResponse, LemmyError> {
|
||||||
let site_view = SiteView::read_local(context.pool()).await?;
|
let site_view = SiteView::read_local(context.pool()).await?;
|
||||||
|
|
||||||
|
@ -93,7 +128,8 @@ async fn get_feed_data(
|
||||||
.pool(context.pool())
|
.pool(context.pool())
|
||||||
.listing_type(Some(listing_type))
|
.listing_type(Some(listing_type))
|
||||||
.sort(Some(sort_type))
|
.sort(Some(sort_type))
|
||||||
.limit(Some(RSS_FETCH_LIMIT))
|
.limit(Some(limit))
|
||||||
|
.page(Some(page))
|
||||||
.build()
|
.build()
|
||||||
.list()
|
.list()
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -125,8 +161,6 @@ async fn get_feed(
|
||||||
info: web::Query<Params>,
|
info: web::Query<Params>,
|
||||||
context: web::Data<LemmyContext>,
|
context: web::Data<LemmyContext>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let sort_type = get_sort_type(info).map_err(ErrorBadRequest)?;
|
|
||||||
|
|
||||||
let req_type: String = req.match_info().get("type").unwrap_or("none").parse()?;
|
let req_type: String = req.match_info().get("type").unwrap_or("none").parse()?;
|
||||||
let param: String = req.match_info().get("name").unwrap_or("none").parse()?;
|
let param: String = req.match_info().get("name").unwrap_or("none").parse()?;
|
||||||
|
|
||||||
|
@ -143,16 +177,34 @@ async fn get_feed(
|
||||||
|
|
||||||
let builder = match request_type {
|
let builder = match request_type {
|
||||||
RequestType::User => {
|
RequestType::User => {
|
||||||
get_feed_user(context.pool(), &sort_type, ¶m, &protocol_and_hostname).await
|
get_feed_user(
|
||||||
|
context.pool(),
|
||||||
|
&info.sort_type()?,
|
||||||
|
&info.get_limit(),
|
||||||
|
&info.get_page(),
|
||||||
|
¶m,
|
||||||
|
&protocol_and_hostname,
|
||||||
|
)
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
RequestType::Community => {
|
RequestType::Community => {
|
||||||
get_feed_community(context.pool(), &sort_type, ¶m, &protocol_and_hostname).await
|
get_feed_community(
|
||||||
|
context.pool(),
|
||||||
|
&info.sort_type()?,
|
||||||
|
&info.get_limit(),
|
||||||
|
&info.get_page(),
|
||||||
|
¶m,
|
||||||
|
&protocol_and_hostname,
|
||||||
|
)
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
RequestType::Front => {
|
RequestType::Front => {
|
||||||
get_feed_front(
|
get_feed_front(
|
||||||
context.pool(),
|
context.pool(),
|
||||||
&jwt_secret,
|
&jwt_secret,
|
||||||
&sort_type,
|
&info.sort_type()?,
|
||||||
|
&info.get_limit(),
|
||||||
|
&info.get_page(),
|
||||||
¶m,
|
¶m,
|
||||||
&protocol_and_hostname,
|
&protocol_and_hostname,
|
||||||
)
|
)
|
||||||
|
@ -173,18 +225,12 @@ async fn get_feed(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_sort_type(info: web::Query<Params>) -> Result<SortType, ParseError> {
|
|
||||||
let sort_query = info
|
|
||||||
.sort
|
|
||||||
.clone()
|
|
||||||
.unwrap_or_else(|| SortType::Hot.to_string());
|
|
||||||
SortType::from_str(&sort_query)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
async fn get_feed_user(
|
async fn get_feed_user(
|
||||||
pool: &DbPool,
|
pool: &DbPool,
|
||||||
sort_type: &SortType,
|
sort_type: &SortType,
|
||||||
|
limit: &i64,
|
||||||
|
page: &i64,
|
||||||
user_name: &str,
|
user_name: &str,
|
||||||
protocol_and_hostname: &str,
|
protocol_and_hostname: &str,
|
||||||
) -> Result<ChannelBuilder, LemmyError> {
|
) -> Result<ChannelBuilder, LemmyError> {
|
||||||
|
@ -196,7 +242,8 @@ async fn get_feed_user(
|
||||||
.listing_type(Some(ListingType::All))
|
.listing_type(Some(ListingType::All))
|
||||||
.sort(Some(*sort_type))
|
.sort(Some(*sort_type))
|
||||||
.creator_id(Some(person.id))
|
.creator_id(Some(person.id))
|
||||||
.limit(Some(RSS_FETCH_LIMIT))
|
.limit(Some(*limit))
|
||||||
|
.page(Some(*page))
|
||||||
.build()
|
.build()
|
||||||
.list()
|
.list()
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -217,6 +264,8 @@ async fn get_feed_user(
|
||||||
async fn get_feed_community(
|
async fn get_feed_community(
|
||||||
pool: &DbPool,
|
pool: &DbPool,
|
||||||
sort_type: &SortType,
|
sort_type: &SortType,
|
||||||
|
limit: &i64,
|
||||||
|
page: &i64,
|
||||||
community_name: &str,
|
community_name: &str,
|
||||||
protocol_and_hostname: &str,
|
protocol_and_hostname: &str,
|
||||||
) -> Result<ChannelBuilder, LemmyError> {
|
) -> Result<ChannelBuilder, LemmyError> {
|
||||||
|
@ -227,7 +276,8 @@ async fn get_feed_community(
|
||||||
.pool(pool)
|
.pool(pool)
|
||||||
.sort(Some(*sort_type))
|
.sort(Some(*sort_type))
|
||||||
.community_id(Some(community.id))
|
.community_id(Some(community.id))
|
||||||
.limit(Some(RSS_FETCH_LIMIT))
|
.limit(Some(*limit))
|
||||||
|
.page(Some(*page))
|
||||||
.build()
|
.build()
|
||||||
.list()
|
.list()
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -253,6 +303,8 @@ async fn get_feed_front(
|
||||||
pool: &DbPool,
|
pool: &DbPool,
|
||||||
jwt_secret: &str,
|
jwt_secret: &str,
|
||||||
sort_type: &SortType,
|
sort_type: &SortType,
|
||||||
|
limit: &i64,
|
||||||
|
page: &i64,
|
||||||
jwt: &str,
|
jwt: &str,
|
||||||
protocol_and_hostname: &str,
|
protocol_and_hostname: &str,
|
||||||
) -> Result<ChannelBuilder, LemmyError> {
|
) -> Result<ChannelBuilder, LemmyError> {
|
||||||
|
@ -265,7 +317,8 @@ async fn get_feed_front(
|
||||||
.listing_type(Some(ListingType::Subscribed))
|
.listing_type(Some(ListingType::Subscribed))
|
||||||
.local_user(Some(&local_user))
|
.local_user(Some(&local_user))
|
||||||
.sort(Some(*sort_type))
|
.sort(Some(*sort_type))
|
||||||
.limit(Some(RSS_FETCH_LIMIT))
|
.limit(Some(*limit))
|
||||||
|
.page(Some(*page))
|
||||||
.build()
|
.build()
|
||||||
.list()
|
.list()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
Loading…
Reference in a new issue