Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit 7e99c6c

Browse files
committed
refactor(notify): hooks for follow & test
1 parent 4c874e1 commit 7e99c6c

File tree

4 files changed

+88
-16
lines changed

4 files changed

+88
-16
lines changed

lib/groupher_server/accounts/delegates/fans.ex

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
77
import Helper.ErrorCode
88
import ShortMaps
99

10-
alias Helper.{ORM, QueryBuilder, SpecType}
10+
alias Helper.{ORM, QueryBuilder, Later, SpecType}
1111
alias GroupherServer.{Accounts, Repo}
1212

13-
alias GroupherServer.Accounts.Model.{User, Embeds, UserFollower, UserFollowing}
13+
alias Accounts.Model.{User, Embeds, UserFollower, UserFollowing}
14+
alias Accounts.Delegate.Hooks
1415

1516
alias Ecto.Multi
1617

@@ -20,27 +21,30 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
2021
follow a user
2122
"""
2223
@spec follow(User.t(), User.t()) :: {:ok, User.t()} | SpecType.gq_error()
23-
def follow(%User{id: user_id}, %User{id: follower_id}) do
24-
with true <- to_string(user_id) !== to_string(follower_id),
25-
{:ok, target_user} <- ORM.find(User, follower_id) do
24+
def follow(%User{} = user, %User{} = follower) do
25+
with true <- to_string(user.id) !== to_string(follower.id),
26+
{:ok, target_user} <- ORM.find(User, follower.id) do
2627
Multi.new()
2728
|> Multi.insert(
2829
:create_follower,
29-
UserFollower.changeset(%UserFollower{}, %{user_id: target_user.id, follower_id: user_id})
30+
UserFollower.changeset(%UserFollower{}, %{user_id: target_user.id, follower_id: user.id})
3031
)
3132
|> Multi.insert(
3233
:create_following,
3334
UserFollowing.changeset(%UserFollowing{}, %{
34-
user_id: user_id,
35+
user_id: user.id,
3536
following_id: target_user.id
3637
})
3738
)
3839
|> Multi.run(:update_user_follow_info, fn _, _ ->
39-
update_user_follow_info(target_user, user_id, :add)
40+
update_user_follow_info(target_user, user.id, :add)
4041
end)
4142
|> Multi.run(:add_achievement, fn _, _ ->
4243
Accounts.achieve(%User{id: target_user.id}, :inc, :follow)
4344
end)
45+
|> Multi.run(:after_hooks, fn _, _ ->
46+
Later.run({Hooks.Notify, :handle, [:follow, user, follower]})
47+
end)
4448
|> Repo.transaction()
4549
|> result()
4650
else
@@ -53,22 +57,25 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
5357
undo a follow action to a user
5458
"""
5559
@spec undo_follow(User.t(), User.t()) :: {:ok, User.t()} | SpecType.gq_error()
56-
def undo_follow(%User{id: user_id}, %User{id: follower_id}) do
57-
with true <- to_string(user_id) !== to_string(follower_id),
58-
{:ok, target_user} <- ORM.find(User, follower_id) do
60+
def undo_follow(%User{} = user, %User{} = follower) do
61+
with true <- to_string(user.id) !== to_string(follower.id),
62+
{:ok, target_user} <- ORM.find(User, follower.id) do
5963
Multi.new()
6064
|> Multi.run(:delete_follower, fn _, _ ->
61-
ORM.findby_delete!(UserFollower, %{user_id: target_user.id, follower_id: user_id})
65+
ORM.findby_delete!(UserFollower, %{user_id: target_user.id, follower_id: user.id})
6266
end)
6367
|> Multi.run(:delete_following, fn _, _ ->
64-
ORM.findby_delete!(UserFollowing, %{user_id: user_id, following_id: target_user.id})
68+
ORM.findby_delete!(UserFollowing, %{user_id: user.id, following_id: target_user.id})
6569
end)
6670
|> Multi.run(:update_user_follow_info, fn _, _ ->
67-
update_user_follow_info(target_user, user_id, :remove)
71+
update_user_follow_info(target_user, user.id, :remove)
6872
end)
6973
|> Multi.run(:minus_achievement, fn _, _ ->
7074
Accounts.achieve(%User{id: target_user.id}, :dec, :follow)
7175
end)
76+
|> Multi.run(:after_hooks, fn _, _ ->
77+
Later.run({Hooks.Notify, :handle, [:undo, :follow, user, follower]})
78+
end)
7279
|> Repo.transaction()
7380
|> result()
7481
else
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
defmodule GroupherServer.Accounts.Delegate.Hooks.Notify do
2+
@moduledoc """
3+
notify hooks, for upvote, collect, comment, reply
4+
"""
5+
alias GroupherServer.{Accounts, Delivery}
6+
alias Accounts.Model.User
7+
8+
# 发布评论是特殊情况,单独处理
9+
def handle(:follow, %User{} = user, %User{} = from_user) do
10+
notify_attrs = %{
11+
action: :follow,
12+
user_id: user.id
13+
}
14+
15+
Delivery.send(:notify, notify_attrs, from_user)
16+
end
17+
18+
def handle(:undo, :follow, %User{} = user, %User{} = from_user) do
19+
notify_attrs = %{
20+
action: :follow,
21+
user_id: user.id
22+
}
23+
24+
Delivery.revoke(:notify, notify_attrs, from_user)
25+
end
26+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
defmodule GroupherServer.Test.Accounts.Hooks.Notify do
2+
use GroupherServer.TestTools
3+
4+
import GroupherServer.CMS.Delegate.Helper, only: [preload_author: 1]
5+
6+
alias GroupherServer.{Accounts, Delivery}
7+
alias Accounts.Delegate.Hooks
8+
9+
setup do
10+
{:ok, user} = db_insert(:user)
11+
{:ok, user2} = db_insert(:user)
12+
13+
{:ok, ~m(user user2 )a}
14+
end
15+
16+
describe "[follow notify]" do
17+
@tag :wip
18+
test "follow notify hook should work", ~m(user user2)a do
19+
{:ok, _} = Accounts.follow(user, user2)
20+
Hooks.Notify.handle(:follow, user, user2)
21+
22+
{:ok, notifications} = Delivery.fetch(:notification, user.id, %{page: 1, size: 20})
23+
assert notifications.total_count == 1
24+
25+
notify = notifications.entries |> List.first()
26+
assert notify.action == "FOLLOW"
27+
assert notify.user_id == user.id
28+
assert user_exist_in?(user2, notify.from_users)
29+
end
30+
31+
@tag :wip
32+
test "undo follow notify hook should work", ~m(user user2)a do
33+
{:ok, _} = Accounts.follow(user, user2)
34+
Hooks.Notify.handle(:follow, user, user2)
35+
Hooks.Notify.handle(:undo, :follow, user, user2)
36+
37+
{:ok, notifications} = Delivery.fetch(:notification, user.id, %{page: 1, size: 20})
38+
assert notifications.total_count == 0
39+
end
40+
end
41+
end

test/groupher_server/delivery/notification_test.exs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ defmodule GroupherServer.Test.Delivery.Notification do
4040
end
4141

4242
describe "account follow" do
43-
@tag :wip
4443
test "support follow action", ~m(user user2)a do
4544
notify_attrs = %{
4645
action: :follow,
@@ -59,7 +58,6 @@ defmodule GroupherServer.Test.Delivery.Notification do
5958
assert user2 |> user_exist_in?(notify.from_users)
6059
end
6160

62-
@tag :wip
6361
test "similar follow notify should be merged", ~m(user user2 user3)a do
6462
notify_attrs = %{
6563
action: :follow,

0 commit comments

Comments
 (0)