diff --git a/crates/app/src/macros.rs b/crates/app/src/macros.rs index 41ce0c4..7f69d24 100644 --- a/crates/app/src/macros.rs +++ b/crates/app/src/macros.rs @@ -224,3 +224,29 @@ macro_rules! check_user_blocked_or_private { } }; } + +#[macro_export] +macro_rules! ignore_users_gen { + ($user:ident, $data:ident) => { + if let Some(ref ua) = $user { + [ + $data.0.get_userblocks_receivers(ua.id).await, + $data.0.get_userblocks_initiator_by_receivers(ua.id).await, + ] + .concat() + } else { + Vec::new() + } + }; + + ($user:ident!, $data:ident) => { + [ + $data.0.get_userblocks_receivers($user.id).await, + $data + .0 + .get_userblocks_initiator_by_receivers($user.id) + .await, + ] + .concat() + }; +} diff --git a/crates/app/src/public/html/components.html b/crates/app/src/public/html/components.html index 06d0aea..938416b 100644 --- a/crates/app/src/public/html/components.html +++ b/crates/app/src/public/html/components.html @@ -1138,7 +1138,7 @@ show_kick=false, secondary=false) -%}
{{ self::full_username(user=user) }}
{{ self::user_status(other_user=user) }}
diff --git a/crates/app/src/routes/pages/chats.rs b/crates/app/src/routes/pages/chats.rs index 7c7f723..f3a00e0 100644 --- a/crates/app/src/routes/pages/chats.rs +++ b/crates/app/src/routes/pages/chats.rs @@ -157,7 +157,7 @@ pub async fn stream_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let membership = match data .0 @@ -322,7 +322,7 @@ pub async fn channels_request( }; let members = if community == 0 && channel.is_some() { - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let mut channel = channel.as_ref().unwrap().clone(); channel.members.insert(0, channel.owner); // include the owner in the members list (at the start) diff --git a/crates/app/src/routes/pages/communities.rs b/crates/app/src/routes/pages/communities.rs index 637500c..e78a90c 100644 --- a/crates/app/src/routes/pages/communities.rs +++ b/crates/app/src/routes/pages/communities.rs @@ -392,11 +392,7 @@ pub async fn feed_request( let (can_read, _) = check_permissions!(community, jar, data, user); // ... - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let feed = match data .0 @@ -494,11 +490,7 @@ pub async fn questions_request( let (can_read, _) = check_permissions!(community, jar, data, user); // ... - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let feed = match data .0 @@ -673,11 +665,7 @@ pub async fn post_request( Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), }; - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); // ... let owner = match data.0.get_user_by_id(post.owner).await { @@ -739,11 +727,7 @@ pub async fn post_request( } // ... - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let feed = match data.0.get_post_comments(post.id, 12, props.page).await { Ok(p) => match data.0.fill_posts(p, &ignore_users, &user).await { @@ -827,11 +811,7 @@ pub async fn reposts_request( Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), }; - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); // ... let owner = match data.0.get_user_by_id(post.owner).await { @@ -860,11 +840,7 @@ pub async fn reposts_request( } // ... - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let list = if props.quotes { match data @@ -973,7 +949,7 @@ pub async fn likes_request( Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); // ... let ua = Some(user.clone()); @@ -1015,7 +991,7 @@ pub async fn likes_request( } // ... - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match if user.permissions.check(FinePermission::MANAGE_REACTIONS) { // all reactions @@ -1213,11 +1189,7 @@ pub async fn question_request( } // ... - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let feed = match data .0 diff --git a/crates/app/src/routes/pages/misc.rs b/crates/app/src/routes/pages/misc.rs index d540e02..96f1a06 100644 --- a/crates/app/src/routes/pages/misc.rs +++ b/crates/app/src/routes/pages/misc.rs @@ -62,7 +62,7 @@ pub async fn index_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 @@ -97,11 +97,7 @@ pub async fn popular_request( let data = data.read().await; let user = get_user_from_token!(jar, data.0); - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let list = match data.0.get_popular_posts(12, req.page, 604_800_000).await { Ok(l) => match data @@ -144,7 +140,7 @@ pub async fn following_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 @@ -181,11 +177,7 @@ pub async fn all_request( let data = data.read().await; let user = get_user_from_token!(jar, data.0); - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let list = match data.0.get_latest_posts(12, req.page).await { Ok(l) => match data @@ -226,7 +218,7 @@ pub async fn index_questions_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 @@ -266,7 +258,7 @@ pub async fn popular_questions_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 @@ -308,7 +300,7 @@ pub async fn following_questions_request( } }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 @@ -343,11 +335,7 @@ pub async fn all_questions_request( let data = data.read().await; let user = get_user_from_token!(jar, data.0); - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let list = match data.0.get_latest_global_questions(12, req.page).await { Ok(l) => match data.0.fill_questions(l, &ignore_users).await { @@ -419,7 +407,7 @@ pub async fn requests_request( Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let questions = match data .0 @@ -533,7 +521,7 @@ pub async fn search_request( req.query = req.query.trim().replace(" ", " & "); // change spaces into & for tsquery - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = if req.query.is_empty() { Vec::new() diff --git a/crates/app/src/routes/pages/profile.rs b/crates/app/src/routes/pages/profile.rs index 80e935c..d006b3b 100644 --- a/crates/app/src/routes/pages/profile.rs +++ b/crates/app/src/routes/pages/profile.rs @@ -234,11 +234,7 @@ pub async fn posts_request( } // fetch data - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let posts = if props.tag.is_empty() { match data @@ -387,11 +383,7 @@ pub async fn replies_request( check_user_blocked_or_private!(user, other_user, data, jar); // fetch data - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let posts = match data .0 @@ -496,11 +488,7 @@ pub async fn media_request( check_user_blocked_or_private!(user, other_user, data, jar); // fetch data - let ignore_users = if let Some(ref ua) = user { - data.0.get_userblocks_receivers(ua.id).await - } else { - Vec::new() - }; + let ignore_users = crate::ignore_users_gen!(user, data); let posts = match data .0 diff --git a/crates/app/src/routes/pages/stacks.rs b/crates/app/src/routes/pages/stacks.rs index 52cb44d..2aff097 100644 --- a/crates/app/src/routes/pages/stacks.rs +++ b/crates/app/src/routes/pages/stacks.rs @@ -65,7 +65,7 @@ pub async fn posts_request( )); } - let ignore_users = data.0.get_userblocks_receivers(user.id).await; + let ignore_users = crate::ignore_users_gen!(user!, data); let list = match data .0 .get_stack_posts( diff --git a/crates/core/src/database/auth.rs b/crates/core/src/database/auth.rs index 924e32d..530a57b 100644 --- a/crates/core/src/database/auth.rs +++ b/crates/core/src/database/auth.rs @@ -706,7 +706,6 @@ impl DataManager { auto_method!(update_user_notification_count(i32)@get_user_by_id -> "UPDATE users SET notification_count = $1 WHERE id = $2" --cache-key-tmpl=cache_clear_user); auto_method!(incr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr); auto_method!(decr_user_notifications()@get_user_by_id -> "UPDATE users SET notification_count = notification_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=notification_count); - auto_method!(set_user_notifications(i32)@get_user_by_id -> "UPDATE users SET notification_count = $1 WHERE id = $2" --cache-key-tmpl=cache_clear_user); auto_method!(incr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count + 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --incr); auto_method!(decr_user_follower_count()@get_user_by_id -> "UPDATE users SET follower_count = follower_count - 1 WHERE id = $1" --cache-key-tmpl=cache_clear_user --decr=follower_count); diff --git a/crates/core/src/database/notifications.rs b/crates/core/src/database/notifications.rs index 3643276..2a23ee5 100644 --- a/crates/core/src/database/notifications.rs +++ b/crates/core/src/database/notifications.rs @@ -283,9 +283,10 @@ impl DataManager { // use changed_count to update user counts if read == false { // we don't need to update when marking things as read since that should just be 0 - self.set_user_notifications(user.id, changed_count).await?; + self.update_user_notification_count(user.id, changed_count) + .await?; } else { - self.set_user_notifications(user.id, 0).await?; + self.update_user_notification_count(user.id, 0).await?; } // ... diff --git a/crates/core/src/database/userblocks.rs b/crates/core/src/database/userblocks.rs index e42321b..5a2cc1f 100644 --- a/crates/core/src/database/userblocks.rs +++ b/crates/core/src/database/userblocks.rs @@ -143,6 +143,35 @@ impl DataManager { res.unwrap() } + /// Get the owner of all user blocks for the given `receiver`. + pub async fn get_userblocks_initiator_by_receivers(&self, receiver: usize) -> Vec { + let conn = match self.connect().await { + Ok(c) => c, + Err(_) => return Vec::new(), + }; + + let res = query_rows!( + &conn, + "SELECT * FROM userblocks WHERE receiver = $1", + &[&(receiver as i64)], + |x| { Self::get_userblock_from_row(x) } + ); + + if res.is_err() { + return Vec::new(); + } + + // get owner + let mut out: Vec = Vec::new(); + + for b in res.unwrap() { + out.push(b.initiator); + } + + // return + out + } + /// Create a new user block in the database. /// /// # Arguments