Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add user setting to auto-mark fetched posts as read. #5160

Merged
merged 17 commits into from
Nov 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .woodpecker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,6 @@ steps:
- diff tmp.schema crates/db_schema/src/schema.rs
when: *slow_check_paths

check_db_perf_tool:
image: *rust_image
environment:
LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
RUST_BACKTRACE: "1"
CARGO_HOME: .cargo_home
commands:
# same as scripts/db_perf.sh but without creating a new database server
- cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1
when: *slow_check_paths

cargo_clippy:
image: *rust_image
environment:
Expand Down Expand Up @@ -221,6 +210,17 @@ steps:
- diff before.sqldump after.sqldump
when: *slow_check_paths

check_db_perf_tool:
image: *rust_image
environment:
LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
RUST_BACKTRACE: "1"
CARGO_HOME: .cargo_home
commands:
# same as scripts/db_perf.sh but without creating a new database server
- cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1
when: *slow_check_paths

run_federation_tests:
image: node:22-bookworm-slim
environment:
Expand Down
1 change: 1 addition & 0 deletions crates/api/src/local_user/save_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ pub async fn save_user_settings(
enable_animated_images: data.enable_animated_images,
enable_private_messages: data.enable_private_messages,
collapse_bot_comments: data.collapse_bot_comments,
auto_mark_fetched_posts_as_read: data.auto_mark_fetched_posts_as_read,
..Default::default()
};

Expand Down
13 changes: 4 additions & 9 deletions crates/api/src/post/like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,12 @@ use lemmy_api_common::{
context::LemmyContext,
post::{CreatePostLike, PostResponse},
send_activity::{ActivityChannel, SendActivityData},
utils::{
check_bot_account,
check_community_user_action,
check_local_vote_mode,
mark_post_as_read,
VoteItem,
},
utils::{check_bot_account, check_community_user_action, check_local_vote_mode, VoteItem},
};
use lemmy_db_schema::{
source::{
local_site::LocalSite,
post::{PostLike, PostLikeForm},
post::{PostLike, PostLikeForm, PostRead},
},
traits::Likeable,
};
Expand Down Expand Up @@ -72,7 +66,8 @@ pub async fn like_post(
.with_lemmy_type(LemmyErrorType::CouldntLikePost)?;
}

mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
// Mark Post Read
PostRead::mark_as_read(&mut context.pool(), post_id, person_id).await?;

ActivityChannel::submit_activity(
SendActivityData::LikePostOrComment {
Expand Down
10 changes: 3 additions & 7 deletions crates/api/src/post/mark_read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use lemmy_api_common::{
};
use lemmy_db_schema::source::post::PostRead;
use lemmy_db_views::structs::{LocalUserView, PostView};
use lemmy_utils::error::{LemmyErrorExt, LemmyErrorType, LemmyResult};
use lemmy_utils::error::LemmyResult;

#[tracing::instrument(skip(context))]
pub async fn mark_post_as_read(
Expand All @@ -18,13 +18,9 @@ pub async fn mark_post_as_read(

// Mark the post as read / unread
if data.read {
PostRead::mark_as_read(&mut context.pool(), post_id, person_id)
.await
.with_lemmy_type(LemmyErrorType::CouldntMarkPostAsRead)?;
PostRead::mark_as_read(&mut context.pool(), post_id, person_id).await?;
} else {
PostRead::mark_as_unread(&mut context.pool(), post_id, person_id)
.await
.with_lemmy_type(LemmyErrorType::CouldntMarkPostAsRead)?;
PostRead::mark_as_unread(&mut context.pool(), post_id, person_id).await?;
}
let post_view = PostView::read(
&mut context.pool(),
Expand Down
5 changes: 2 additions & 3 deletions crates/api/src/post/save.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ use actix_web::web::{Data, Json};
use lemmy_api_common::{
context::LemmyContext,
post::{PostResponse, SavePost},
utils::mark_post_as_read,
};
use lemmy_db_schema::{
source::post::{PostSaved, PostSavedForm},
source::post::{PostRead, PostSaved, PostSavedForm},
traits::Saveable,
};
use lemmy_db_views::structs::{LocalUserView, PostView};
Expand Down Expand Up @@ -42,7 +41,7 @@ pub async fn save_post(
)
.await?;

mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
PostRead::mark_as_read(&mut context.pool(), post_id, person_id).await?;

Ok(Json(PostResponse { post_view }))
}
3 changes: 3 additions & 0 deletions crates/api_common/src/person.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,9 @@ pub struct SaveUserSettings {
pub show_downvotes: Option<bool>,
#[cfg_attr(feature = "full", ts(optional))]
pub show_upvote_percentage: Option<bool>,
/// Whether to automatically mark fetched posts as read.
#[cfg_attr(feature = "full", ts(optional))]
pub auto_mark_fetched_posts_as_read: Option<bool>,
}

#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)]
Expand Down
3 changes: 3 additions & 0 deletions crates/api_common/src/post.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ pub struct GetPosts {
/// If true, then show the nsfw posts (even if your user setting is to hide them)
#[cfg_attr(feature = "full", ts(optional))]
pub show_nsfw: Option<bool>,
/// Whether to automatically mark fetched posts as read.
#[cfg_attr(feature = "full", ts(optional))]
pub mark_as_read: Option<bool>,
#[cfg_attr(feature = "full", ts(optional))]
/// If true, then only show posts with no comments
pub no_comments_only: Option<bool>,
Expand Down
15 changes: 1 addition & 14 deletions crates/api_common/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use lemmy_db_schema::{
password_reset_request::PasswordResetRequest,
person::{Person, PersonUpdateForm},
person_block::PersonBlock,
post::{Post, PostLike, PostRead},
post::{Post, PostLike},
registration_application::RegistrationApplication,
site::Site,
},
Expand Down Expand Up @@ -141,19 +141,6 @@ pub fn is_top_mod(
}
}

/// Marks a post as read for a given person.
#[tracing::instrument(skip_all)]
pub async fn mark_post_as_read(
person_id: PersonId,
post_id: PostId,
pool: &mut DbPool<'_>,
) -> LemmyResult<()> {
PostRead::mark_as_read(pool, post_id, person_id)
.await
.with_lemmy_type(LemmyErrorType::CouldntMarkPostAsRead)?;
Ok(())
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of these changes are boilerplate, because I've gotten rid of this pointless wrapper function, by having PostRead::mark_as_read return the correct LemmyError.

}

/// Updates the read comment count for a post. Usually done when reading or creating a new comment.
#[tracing::instrument(skip_all)]
pub async fn update_read_comments(
Expand Down
5 changes: 2 additions & 3 deletions crates/api_crud/src/post/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ use lemmy_api_common::{
get_url_blocklist,
honeypot_check,
local_site_to_slur_regex,
mark_post_as_read,
process_markdown_opt,
},
};
Expand All @@ -21,7 +20,7 @@ use lemmy_db_schema::{
source::{
community::Community,
local_site::LocalSite,
post::{Post, PostInsertForm, PostLike, PostLikeForm},
post::{Post, PostInsertForm, PostLike, PostLikeForm, PostRead},
},
traits::{Crud, Likeable},
utils::diesel_url_create,
Expand Down Expand Up @@ -153,7 +152,7 @@ pub async fn create_post(
.await
.with_lemmy_type(LemmyErrorType::CouldntLikePost)?;

mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
PostRead::mark_as_read(&mut context.pool(), post_id, person_id).await?;

build_post_response(&context, community_id, local_user_view, post_id).await
}
Expand Down
9 changes: 6 additions & 3 deletions crates/api_crud/src/post/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ use actix_web::web::{Data, Json, Query};
use lemmy_api_common::{
context::LemmyContext,
post::{GetPost, GetPostResponse},
utils::{check_private_instance, is_mod_or_admin_opt, mark_post_as_read, update_read_comments},
utils::{check_private_instance, is_mod_or_admin_opt, update_read_comments},
};
use lemmy_db_schema::{
source::{comment::Comment, post::Post},
source::{
comment::Comment,
post::{Post, PostRead},
},
traits::Crud,
};
use lemmy_db_views::{
Expand Down Expand Up @@ -62,7 +65,7 @@ pub async fn get_post(

let post_id = post_view.post.id;
if let Some(person_id) = person_id {
mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
PostRead::mark_as_read(&mut context.pool(), post_id, person_id).await?;

update_read_comments(
person_id,
Expand Down
19 changes: 18 additions & 1 deletion crates/apub/src/api/list_posts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ use lemmy_api_common::{
post::{GetPosts, GetPostsResponse},
utils::{check_conflicting_like_filters, check_private_instance},
};
use lemmy_db_schema::source::community::Community;
use lemmy_db_schema::{
newtypes::PostId,
source::{community::Community, post::PostRead},
};
use lemmy_db_views::{
post_view::PostQuery,
structs::{LocalUserView, PaginationCursor, SiteView},
Expand Down Expand Up @@ -90,6 +93,20 @@ pub async fn list_posts(
.await
.with_lemmy_type(LemmyErrorType::CouldntGetPosts)?;

// If in their user settings (or as part of the API request), auto-mark fetched posts as read
if let Some(local_user) = local_user {
if data
.mark_as_read
.unwrap_or(local_user.auto_mark_fetched_posts_as_read)
{
let post_ids = posts.iter().map(|p| p.post.id).collect::<Vec<PostId>>();
// TODO get rid of this in the next pr
for post_id in post_ids {
PostRead::mark_as_read(&mut context.pool(), post_id, local_user.person_id).await?;
}
}
}
dessalines marked this conversation as resolved.
Show resolved Hide resolved

// if this page wasn't empty, then there is a next page after the last post on this page
let next_page = posts.last().map(PaginationCursor::after_post);
Ok(Json(GetPostsResponse { posts, next_page }))
Expand Down
7 changes: 5 additions & 2 deletions crates/db_schema/src/impls/post.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ use diesel::{
TextExpressionMethods,
};
use diesel_async::RunQueryDsl;
use lemmy_utils::error::{LemmyErrorExt, LemmyErrorType, LemmyResult};

#[async_trait]
impl Crud for Post {
Expand Down Expand Up @@ -336,7 +337,7 @@ impl PostRead {
pool: &mut DbPool<'_>,
post_id: PostId,
person_id: PersonId,
) -> Result<usize, Error> {
) -> LemmyResult<usize> {
let conn = &mut get_conn(pool).await?;

let form = (
Expand All @@ -351,13 +352,14 @@ impl PostRead {
.set(form)
.execute(conn)
.await
.with_lemmy_type(LemmyErrorType::CouldntMarkPostAsRead)
}

pub async fn mark_as_unread(
pool: &mut DbPool<'_>,
post_id_: PostId,
person_id_: PersonId,
) -> Result<uplete::Count, Error> {
) -> LemmyResult<uplete::Count> {
let conn = &mut get_conn(pool).await?;

uplete::new(
Expand All @@ -368,6 +370,7 @@ impl PostRead {
.set_null(post_actions::read)
.get_result(conn)
.await
.with_lemmy_type(LemmyErrorType::CouldntMarkPostAsRead)
}
}

Expand Down
1 change: 1 addition & 0 deletions crates/db_schema/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ diesel::table! {
enable_private_messages -> Bool,
collapse_bot_comments -> Bool,
default_comment_sort_type -> CommentSortTypeEnum,
auto_mark_fetched_posts_as_read -> Bool,
}
}

Expand Down
5 changes: 5 additions & 0 deletions crates/db_schema/src/source/local_user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ pub struct LocalUser {
/// Whether to auto-collapse bot comments.
pub collapse_bot_comments: bool,
pub default_comment_sort_type: CommentSortType,
/// Whether to automatically mark fetched posts as read.
pub auto_mark_fetched_posts_as_read: bool,
}

#[derive(Clone, derive_new::new)]
Expand Down Expand Up @@ -124,6 +126,8 @@ pub struct LocalUserInsertForm {
pub collapse_bot_comments: Option<bool>,
#[new(default)]
pub default_comment_sort_type: Option<CommentSortType>,
#[new(default)]
pub auto_mark_fetched_posts_as_read: Option<bool>,
}

#[derive(Clone, Default)]
Expand Down Expand Up @@ -155,4 +159,5 @@ pub struct LocalUserUpdateForm {
pub enable_private_messages: Option<bool>,
pub collapse_bot_comments: Option<bool>,
pub default_comment_sort_type: Option<CommentSortType>,
pub auto_mark_fetched_posts_as_read: Option<bool>,
}
1 change: 1 addition & 0 deletions crates/db_views/src/registration_application_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ mod tests {
enable_animated_images: inserted_sara_local_user.enable_animated_images,
enable_private_messages: inserted_sara_local_user.enable_private_messages,
collapse_bot_comments: inserted_sara_local_user.collapse_bot_comments,
auto_mark_fetched_posts_as_read: false,
},
creator: Person {
id: inserted_sara_person.id,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE local_user
DROP COLUMN auto_mark_fetched_posts_as_read;
dessalines marked this conversation as resolved.
Show resolved Hide resolved

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE local_user
ADD COLUMN auto_mark_fetched_posts_as_read boolean DEFAULT FALSE NOT NULL;