mirror of
https://github.com/LemmyNet/lemmy.git
synced 2025-01-08 03:01:59 +00:00
New parameter read_only
for /api/v3/post/list (#5264)
* added option to get only read only posts with unittests * formatted code * added index on (person_id, read) on post actions where read is not null * formatted sql * Update migrations/2024-12-15-151642_add_index_on_person_id_read_for_read_only_post_actions/up.sql Co-authored-by: dullbananas <dull.bananas0@gmail.com> * Fixxed error in down.sql for migration of index on (person_id,read_only,post_id) on post_actions * Fixxed error in unittests * Update crates/db_views/src/post_view.rs Co-authored-by: dullbananas <dull.bananas0@gmail.com> --------- Co-authored-by: dullbananas <dull.bananas0@gmail.com>
This commit is contained in:
parent
c656465e28
commit
ba779b978f
5 changed files with 45 additions and 0 deletions
|
@ -99,6 +99,8 @@ pub struct GetPosts {
|
||||||
#[cfg_attr(feature = "full", ts(optional))]
|
#[cfg_attr(feature = "full", ts(optional))]
|
||||||
pub saved_only: Option<bool>,
|
pub saved_only: Option<bool>,
|
||||||
#[cfg_attr(feature = "full", ts(optional))]
|
#[cfg_attr(feature = "full", ts(optional))]
|
||||||
|
pub read_only: Option<bool>,
|
||||||
|
#[cfg_attr(feature = "full", ts(optional))]
|
||||||
pub liked_only: Option<bool>,
|
pub liked_only: Option<bool>,
|
||||||
#[cfg_attr(feature = "full", ts(optional))]
|
#[cfg_attr(feature = "full", ts(optional))]
|
||||||
pub disliked_only: Option<bool>,
|
pub disliked_only: Option<bool>,
|
||||||
|
|
|
@ -42,6 +42,7 @@ pub async fn list_posts(
|
||||||
data.community_id
|
data.community_id
|
||||||
};
|
};
|
||||||
let saved_only = data.saved_only;
|
let saved_only = data.saved_only;
|
||||||
|
let read_only = data.read_only;
|
||||||
let show_hidden = data.show_hidden;
|
let show_hidden = data.show_hidden;
|
||||||
let show_read = data.show_read;
|
let show_read = data.show_read;
|
||||||
let show_nsfw = data.show_nsfw;
|
let show_nsfw = data.show_nsfw;
|
||||||
|
@ -78,6 +79,7 @@ pub async fn list_posts(
|
||||||
sort,
|
sort,
|
||||||
community_id,
|
community_id,
|
||||||
saved_only,
|
saved_only,
|
||||||
|
read_only,
|
||||||
liked_only,
|
liked_only,
|
||||||
disliked_only,
|
disliked_only,
|
||||||
page,
|
page,
|
||||||
|
|
|
@ -317,6 +317,12 @@ fn queries<'a>() -> Queries<
|
||||||
.filter(post_actions::saved.is_not_null())
|
.filter(post_actions::saved.is_not_null())
|
||||||
.then_order_by(post_actions::saved.desc());
|
.then_order_by(post_actions::saved.desc());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.read_only.unwrap_or_default() {
|
||||||
|
query = query
|
||||||
|
.filter(post_actions::read.is_not_null())
|
||||||
|
.then_order_by(post_actions::read.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 !o.show_read.unwrap_or(o.local_user.show_read_posts()) {
|
else if !o.show_read.unwrap_or(o.local_user.show_read_posts()) {
|
||||||
|
@ -510,6 +516,7 @@ pub struct PostQuery<'a> {
|
||||||
pub search_term: Option<String>,
|
pub search_term: Option<String>,
|
||||||
pub url_only: Option<bool>,
|
pub url_only: Option<bool>,
|
||||||
pub saved_only: Option<bool>,
|
pub saved_only: Option<bool>,
|
||||||
|
pub read_only: Option<bool>,
|
||||||
pub liked_only: Option<bool>,
|
pub liked_only: Option<bool>,
|
||||||
pub disliked_only: Option<bool>,
|
pub disliked_only: Option<bool>,
|
||||||
pub title_only: Option<bool>,
|
pub title_only: Option<bool>,
|
||||||
|
@ -1236,6 +1243,34 @@ mod tests {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test_context(Data)]
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn post_listing_read_only(data: &mut Data) -> LemmyResult<()> {
|
||||||
|
let pool = &data.pool();
|
||||||
|
let pool = &mut pool.into();
|
||||||
|
|
||||||
|
// Only mark the bot post as read
|
||||||
|
// The read_only should only show the bot post
|
||||||
|
let post_read_form =
|
||||||
|
PostReadForm::new(data.inserted_bot_post.id, data.local_user_view.person.id);
|
||||||
|
PostRead::mark_as_read(pool, &post_read_form).await?;
|
||||||
|
|
||||||
|
// Only read the post marked as read
|
||||||
|
let read_read_post_listing = PostQuery {
|
||||||
|
community_id: Some(data.inserted_community.id),
|
||||||
|
read_only: Some(true),
|
||||||
|
..data.default_post_query()
|
||||||
|
}
|
||||||
|
.list(&data.site, pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// This should only include the bot post, not the one you created
|
||||||
|
assert_eq!(vec![POST_BY_BOT], names(&read_read_post_listing));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test_context(Data)]
|
#[test_context(Data)]
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
#[serial]
|
#[serial]
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
DROP INDEX idx_post_actions_on_read_read_not_null;
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
CREATE INDEX idx_post_actions_on_read_read_not_null ON post_actions (person_id, read, post_id)
|
||||||
|
WHERE
|
||||||
|
read IS NOT NULL;
|
||||||
|
|
Loading…
Reference in a new issue