@@ -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
0 commit comments