The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+## Unreleased
+
+## Changes
+- Follows no longer override domain blocks, a domain block is final
+
## 2022.10
### Added
end)
end
- @doc """
- For a query with joined activity,
- keeps rows where activity's actor is followed by user -or- is NOT domain-blocked by user.
- """
- def keep_following_or_not_domain_blocked(query, user) do
- where(
- query,
- [_, activity],
- fragment(
- # "(actor's domain NOT in domain_blocks) OR (actor IS in followed AP IDs)"
- """
- NOT (substring(? from '.*://([^/]*)') = ANY(?)) OR
- ? = ANY(SELECT ap_id FROM users AS u INNER JOIN following_relationships AS fr
- ON u.id = fr.following_id WHERE fr.follower_id = ? AND fr.state = ?)
- """,
- activity.actor,
- ^user.domain_blocks,
- activity.actor,
- ^User.binary_id(user.id),
- ^accept_state_code()
- )
- )
- end
-
defp validate_not_self_relationship(%Changeset{} = changeset) do
changeset
|> validate_follower_id_following_id_inequality()
query
|> where([n, a], a.actor not in ^blocked_ap_ids)
- |> FollowingRelationship.keep_following_or_not_domain_blocked(user)
+ |> restrict_domain_blocked(user)
+ end
+
+ defp restrict_domain_blocked(query, user) do
+ where(
+ query,
+ [_, activity],
+ fragment(
+ # "(actor's domain NOT in domain_blocks)"
+ """
+ NOT (
+ substring(? from '.*://([^/]*)') = ANY(?)
+ )
+ """,
+ activity.actor,
+ ^user.domain_blocks
+ )
+ )
end
defp exclude_blockers(query, user) do
def get_notifications(user, params \\ %{}) do
options = cast_params(params)
- user
- |> Notification.for_user_query(options)
- |> restrict(:include_types, options)
- |> restrict(:exclude_types, options)
- |> restrict(:account_ap_id, options)
+ query =
+ user
+ |> Notification.for_user_query(options)
+ |> restrict(:include_types, options)
+ |> restrict(:exclude_types, options)
+ |> restrict(:account_ap_id, options)
+
+ IO.inspect(Pleroma.Repo.to_sql(:all, query))
+
+ query
|> Pagination.fetch_paginated(params)
end
assert Notification.for_user(user) == []
end
- test "it returns notifications for domain-blocked but followed user" do
- user = insert(:user)
- blocked = insert(:user, ap_id: "http://some-domain.com")
-
- {:ok, user} = User.block_domain(user, "some-domain.com")
- {:ok, _, _} = User.follow(user, blocked)
-
- {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"})
-
- assert length(Notification.for_user(user)) == 1
- end
-
test "it doesn't return notifications for muted thread", %{user: user} do
another_user = insert(:user)