default_listing_type,
lang: data.lang.to_owned(),
show_avatars: data.show_avatars,
+ show_read_posts: data.show_read_posts,
send_notifications_to_email: data.send_notifications_to_email,
};
check_downvotes_enabled,
get_local_user_view_from_jwt,
is_mod_or_admin,
+ mark_post_as_read,
post::*,
};
use lemmy_apub::{ApubLikeableType, ApubObjectType};
.await?;
}
+ // Mark the post as read
+ mark_post_as_read(person_id, post_id, context.pool()).await?;
+
let post_id = data.post_id;
let person_id = local_user_view.person.id;
let post_view = blocking(context.pool(), move |conn| {
})
.await??;
+ // Mark the post as read
+ mark_post_as_read(person_id, post_id, context.pool()).await?;
+
Ok(PostResponse { post_view })
}
}
get_local_user_view_from_jwt_opt,
is_admin,
site::*,
- user_show_bot_accounts,
- user_show_nsfw,
};
use lemmy_apub::fetcher::search::search_by_apub_id;
use lemmy_db_queries::{
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
- let show_nsfw = user_show_nsfw(&local_user_view);
- let show_bot_accounts = user_show_bot_accounts(&local_user_view);
+ let show_nsfw = local_user_view.as_ref().map(|t| t.local_user.show_nsfw);
+ let show_bot_accounts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_bot_accounts);
+ let show_read_posts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_read_posts);
let person_id = local_user_view.map(|u| u.person.id);
.sort(sort)
.show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.listing_type(listing_type)
.community_id(community_id)
.community_name(community_name)
.sort(sort)
.show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.listing_type(listing_type)
.community_id(community_id)
.community_name(community_name)
.sort(sort)
.show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.listing_type(listing_type)
.my_person_id(person_id)
.community_id(community_id)
},
Crud,
DbPool,
+ Readable,
};
use lemmy_db_schema::{
source::{
community::{Community, CommunityModerator},
person::Person,
person_mention::{PersonMention, PersonMentionForm},
- post::Post,
+ post::{Post, PostRead, PostReadForm},
site::Site,
},
CommunityId,
Ok(())
}
-/// A helper method for showing the bot account
-pub fn user_show_bot_accounts(local_user_view: &Option<LocalUserView>) -> bool {
- match local_user_view {
- Some(uv) => uv.to_owned().local_user.show_bot_accounts,
- None => true,
- }
-}
-
-/// A helper method for showing nsfw
-pub fn user_show_nsfw(local_user_view: &Option<LocalUserView>) -> bool {
- match &local_user_view {
- Some(uv) => uv.local_user.show_nsfw,
- None => false,
- }
-}
-
pub async fn get_post(post_id: PostId, pool: &DbPool) -> Result<Post, LemmyError> {
blocking(pool, move |conn| Post::read(conn, post_id))
.await?
.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(
jwt: &str,
pool: &DbPool,
pub send_notifications_to_email: Option<bool>,
pub bot_account: Option<bool>,
pub show_bot_accounts: Option<bool>,
+ pub show_read_posts: Option<bool>,
pub auth: String,
}
use crate::PerformCrud;
use actix_web::web::Data;
-use lemmy_api_common::{
- blocking,
- comment::*,
- get_local_user_view_from_jwt_opt,
- user_show_bot_accounts,
-};
+use lemmy_api_common::{blocking, comment::*, get_local_user_view_from_jwt_opt};
use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
use lemmy_db_views::comment_view::CommentQueryBuilder;
use lemmy_utils::{ApiError, ConnectionId, LemmyError};
let data: &GetComments = &self;
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
- let show_bot_accounts = user_show_bot_accounts(&local_user_view);
+ let show_bot_accounts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_bot_accounts);
let person_id = local_user_view.map(|u| u.person.id);
let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
use crate::PerformCrud;
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_db_queries::{source::post::Post_, Crud, Likeable};
use lemmy_db_schema::source::post::*;
.await?;
// 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 {
- post_id: inserted_post.id,
- person_id: local_user_view.person.id,
+ post_id,
+ person_id,
score: 1,
};
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
.send_like(&local_user_view.person, context)
.await?;
use crate::PerformCrud;
use actix_web::web::Data;
-use lemmy_api_common::{
- blocking,
- get_local_user_view_from_jwt_opt,
- post::*,
- user_show_bot_accounts,
- user_show_nsfw,
-};
+use lemmy_api_common::{blocking, get_local_user_view_from_jwt_opt, mark_post_as_read, post::*};
use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
use lemmy_db_views::{
comment_view::CommentQueryBuilder,
let data: &GetPost = &self;
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
- let show_bot_accounts = user_show_bot_accounts(&local_user_view);
-
+ let show_bot_accounts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_bot_accounts);
let person_id = local_user_view.map(|u| u.person.id);
let id = data.id;
.await?
.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 comments = blocking(context.pool(), move |conn| {
CommentQueryBuilder::create(conn)
let person_id = local_user_view.to_owned().map(|l| l.person.id);
- let show_nsfw = user_show_nsfw(&local_user_view);
- let show_bot_accounts = user_show_bot_accounts(&local_user_view);
+ let show_nsfw = local_user_view.as_ref().map(|t| t.local_user.show_nsfw);
+ let show_bot_accounts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_bot_accounts);
+ let show_read_posts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_read_posts);
let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
.sort(sort)
.show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.community_id(community_id)
.community_name(community_name)
.saved_only(saved_only)
lang: Some("browser".into()),
show_avatars: Some(true),
show_scores: Some(true),
+ show_read_posts: Some(true),
send_notifications_to_email: Some(false),
};
use crate::PerformCrud;
use actix_web::web::Data;
-use lemmy_api_common::{
- blocking,
- get_local_user_view_from_jwt_opt,
- person::*,
- user_show_bot_accounts,
- user_show_nsfw,
-};
+use lemmy_api_common::{blocking, get_local_user_view_from_jwt_opt, person::*};
use lemmy_db_queries::{from_opt_str_to_opt_enum, source::person::Person_, SortType};
use lemmy_db_schema::source::person::*;
use lemmy_db_views::{comment_view::CommentQueryBuilder, post_view::PostQueryBuilder};
let data: &GetPersonDetails = &self;
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
- let show_nsfw = user_show_nsfw(&local_user_view);
- let show_bot_accounts = user_show_bot_accounts(&local_user_view);
+ let show_nsfw = local_user_view.as_ref().map(|t| t.local_user.show_nsfw);
+ let show_bot_accounts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_bot_accounts);
+ let show_read_posts = local_user_view
+ .as_ref()
+ .map(|t| t.local_user.show_read_posts);
let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
.sort(sort)
.show_nsfw(show_nsfw)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.saved_only(saved_only)
.community_id(community_id)
.my_person_id(person_id)
validator_time,
show_bot_accounts,
show_scores,
+ show_read_posts,
);
impl ToSafeSettings for LocalUser {
validator_time,
show_bot_accounts,
show_scores,
+ show_read_posts,
)
}
}
use lemmy_db_schema::schema::post_read::dsl::*;
insert_into(post_read)
.values(post_read_form)
+ .on_conflict((post_id, person_id))
+ .do_update()
+ .set(post_read_form)
.get_result::<Self>(conn)
}
validator_time -> Timestamp,
show_bot_accounts -> Bool,
show_scores -> Bool,
+ show_read_posts -> Bool,
}
}
pub validator_time: chrono::NaiveDateTime,
pub show_bot_accounts: bool,
pub show_scores: bool,
+ pub show_read_posts: bool,
}
// TODO redo these, check table defaults
pub send_notifications_to_email: Option<bool>,
pub show_bot_accounts: Option<bool>,
pub show_scores: Option<bool>,
+ pub show_read_posts: Option<bool>,
}
/// A local user view that removes password encrypted
pub validator_time: chrono::NaiveDateTime,
pub show_bot_accounts: bool,
pub show_scores: bool,
+ pub show_read_posts: bool,
}
url_search: Option<String>,
show_nsfw: Option<bool>,
show_bot_accounts: Option<bool>,
+ show_read_posts: Option<bool>,
saved_only: Option<bool>,
- unread_only: Option<bool>,
page: Option<i64>,
limit: Option<i64>,
}
url_search: None,
show_nsfw: None,
show_bot_accounts: None,
+ show_read_posts: None,
saved_only: None,
- unread_only: None,
page: None,
limit: None,
}
self
}
+ pub fn show_read_posts<T: MaybeOptional<bool>>(mut self, show_read_posts: T) -> Self {
+ self.show_read_posts = show_read_posts.get_optional();
+ self
+ }
+
pub fn saved_only<T: MaybeOptional<bool>>(mut self, saved_only: T) -> Self {
self.saved_only = saved_only.get_optional();
self
query = query.filter(person::bot_account.eq(false));
};
- if self.saved_only.unwrap_or(false) {
- query = query.filter(post_saved::id.is_not_null());
+ if !self.show_read_posts.unwrap_or(true) {
+ query = query.filter(post_read::id.is_null());
};
- if self.unread_only.unwrap_or(false) {
- query = query.filter(post_read::id.is_not_null());
+ if self.saved_only.unwrap_or(false) {
+ query = query.filter(post_saved::id.is_not_null());
};
query = match self.sort.unwrap_or(SortType::Hot) {
let local_user = LocalUser::read(&conn, local_user_id)?;
let person_id = local_user.person_id;
let show_bot_accounts = local_user.show_bot_accounts;
+ let show_read_posts = local_user.show_read_posts;
let posts = PostQueryBuilder::create(&conn)
.listing_type(ListingType::Subscribed)
.my_person_id(person_id)
.show_bot_accounts(show_bot_accounts)
+ .show_read_posts(show_read_posts)
.sort(*sort_type)
.list()?;
--- /dev/null
+alter table local_user drop column show_read_posts;
--- /dev/null
+alter table local_user add column show_read_posts boolean default true not null;