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

Commit 916fd52

Browse files
committed
refactor(user): follow count move to table
1 parent bb6055d commit 916fd52

File tree

7 files changed

+55
-51
lines changed

7 files changed

+55
-51
lines changed

lib/groupher_server/accounts/delegates/fans.ex

+23-19
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
3535
following_id: target_user.id
3636
})
3737
)
38-
|> Multi.run(:update_user_meta, fn _, _ ->
39-
update_follow_meta(target_user, user_id, :add)
38+
|> Multi.run(:update_user_follow_info, fn _, _ ->
39+
update_user_follow_info(target_user, user_id, :add)
4040
end)
4141
|> Multi.run(:add_achievement, fn _, _ ->
4242
Accounts.achieve(%User{id: target_user.id}, :inc, :follow)
@@ -63,8 +63,8 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
6363
|> Multi.run(:delete_following, fn _, _ ->
6464
ORM.findby_delete!(UserFollowing, %{user_id: user_id, following_id: target_user.id})
6565
end)
66-
|> Multi.run(:update_user_meta, fn _, _ ->
67-
update_follow_meta(target_user, user_id, :remove)
66+
|> Multi.run(:update_user_follow_info, fn _, _ ->
67+
update_user_follow_info(target_user, user_id, :remove)
6868
end)
6969
|> Multi.run(:minus_achievement, fn _, _ ->
7070
Accounts.achieve(%User{id: target_user.id}, :dec, :follow)
@@ -78,31 +78,35 @@ defmodule GroupherServer.Accounts.Delegate.Fans do
7878
end
7979

8080
# update follow in user meta
81-
defp update_follow_meta(%User{} = target_user, user_id, opt) do
81+
defp update_user_follow_info(%User{} = target_user, user_id, opt) do
8282
with {:ok, user} <- ORM.find(User, user_id) do
8383
target_user_meta = ensure(target_user.meta, @default_user_meta)
8484
user_meta = ensure(user.meta, @default_user_meta)
8585

86+
follower_user_ids =
87+
case opt do
88+
:add -> (target_user_meta.follower_user_ids ++ [user_id]) |> Enum.uniq()
89+
:remove -> (target_user_meta.follower_user_ids -- [user_id]) |> Enum.uniq()
90+
end
91+
92+
following_user_ids =
93+
case opt do
94+
:add -> (user_meta.following_user_ids ++ [target_user.id]) |> Enum.uniq()
95+
:remove -> (user_meta.following_user_ids -- [target_user.id]) |> Enum.uniq()
96+
end
97+
8698
Multi.new()
8799
|> Multi.run(:update_follower_meta, fn _, _ ->
88-
follower_user_ids =
89-
case opt do
90-
:add -> target_user_meta.follower_user_ids ++ [user_id]
91-
:remove -> target_user_meta.follower_user_ids -- [user_id]
92-
end
93-
100+
followers_count = length(follower_user_ids)
94101
meta = Map.merge(target_user_meta, %{follower_user_ids: follower_user_ids})
95-
ORM.update_meta(target_user, meta)
102+
103+
ORM.update_meta(target_user, meta, changes: %{followers_count: followers_count})
96104
end)
97105
|> Multi.run(:update_following_meta, fn _, _ ->
98-
following_user_ids =
99-
case opt do
100-
:add -> user_meta.following_user_ids ++ [target_user.id]
101-
:remove -> user_meta.following_user_ids -- [target_user.id]
102-
end
103-
106+
followings_count = length(following_user_ids)
104107
meta = Map.merge(user_meta, %{following_user_ids: following_user_ids})
105-
ORM.update_meta(user, meta)
108+
109+
ORM.update_meta(user, meta, changes: %{followings_count: followings_count})
106110
end)
107111
|> Repo.transaction()
108112
|> result()

lib/groupher_server/accounts/helper/loader.ex

-19
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ defmodule GroupherServer.Accounts.Helper.Loader do
77
alias Helper.QueryBuilder
88
alias GroupherServer.{Accounts, CMS, Repo}
99

10-
alias Accounts.{UserFollower, UserFollowing}
11-
1210
def data, do: Dataloader.Ecto.new(Repo, query: &query/2)
1311

1412
def query({"communities_subscribers", CMS.CommunitySubscriber}, %{count: _}) do
@@ -24,23 +22,6 @@ defmodule GroupherServer.Accounts.Helper.Loader do
2422
|> select([u, c], c)
2523
end
2624

27-
# TODO: fix later, this is not working
28-
def query({"users_followers", UserFollower}, %{count: _}) do
29-
UserFollower
30-
|> group_by([f], f.user_id)
31-
|> select([f], count(f.follower_id))
32-
end
33-
34-
def query({"users_followings", UserFollowing}, %{count: _}) do
35-
UserFollowing
36-
|> group_by([f], f.user_id)
37-
|> select([f], count(f.id))
38-
end
39-
40-
def query({"users_followers", UserFollower}, %{viewer_did: _, cur_user: cur_user}) do
41-
UserFollower |> where([f], f.follower_id == ^cur_user.id)
42-
end
43-
4425
def query(queryable, _args), do: queryable
4526

4627
defp count_contents(queryable) do

lib/groupher_server/accounts/user.ex

+3
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ defmodule GroupherServer.Accounts.User do
6868
# Ta 关注了你
6969
field(:viewer_been_followed, :boolean, default: false, virtual: true)
7070

71+
field(:followings_count, :integer, default: 0)
72+
field(:followers_count, :integer, default: 0)
73+
7174
embeds_one(:meta, Embeds.UserMeta, on_replace: :update)
7275
embeds_one(:contributes, Embeds.UserContribute, on_replace: :update)
7376

lib/groupher_server_web/schema/account/account_types.ex

+2-12
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,10 @@ defmodule GroupherServerWeb.Schema.Account.Types do
9393
end
9494

9595
@desc "get follower users count"
96-
field :followers_count, :integer do
97-
arg(:count, :count_type, default_value: :count)
98-
99-
resolve(dataloader(Accounts, :followers))
100-
middleware(M.ConvertToInt)
101-
end
96+
field(:followers_count, :integer)
10297

10398
@desc "get following users count"
104-
field :followings_count, :integer do
105-
arg(:count, :count_type, default_value: :count)
106-
107-
resolve(dataloader(Accounts, :followings))
108-
middleware(M.ConvertToInt)
109-
end
99+
field(:followings_count, :integer)
110100

111101
@desc "if viewer has followed"
112102
field(:viewer_has_followed, :boolean)

lib/helper/orm.ex

+9
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,15 @@ defmodule Helper.ORM do
265265
@doc """
266266
update meta info for article / comment
267267
"""
268+
def update_meta(queryable, meta, changes: changes) when is_map(changes) do
269+
meta = meta |> strip_struct
270+
271+
queryable
272+
|> Ecto.Changeset.change(changes)
273+
|> Ecto.Changeset.put_embed(:meta, meta)
274+
|> Repo.update()
275+
end
276+
268277
def update_meta(queryable, meta) do
269278
meta = meta |> strip_struct
270279

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
defmodule GroupherServer.Repo.Migrations.MoveFollowCountToUsers do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:users) do
6+
add(:followings_count, :integer)
7+
add(:followers_count, :integer)
8+
end
9+
end
10+
end

test/groupher_server/accounts/fans_test.exs

+8-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ defmodule GroupherServer.Test.Accounts.Fans do
2222
assert found |> Map.get(:followers) |> length == 1
2323
end
2424

25-
@tag :wip
25+
@tag :wip2
2626
test "follow user should update follow meta info", ~m(user)a do
2727
{:ok, user2} = db_insert(:user)
2828

@@ -31,6 +31,9 @@ defmodule GroupherServer.Test.Accounts.Fans do
3131
{:ok, user} = ORM.find(User, user.id)
3232
{:ok, user2} = ORM.find(User, user2.id)
3333

34+
assert user.followings_count == 1
35+
assert user2.followers_count == 1
36+
3437
assert user2.id in user.meta.following_user_ids
3538
assert user.id in user2.meta.follower_user_ids
3639
end
@@ -73,6 +76,7 @@ defmodule GroupherServer.Test.Accounts.Fans do
7376
assert found |> Map.get(:followers) |> length == 0
7477
end
7578

79+
@tag :wip2
7680
test "undo follow user should update follow meta info", ~m(user)a do
7781
{:ok, user2} = db_insert(:user)
7882

@@ -89,6 +93,9 @@ defmodule GroupherServer.Test.Accounts.Fans do
8993
{:ok, user} = ORM.find(User, user.id)
9094
{:ok, user2} = ORM.find(User, user2.id)
9195

96+
assert user.followings_count == 0
97+
assert user2.followers_count == 0
98+
9299
assert user2.id not in user.meta.following_user_ids
93100
assert user.id not in user2.meta.follower_user_ids
94101
end

0 commit comments

Comments
 (0)