Add show_read_posts filter. Fixes #1561

This commit is contained in:
Dessalines 2021-04-24 18:26:50 -04:00
parent db1abff857
commit 5b2be6f9df
17 changed files with 87 additions and 9 deletions

View file

@ -240,6 +240,7 @@ impl Perform for SaveUserSettings {
default_listing_type, default_listing_type,
lang: data.lang.to_owned(), lang: data.lang.to_owned(),
show_avatars: data.show_avatars, show_avatars: data.show_avatars,
show_read_posts: data.show_read_posts,
send_notifications_to_email: data.send_notifications_to_email, send_notifications_to_email: data.send_notifications_to_email,
}; };

View file

@ -6,6 +6,7 @@ use lemmy_api_common::{
check_downvotes_enabled, check_downvotes_enabled,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
is_mod_or_admin, is_mod_or_admin,
mark_post_as_read,
post::*, post::*,
}; };
use lemmy_apub::{ApubLikeableType, ApubObjectType}; use lemmy_apub::{ApubLikeableType, ApubObjectType};
@ -69,6 +70,9 @@ impl Perform for CreatePostLike {
.await?; .await?;
} }
// Mark the post as read
mark_post_as_read(person_id, post_id, context.pool()).await?;
let post_id = data.post_id; let post_id = data.post_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let post_view = blocking(context.pool(), move |conn| { let post_view = blocking(context.pool(), move |conn| {
@ -269,6 +273,9 @@ impl Perform for SavePost {
}) })
.await??; .await??;
// Mark the post as read
mark_post_as_read(person_id, post_id, context.pool()).await?;
Ok(PostResponse { post_view }) Ok(PostResponse { post_view })
} }
} }

View file

@ -11,6 +11,7 @@ use lemmy_api_common::{
site::*, site::*,
user_show_bot_accounts, user_show_bot_accounts,
user_show_nsfw, user_show_nsfw,
user_show_read_posts,
}; };
use lemmy_apub::fetcher::search::search_by_apub_id; use lemmy_apub::fetcher::search::search_by_apub_id;
use lemmy_db_queries::{source::site::Site_, Crud, SearchType, SortType}; use lemmy_db_queries::{source::site::Site_, Crud, SearchType, SortType};
@ -141,6 +142,7 @@ impl Perform for Search {
let show_nsfw = user_show_nsfw(&local_user_view); let show_nsfw = user_show_nsfw(&local_user_view);
let show_bot_accounts = user_show_bot_accounts(&local_user_view); let show_bot_accounts = user_show_bot_accounts(&local_user_view);
let show_read_posts = user_show_read_posts(&local_user_view);
let person_id = local_user_view.map(|u| u.person.id); let person_id = local_user_view.map(|u| u.person.id);
@ -166,6 +168,7 @@ impl Perform for Search {
.sort(&sort) .sort(&sort)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.community_id(community_id) .community_id(community_id)
.community_name(community_name) .community_name(community_name)
.my_person_id(person_id) .my_person_id(person_id)
@ -218,6 +221,7 @@ impl Perform for Search {
.sort(&sort) .sort(&sort)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.community_id(community_id) .community_id(community_id)
.community_name(community_name) .community_name(community_name)
.my_person_id(person_id) .my_person_id(person_id)
@ -276,6 +280,7 @@ impl Perform for Search {
.sort(&sort) .sort(&sort)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.my_person_id(person_id) .my_person_id(person_id)
.community_id(community_id) .community_id(community_id)
.community_name(community_name) .community_name(community_name)

View file

@ -14,6 +14,7 @@ use lemmy_db_queries::{
}, },
Crud, Crud,
DbPool, DbPool,
Readable,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -21,7 +22,7 @@ use lemmy_db_schema::{
community::{Community, CommunityModerator}, community::{Community, CommunityModerator},
person::Person, person::Person,
person_mention::{PersonMention, PersonMentionForm}, person_mention::{PersonMention, PersonMentionForm},
post::Post, post::{Post, PostRead, PostReadForm},
site::Site, site::Site,
}, },
CommunityId, CommunityId,
@ -252,12 +253,34 @@ pub fn user_show_nsfw(local_user_view: &Option<LocalUserView>) -> bool {
} }
} }
/// A helper method for showing read posts
pub fn user_show_read_posts(local_user_view: &Option<LocalUserView>) -> bool {
match local_user_view {
Some(uv) => uv.to_owned().local_user.show_read_posts,
None => true,
}
}
pub async fn get_post(post_id: PostId, pool: &DbPool) -> Result<Post, LemmyError> { pub async fn get_post(post_id: PostId, pool: &DbPool) -> Result<Post, LemmyError> {
blocking(pool, move |conn| Post::read(conn, post_id)) blocking(pool, move |conn| Post::read(conn, post_id))
.await? .await?
.map_err(|_| ApiError::err("couldnt_find_post").into()) .map_err(|_| ApiError::err("couldnt_find_post").into())
} }
pub async fn mark_post_as_read(
person_id: PersonId,
post_id: PostId,
pool: &DbPool,
) -> Result<PostRead, LemmyError> {
let post_read_form = PostReadForm { post_id, person_id };
blocking(pool, move |conn| {
PostRead::mark_as_read(conn, &post_read_form)
})
.await?
.map_err(|_| ApiError::err("couldnt_mark_post_as_read").into())
}
pub async fn get_local_user_view_from_jwt( pub async fn get_local_user_view_from_jwt(
jwt: &str, jwt: &str,
pool: &DbPool, pool: &DbPool,

View file

@ -62,6 +62,7 @@ pub struct SaveUserSettings {
pub send_notifications_to_email: Option<bool>, pub send_notifications_to_email: Option<bool>,
pub bot_account: Option<bool>, pub bot_account: Option<bool>,
pub show_bot_accounts: Option<bool>, pub show_bot_accounts: Option<bool>,
pub show_read_posts: Option<bool>,
pub auth: String, pub auth: String,
} }

View file

@ -1,6 +1,12 @@
use crate::PerformCrud; use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{blocking, check_community_ban, get_local_user_view_from_jwt, post::*}; use lemmy_api_common::{
blocking,
check_community_ban,
get_local_user_view_from_jwt,
mark_post_as_read,
post::*,
};
use lemmy_apub::{generate_apub_endpoint, ApubLikeableType, ApubObjectType, EndpointType}; use lemmy_apub::{generate_apub_endpoint, ApubLikeableType, ApubObjectType, EndpointType};
use lemmy_db_queries::{source::post::Post_, Crud, Likeable}; use lemmy_db_queries::{source::post::Post_, Crud, Likeable};
use lemmy_db_schema::source::post::*; use lemmy_db_schema::source::post::*;
@ -81,9 +87,11 @@ impl PerformCrud for CreatePost {
.await?; .await?;
// They like their own post by default // They like their own post by default
let person_id = local_user_view.person.id;
let post_id = inserted_post.id;
let like_form = PostLikeForm { let like_form = PostLikeForm {
post_id: inserted_post.id, post_id,
person_id: local_user_view.person.id, person_id,
score: 1, score: 1,
}; };
@ -92,6 +100,9 @@ impl PerformCrud for CreatePost {
return Err(ApiError::err("couldnt_like_post").into()); return Err(ApiError::err("couldnt_like_post").into());
} }
// Mark the post as read
mark_post_as_read(person_id, post_id, context.pool()).await?;
updated_post updated_post
.send_like(&local_user_view.person, context) .send_like(&local_user_view.person, context)
.await?; .await?;

View file

@ -3,9 +3,11 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
blocking, blocking,
get_local_user_view_from_jwt_opt, get_local_user_view_from_jwt_opt,
mark_post_as_read,
post::*, post::*,
user_show_bot_accounts, user_show_bot_accounts,
user_show_nsfw, user_show_nsfw,
user_show_read_posts,
}; };
use lemmy_db_queries::{ListingType, SortType}; use lemmy_db_queries::{ListingType, SortType};
use lemmy_db_views::{ use lemmy_db_views::{
@ -43,6 +45,11 @@ impl PerformCrud for GetPost {
.await? .await?
.map_err(|_| ApiError::err("couldnt_find_post"))?; .map_err(|_| ApiError::err("couldnt_find_post"))?;
// Mark the post as read
if let Some(person_id) = person_id {
mark_post_as_read(person_id, id, context.pool()).await?;
}
let id = data.id; let id = data.id;
let comments = blocking(context.pool(), move |conn| { let comments = blocking(context.pool(), move |conn| {
CommentQueryBuilder::create(conn) CommentQueryBuilder::create(conn)
@ -100,6 +107,7 @@ impl PerformCrud for GetPosts {
let show_nsfw = user_show_nsfw(&local_user_view); let show_nsfw = user_show_nsfw(&local_user_view);
let show_bot_accounts = user_show_bot_accounts(&local_user_view); let show_bot_accounts = user_show_bot_accounts(&local_user_view);
let show_read_posts = user_show_read_posts(&local_user_view);
let type_ = ListingType::from_str(&data.type_)?; let type_ = ListingType::from_str(&data.type_)?;
let sort = SortType::from_str(&data.sort)?; let sort = SortType::from_str(&data.sort)?;
@ -116,6 +124,7 @@ impl PerformCrud for GetPosts {
.sort(&sort) .sort(&sort)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.community_id(community_id) .community_id(community_id)
.community_name(community_name) .community_name(community_name)
.saved_only(saved_only) .saved_only(saved_only)

View file

@ -130,6 +130,7 @@ impl PerformCrud for Register {
lang: Some("browser".into()), lang: Some("browser".into()),
show_avatars: Some(true), show_avatars: Some(true),
show_scores: Some(true), show_scores: Some(true),
show_read_posts: Some(true),
send_notifications_to_email: Some(false), send_notifications_to_email: Some(false),
}; };

View file

@ -6,6 +6,7 @@ use lemmy_api_common::{
person::*, person::*,
user_show_bot_accounts, user_show_bot_accounts,
user_show_nsfw, user_show_nsfw,
user_show_read_posts,
}; };
use lemmy_db_queries::{source::person::Person_, SortType}; use lemmy_db_queries::{source::person::Person_, SortType};
use lemmy_db_schema::source::person::*; use lemmy_db_schema::source::person::*;
@ -33,6 +34,7 @@ impl PerformCrud for GetPersonDetails {
let show_nsfw = user_show_nsfw(&local_user_view); let show_nsfw = user_show_nsfw(&local_user_view);
let show_bot_accounts = user_show_bot_accounts(&local_user_view); let show_bot_accounts = user_show_bot_accounts(&local_user_view);
let show_read_posts = user_show_read_posts(&local_user_view);
let sort = SortType::from_str(&data.sort)?; let sort = SortType::from_str(&data.sort)?;
@ -72,6 +74,7 @@ impl PerformCrud for GetPersonDetails {
.sort(&sort) .sort(&sort)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.saved_only(saved_only) .saved_only(saved_only)
.community_id(community_id) .community_id(community_id)
.my_person_id(person_id) .my_person_id(person_id)

View file

@ -26,6 +26,7 @@ mod safe_settings_type {
validator_time, validator_time,
show_bot_accounts, show_bot_accounts,
show_scores, show_scores,
show_read_posts,
); );
impl ToSafeSettings for LocalUser { impl ToSafeSettings for LocalUser {
@ -47,6 +48,7 @@ mod safe_settings_type {
validator_time, validator_time,
show_bot_accounts, show_bot_accounts,
show_scores, show_scores,
show_read_posts,
) )
} }
} }

View file

@ -243,6 +243,9 @@ impl Readable<PostReadForm> for PostRead {
use lemmy_db_schema::schema::post_read::dsl::*; use lemmy_db_schema::schema::post_read::dsl::*;
insert_into(post_read) insert_into(post_read)
.values(post_read_form) .values(post_read_form)
.on_conflict((post_id, person_id))
.do_update()
.set(post_read_form)
.get_result::<Self>(conn) .get_result::<Self>(conn)
} }

View file

@ -155,6 +155,7 @@ table! {
validator_time -> Timestamp, validator_time -> Timestamp,
show_bot_accounts -> Bool, show_bot_accounts -> Bool,
show_scores -> Bool, show_scores -> Bool,
show_read_posts -> Bool,
} }
} }

View file

@ -18,6 +18,7 @@ pub struct LocalUser {
pub validator_time: chrono::NaiveDateTime, pub validator_time: chrono::NaiveDateTime,
pub show_bot_accounts: bool, pub show_bot_accounts: bool,
pub show_scores: bool, pub show_scores: bool,
pub show_read_posts: bool,
} }
// TODO redo these, check table defaults // TODO redo these, check table defaults
@ -36,6 +37,7 @@ pub struct LocalUserForm {
pub send_notifications_to_email: Option<bool>, pub send_notifications_to_email: Option<bool>,
pub show_bot_accounts: Option<bool>, pub show_bot_accounts: Option<bool>,
pub show_scores: Option<bool>, pub show_scores: Option<bool>,
pub show_read_posts: Option<bool>,
} }
/// A local user view that removes password encrypted /// A local user view that removes password encrypted
@ -55,4 +57,5 @@ pub struct LocalUserSettings {
pub validator_time: chrono::NaiveDateTime, pub validator_time: chrono::NaiveDateTime,
pub show_bot_accounts: bool, pub show_bot_accounts: bool,
pub show_scores: bool, pub show_scores: bool,
pub show_read_posts: bool,
} }

View file

@ -165,8 +165,8 @@ pub struct PostQueryBuilder<'a> {
url_search: Option<String>, url_search: Option<String>,
show_nsfw: bool, show_nsfw: bool,
show_bot_accounts: bool, show_bot_accounts: bool,
show_read_posts: bool,
saved_only: bool, saved_only: bool,
unread_only: bool,
page: Option<i64>, page: Option<i64>,
limit: Option<i64>, limit: Option<i64>,
} }
@ -185,8 +185,8 @@ impl<'a> PostQueryBuilder<'a> {
url_search: None, url_search: None,
show_nsfw: true, show_nsfw: true,
show_bot_accounts: true, show_bot_accounts: true,
show_read_posts: true,
saved_only: false, saved_only: false,
unread_only: false,
page: None, page: None,
limit: None, limit: None,
} }
@ -242,6 +242,11 @@ impl<'a> PostQueryBuilder<'a> {
self self
} }
pub fn show_read_posts(mut self, show_read_posts: bool) -> Self {
self.show_read_posts = show_read_posts;
self
}
pub fn saved_only(mut self, saved_only: bool) -> Self { pub fn saved_only(mut self, saved_only: bool) -> Self {
self.saved_only = saved_only; self.saved_only = saved_only;
self self
@ -362,13 +367,12 @@ impl<'a> PostQueryBuilder<'a> {
query = query.filter(person::bot_account.eq(false)); query = query.filter(person::bot_account.eq(false));
}; };
// TODO These two might be wrong
if self.saved_only { if self.saved_only {
query = query.filter(post_saved::id.is_not_null()); query = query.filter(post_saved::id.is_not_null());
}; };
if self.unread_only { if !self.show_read_posts {
query = query.filter(post_read::id.is_not_null()); query = query.filter(post_read::id.is_null());
}; };
query = match self.sort { query = match self.sort {

View file

@ -231,11 +231,13 @@ fn get_feed_front(
let local_user = LocalUser::read(&conn, local_user_id)?; let local_user = LocalUser::read(&conn, local_user_id)?;
let person_id = local_user.person_id; let person_id = local_user.person_id;
let show_bot_accounts = local_user.show_bot_accounts; let show_bot_accounts = local_user.show_bot_accounts;
let show_read_posts = local_user.show_read_posts;
let posts = PostQueryBuilder::create(&conn) let posts = PostQueryBuilder::create(&conn)
.listing_type(&ListingType::Subscribed) .listing_type(&ListingType::Subscribed)
.my_person_id(person_id) .my_person_id(person_id)
.show_bot_accounts(show_bot_accounts) .show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.sort(sort_type) .sort(sort_type)
.list()?; .list()?;

View file

@ -0,0 +1 @@
alter table local_user drop column show_read_posts;

View file

@ -0,0 +1 @@
alter table local_user add column show_read_posts boolean default true not null;