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