Adding a show_read override to GetPosts. (#4846)
* Adding a show_read override to GetPosts. - If show_read is true, it overrides the local user show_read setting. - Fixes #4124 * Addressing PR comments. * Update crates/db_views/src/post_view.rs Co-authored-by: dullbananas <dull.bananas0@gmail.com> * Fixing formatting. --------- Co-authored-by: dullbananas <dull.bananas0@gmail.com>
This commit is contained in:
parent
c8d155102a
commit
d09854a722
6 changed files with 66 additions and 38 deletions
|
@ -79,6 +79,8 @@ pub struct GetPosts {
|
||||||
pub liked_only: Option<bool>,
|
pub liked_only: Option<bool>,
|
||||||
pub disliked_only: Option<bool>,
|
pub disliked_only: Option<bool>,
|
||||||
pub show_hidden: Option<bool>,
|
pub show_hidden: Option<bool>,
|
||||||
|
/// If true, then show the read posts (even if your user setting is to hide them)
|
||||||
|
pub show_read: Option<bool>,
|
||||||
pub page_cursor: Option<PaginationCursor>,
|
pub page_cursor: Option<PaginationCursor>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,11 @@ pub async fn list_comments(
|
||||||
};
|
};
|
||||||
let sort = data.sort;
|
let sort = data.sort;
|
||||||
let max_depth = data.max_depth;
|
let max_depth = data.max_depth;
|
||||||
let saved_only = data.saved_only.unwrap_or_default();
|
let saved_only = data.saved_only;
|
||||||
|
|
||||||
let liked_only = data.liked_only.unwrap_or_default();
|
let liked_only = data.liked_only;
|
||||||
let disliked_only = data.disliked_only.unwrap_or_default();
|
let disliked_only = data.disliked_only;
|
||||||
if liked_only && disliked_only {
|
if liked_only.unwrap_or_default() && disliked_only.unwrap_or_default() {
|
||||||
return Err(LemmyError::from(LemmyErrorType::ContradictingFilters));
|
return Err(LemmyError::from(LemmyErrorType::ContradictingFilters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,12 +40,13 @@ pub async fn list_posts(
|
||||||
} else {
|
} else {
|
||||||
data.community_id
|
data.community_id
|
||||||
};
|
};
|
||||||
let saved_only = data.saved_only.unwrap_or_default();
|
let saved_only = data.saved_only;
|
||||||
let show_hidden = data.show_hidden.unwrap_or_default();
|
let show_hidden = data.show_hidden;
|
||||||
|
let show_read = data.show_read;
|
||||||
|
|
||||||
let liked_only = data.liked_only.unwrap_or_default();
|
let liked_only = data.liked_only;
|
||||||
let disliked_only = data.disliked_only.unwrap_or_default();
|
let disliked_only = data.disliked_only;
|
||||||
if liked_only && disliked_only {
|
if liked_only.unwrap_or_default() && disliked_only.unwrap_or_default() {
|
||||||
return Err(LemmyError::from(LemmyErrorType::ContradictingFilters));
|
return Err(LemmyError::from(LemmyErrorType::ContradictingFilters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +83,7 @@ pub async fn list_posts(
|
||||||
page_after,
|
page_after,
|
||||||
limit,
|
limit,
|
||||||
show_hidden,
|
show_hidden,
|
||||||
|
show_read,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
.list(&local_site.site, &mut context.pool())
|
.list(&local_site.site, &mut context.pool())
|
||||||
|
|
|
@ -55,11 +55,11 @@ pub async fn read_person(
|
||||||
let sort = data.sort;
|
let sort = data.sort;
|
||||||
let page = data.page;
|
let page = data.page;
|
||||||
let limit = data.limit;
|
let limit = data.limit;
|
||||||
let saved_only = data.saved_only.unwrap_or_default();
|
let saved_only = data.saved_only;
|
||||||
let community_id = data.community_id;
|
let community_id = data.community_id;
|
||||||
// If its saved only, you don't care what creator it was
|
// If its saved only, you don't care what creator it was
|
||||||
// Or, if its not saved, then you only want it for that specific creator
|
// Or, if its not saved, then you only want it for that specific creator
|
||||||
let creator_id = if !saved_only {
|
let creator_id = if !saved_only.unwrap_or_default() {
|
||||||
Some(person_details_id)
|
Some(person_details_id)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
@ -252,7 +252,7 @@ fn queries<'a>() -> Queries<
|
||||||
}
|
}
|
||||||
|
|
||||||
// If its saved only, then filter, and order by the saved time, not the comment creation time.
|
// If its saved only, then filter, and order by the saved time, not the comment creation time.
|
||||||
if options.saved_only {
|
if options.saved_only.unwrap_or_default() {
|
||||||
query = query
|
query = query
|
||||||
.filter(comment_saved::person_id.is_not_null())
|
.filter(comment_saved::person_id.is_not_null())
|
||||||
.then_order_by(comment_saved::published.desc());
|
.then_order_by(comment_saved::published.desc());
|
||||||
|
@ -260,9 +260,9 @@ fn queries<'a>() -> Queries<
|
||||||
|
|
||||||
if let Some(my_id) = options.local_user.person_id() {
|
if let Some(my_id) = options.local_user.person_id() {
|
||||||
let not_creator_filter = comment::creator_id.ne(my_id);
|
let not_creator_filter = comment::creator_id.ne(my_id);
|
||||||
if options.liked_only {
|
if options.liked_only.unwrap_or_default() {
|
||||||
query = query.filter(not_creator_filter).filter(score(my_id).eq(1));
|
query = query.filter(not_creator_filter).filter(score(my_id).eq(1));
|
||||||
} else if options.disliked_only {
|
} else if options.disliked_only.unwrap_or_default() {
|
||||||
query = query.filter(not_creator_filter).filter(score(my_id).eq(-1));
|
query = query.filter(not_creator_filter).filter(score(my_id).eq(-1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -398,9 +398,9 @@ pub struct CommentQuery<'a> {
|
||||||
pub creator_id: Option<PersonId>,
|
pub creator_id: Option<PersonId>,
|
||||||
pub local_user: Option<&'a LocalUser>,
|
pub local_user: Option<&'a LocalUser>,
|
||||||
pub search_term: Option<String>,
|
pub search_term: Option<String>,
|
||||||
pub saved_only: bool,
|
pub saved_only: Option<bool>,
|
||||||
pub liked_only: bool,
|
pub liked_only: Option<bool>,
|
||||||
pub disliked_only: bool,
|
pub disliked_only: Option<bool>,
|
||||||
pub page: Option<i64>,
|
pub page: Option<i64>,
|
||||||
pub limit: Option<i64>,
|
pub limit: Option<i64>,
|
||||||
pub max_depth: Option<i32>,
|
pub max_depth: Option<i32>,
|
||||||
|
@ -711,8 +711,8 @@ mod tests {
|
||||||
CommentLike::like(pool, &comment_like_form).await?;
|
CommentLike::like(pool, &comment_like_form).await?;
|
||||||
|
|
||||||
let read_liked_comment_views = CommentQuery {
|
let read_liked_comment_views = CommentQuery {
|
||||||
local_user: (Some(&data.timmy_local_user_view.local_user)),
|
local_user: Some(&data.timmy_local_user_view.local_user),
|
||||||
liked_only: (true),
|
liked_only: Some(true),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
.list(pool)
|
.list(pool)
|
||||||
|
@ -727,8 +727,8 @@ mod tests {
|
||||||
assert_length!(1, read_liked_comment_views);
|
assert_length!(1, read_liked_comment_views);
|
||||||
|
|
||||||
let read_disliked_comment_views: Vec<CommentView> = CommentQuery {
|
let read_disliked_comment_views: Vec<CommentView> = CommentQuery {
|
||||||
local_user: (Some(&data.timmy_local_user_view.local_user)),
|
local_user: Some(&data.timmy_local_user_view.local_user),
|
||||||
disliked_only: (true),
|
disliked_only: Some(true),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
.list(pool)
|
.list(pool)
|
||||||
|
@ -980,7 +980,7 @@ mod tests {
|
||||||
// Fetch the saved comments
|
// Fetch the saved comments
|
||||||
let comments = CommentQuery {
|
let comments = CommentQuery {
|
||||||
local_user: Some(&data.timmy_local_user_view.local_user),
|
local_user: Some(&data.timmy_local_user_view.local_user),
|
||||||
saved_only: true,
|
saved_only: Some(true),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
.list(pool)
|
.list(pool)
|
||||||
|
|
|
@ -403,14 +403,17 @@ fn queries<'a>() -> Queries<
|
||||||
};
|
};
|
||||||
|
|
||||||
// If its saved only, then filter, and order by the saved time, not the comment creation time.
|
// If its saved only, then filter, and order by the saved time, not the comment creation time.
|
||||||
if options.saved_only {
|
if options.saved_only.unwrap_or_default() {
|
||||||
query = query
|
query = query
|
||||||
.filter(post_saved::person_id.is_not_null())
|
.filter(post_saved::person_id.is_not_null())
|
||||||
.then_order_by(post_saved::published.desc());
|
.then_order_by(post_saved::published.desc());
|
||||||
}
|
}
|
||||||
// Only hide the read posts, if the saved_only is false. Otherwise ppl with the hide_read
|
// Only hide the read posts, if the saved_only is false. Otherwise ppl with the hide_read
|
||||||
// setting wont be able to see saved posts.
|
// setting wont be able to see saved posts.
|
||||||
else if !options.local_user.show_read_posts() {
|
else if !options
|
||||||
|
.show_read
|
||||||
|
.unwrap_or(options.local_user.show_read_posts())
|
||||||
|
{
|
||||||
// Do not hide read posts when it is a user profile view
|
// Do not hide read posts when it is a user profile view
|
||||||
// Or, only hide read posts on non-profile views
|
// Or, only hide read posts on non-profile views
|
||||||
if let (None, Some(person_id)) = (options.creator_id, options.local_user.person_id()) {
|
if let (None, Some(person_id)) = (options.creator_id, options.local_user.person_id()) {
|
||||||
|
@ -418,7 +421,7 @@ fn queries<'a>() -> Queries<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !options.show_hidden {
|
if !options.show_hidden.unwrap_or_default() {
|
||||||
// If a creator id isn't given (IE its on home or community pages), hide the hidden posts
|
// If a creator id isn't given (IE its on home or community pages), hide the hidden posts
|
||||||
if let (None, Some(person_id)) = (options.creator_id, options.local_user.person_id()) {
|
if let (None, Some(person_id)) = (options.creator_id, options.local_user.person_id()) {
|
||||||
query = query.filter(not(is_hidden(person_id)));
|
query = query.filter(not(is_hidden(person_id)));
|
||||||
|
@ -427,9 +430,9 @@ fn queries<'a>() -> Queries<
|
||||||
|
|
||||||
if let Some(my_id) = options.local_user.person_id() {
|
if let Some(my_id) = options.local_user.person_id() {
|
||||||
let not_creator_filter = post_aggregates::creator_id.ne(my_id);
|
let not_creator_filter = post_aggregates::creator_id.ne(my_id);
|
||||||
if options.liked_only {
|
if options.liked_only.unwrap_or_default() {
|
||||||
query = query.filter(not_creator_filter).filter(score(my_id).eq(1));
|
query = query.filter(not_creator_filter).filter(score(my_id).eq(1));
|
||||||
} else if options.disliked_only {
|
} else if options.disliked_only.unwrap_or_default() {
|
||||||
query = query.filter(not_creator_filter).filter(score(my_id).eq(-1));
|
query = query.filter(not_creator_filter).filter(score(my_id).eq(-1));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -476,7 +479,7 @@ fn queries<'a>() -> Queries<
|
||||||
let page_after = options.page_after.map(|c| c.0);
|
let page_after = options.page_after.map(|c| c.0);
|
||||||
let page_before_or_equal = options.page_before_or_equal.map(|c| c.0);
|
let page_before_or_equal = options.page_before_or_equal.map(|c| c.0);
|
||||||
|
|
||||||
if options.page_back {
|
if options.page_back.unwrap_or_default() {
|
||||||
query = query
|
query = query
|
||||||
.before(page_after)
|
.before(page_after)
|
||||||
.after_or_equal(page_before_or_equal)
|
.after_or_equal(page_before_or_equal)
|
||||||
|
@ -604,15 +607,16 @@ pub struct PostQuery<'a> {
|
||||||
pub local_user: Option<&'a LocalUser>,
|
pub local_user: Option<&'a LocalUser>,
|
||||||
pub search_term: Option<String>,
|
pub search_term: Option<String>,
|
||||||
pub url_search: Option<String>,
|
pub url_search: Option<String>,
|
||||||
pub saved_only: bool,
|
pub saved_only: Option<bool>,
|
||||||
pub liked_only: bool,
|
pub liked_only: Option<bool>,
|
||||||
pub disliked_only: bool,
|
pub disliked_only: Option<bool>,
|
||||||
pub page: Option<i64>,
|
pub page: Option<i64>,
|
||||||
pub limit: Option<i64>,
|
pub limit: Option<i64>,
|
||||||
pub page_after: Option<PaginationCursorData>,
|
pub page_after: Option<PaginationCursorData>,
|
||||||
pub page_before_or_equal: Option<PaginationCursorData>,
|
pub page_before_or_equal: Option<PaginationCursorData>,
|
||||||
pub page_back: bool,
|
pub page_back: Option<bool>,
|
||||||
pub show_hidden: bool,
|
pub show_hidden: Option<bool>,
|
||||||
|
pub show_read: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> PostQuery<'a> {
|
impl<'a> PostQuery<'a> {
|
||||||
|
@ -683,7 +687,7 @@ impl<'a> PostQuery<'a> {
|
||||||
if (v.len() as i64) < limit {
|
if (v.len() as i64) < limit {
|
||||||
Ok(Some(self.clone()))
|
Ok(Some(self.clone()))
|
||||||
} else {
|
} else {
|
||||||
let item = if self.page_back {
|
let item = if self.page_back.unwrap_or_default() {
|
||||||
// for backward pagination, get first element instead
|
// for backward pagination, get first element instead
|
||||||
v.into_iter().next()
|
v.into_iter().next()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1122,7 +1126,7 @@ mod tests {
|
||||||
// Read the liked only
|
// Read the liked only
|
||||||
let read_liked_post_listing = PostQuery {
|
let read_liked_post_listing = PostQuery {
|
||||||
community_id: Some(data.inserted_community.id),
|
community_id: Some(data.inserted_community.id),
|
||||||
liked_only: true,
|
liked_only: Some(true),
|
||||||
..data.default_post_query()
|
..data.default_post_query()
|
||||||
}
|
}
|
||||||
.list(&data.site, pool)
|
.list(&data.site, pool)
|
||||||
|
@ -1133,7 +1137,7 @@ mod tests {
|
||||||
|
|
||||||
let read_disliked_post_listing = PostQuery {
|
let read_disliked_post_listing = PostQuery {
|
||||||
community_id: Some(data.inserted_community.id),
|
community_id: Some(data.inserted_community.id),
|
||||||
disliked_only: true,
|
disliked_only: Some(true),
|
||||||
..data.default_post_query()
|
..data.default_post_query()
|
||||||
}
|
}
|
||||||
.list(&data.site, pool)
|
.list(&data.site, pool)
|
||||||
|
@ -1459,7 +1463,7 @@ mod tests {
|
||||||
loop {
|
loop {
|
||||||
let post_listings = PostQuery {
|
let post_listings = PostQuery {
|
||||||
page_after: page_before,
|
page_after: page_before,
|
||||||
page_back: true,
|
page_back: Some(true),
|
||||||
..options.clone()
|
..options.clone()
|
||||||
}
|
}
|
||||||
.list(&data.site, pool)
|
.list(&data.site, pool)
|
||||||
|
@ -1517,6 +1521,26 @@ mod tests {
|
||||||
let post_listings_hide_read = data.default_post_query().list(&data.site, pool).await?;
|
let post_listings_hide_read = data.default_post_query().list(&data.site, pool).await?;
|
||||||
assert_eq!(vec![POST], names(&post_listings_hide_read));
|
assert_eq!(vec![POST], names(&post_listings_hide_read));
|
||||||
|
|
||||||
|
// Test with the show_read override as true
|
||||||
|
let post_listings_show_read_true = PostQuery {
|
||||||
|
show_read: Some(true),
|
||||||
|
..data.default_post_query()
|
||||||
|
}
|
||||||
|
.list(&data.site, pool)
|
||||||
|
.await?;
|
||||||
|
assert_eq!(
|
||||||
|
vec![POST_BY_BOT, POST],
|
||||||
|
names(&post_listings_show_read_true)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test with the show_read override as false
|
||||||
|
let post_listings_show_read_false = PostQuery {
|
||||||
|
show_read: Some(false),
|
||||||
|
..data.default_post_query()
|
||||||
|
}
|
||||||
|
.list(&data.site, pool)
|
||||||
|
.await?;
|
||||||
|
assert_eq!(vec![POST], names(&post_listings_show_read_false));
|
||||||
cleanup(data, pool).await
|
cleanup(data, pool).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1543,7 +1567,7 @@ mod tests {
|
||||||
let post_listings_show_hidden = PostQuery {
|
let post_listings_show_hidden = PostQuery {
|
||||||
sort: Some(SortType::New),
|
sort: Some(SortType::New),
|
||||||
local_user: Some(&data.local_user_view.local_user),
|
local_user: Some(&data.local_user_view.local_user),
|
||||||
show_hidden: true,
|
show_hidden: Some(true),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
.list(&data.site, pool)
|
.list(&data.site, pool)
|
||||||
|
|
Loading…
Reference in a new issue