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

Commit f0b4a46

Browse files
authored
refactor(user): move subscribes communities count to user field (#372)
* refactor(user): mv subscribed_communityies_count to user model * refactor(user): done * refactor(user): wip * refactor(user): wip
1 parent fbd42c0 commit f0b4a46

File tree

17 files changed

+98
-174
lines changed

17 files changed

+98
-174
lines changed

lib/groupher_server/accounts/accounts.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ defmodule GroupherServer.Accounts do
2222

2323
defdelegate update_profile(user, attrs), to: Profile
2424
defdelegate update_geo(user, remote_ip), to: Profile
25+
defdelegate update_subscribe_count(user), to: Profile
2526
defdelegate github_signin(github_user), to: Profile
2627
defdelegate default_subscribed_communities(filter), to: Profile
2728
defdelegate subscribed_communities(user, filter), to: Profile

lib/groupher_server/accounts/delegates/profile.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ defmodule GroupherServer.Accounts.Delegate.Profile do
6565
|> Repo.update()
6666
end
6767

68+
@doc """
69+
update user's subscribed communities count
70+
"""
71+
def update_subscribe_count(user_id) do
72+
with {:ok, user} <- ORM.find(User, user_id) do
73+
count_query = from(s in CMS.CommunitySubscriber, where: s.user_id == ^user.id)
74+
count = Repo.aggregate(count_query, :count)
75+
76+
user |> ORM.update(%{subscribed_communities_count: count})
77+
end
78+
end
79+
6880
@doc """
6981
update geo info for user, include geo_city & remote ip
7082
"""

lib/groupher_server/accounts/helper/loader.ex

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ defmodule GroupherServer.Accounts.Helper.Loader do
99

1010
def data, do: Dataloader.Ecto.new(Repo, query: &query/2)
1111

12-
def query({"communities_subscribers", CMS.CommunitySubscriber}, %{count: _}) do
13-
CMS.CommunitySubscriber
14-
|> group_by([f], f.user_id)
15-
|> select([f], count(f.id))
16-
end
17-
1812
def query({"communities_subscribers", CMS.CommunitySubscriber}, %{filter: filter}) do
1913
CMS.CommunitySubscriber
2014
|> QueryBuilder.filter_pack(filter)

lib/groupher_server/accounts/user.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ defmodule GroupherServer.Accounts.User do
2525
alias GroupherServer.CMS
2626

2727
@required_fields ~w(nickname avatar)a
28-
@optional_fields ~w(login nickname bio remote_ip sex location email)a
28+
@optional_fields ~w(login nickname bio remote_ip sex location email subscribed_communities_count)a
2929

3030
@type t :: %User{}
3131
schema "users" do
@@ -55,6 +55,7 @@ defmodule GroupherServer.Accounts.User do
5555
has_many(:followings, {"users_followings", UserFollowing})
5656

5757
has_many(:subscribed_communities, {"communities_subscribers", CMS.CommunitySubscriber})
58+
field(:subscribed_communities_count, :integer, default: 0)
5859

5960
has_many(:collect_folder, {"collect_folders", CollectFolder})
6061

lib/groupher_server/cms/delegates/community_operation.ex

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
55
import ShortMaps
66

77
alias Helper.{Certification, RadarSearch, ORM}
8-
alias GroupherServer.Accounts.User
9-
alias GroupherServer.CMS.Delegate.PassportCURD
10-
alias GroupherServer.Repo
118

12-
alias GroupherServer.CMS.{
9+
alias GroupherServer.{Accounts, CMS, Repo}
10+
11+
alias Accounts.User
12+
alias CMS.Delegate.PassportCURD
13+
14+
alias CMS.{
1315
Delegate,
1416
Category,
1517
Community,
@@ -116,6 +118,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
116118
|> Multi.run(:update_community_count, fn _, %{subscribed_community: community} ->
117119
CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :inc)
118120
end)
121+
|> Multi.run(:update_user_subscribe_count, fn _, _ ->
122+
Accounts.update_subscribe_count(user_id)
123+
end)
119124
|> Repo.transaction()
120125
|> result()
121126
end
@@ -133,6 +138,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
133138
|> Multi.run(:update_community_count, fn _, %{subscribed_community: community} ->
134139
CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :inc)
135140
end)
141+
|> Multi.run(:update_user_subscribe_count, fn _, _ ->
142+
Accounts.update_subscribe_count(user_id)
143+
end)
136144
|> Repo.transaction()
137145
|> result()
138146
end
@@ -151,6 +159,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
151159
|> Multi.run(:update_community_count, fn _, _ ->
152160
CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec)
153161
end)
162+
|> Multi.run(:update_user_subscribe_count, fn _, _ ->
163+
Accounts.update_subscribe_count(user_id)
164+
end)
154165
|> Repo.transaction()
155166
|> result()
156167
else
@@ -176,6 +187,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
176187
|> Multi.run(:update_community_count, fn _, _ ->
177188
CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec)
178189
end)
190+
|> Multi.run(:update_user_subscribe_count, fn _, _ ->
191+
Accounts.update_subscribe_count(user_id)
192+
end)
179193
|> Multi.run(:update_community_geo, fn _, _ ->
180194
update_community_geo(community_id, user_id, remote_ip, :dec)
181195
end)
@@ -204,6 +218,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do
204218
|> Multi.run(:update_community_count, fn _, _ ->
205219
CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec)
206220
end)
221+
|> Multi.run(:update_user_subscribe_count, fn _, _ ->
222+
Accounts.update_subscribe_count(user_id)
223+
end)
207224
|> Multi.run(:update_community_geo_city, fn _, _ ->
208225
update_community_geo_map(community.id, city, :dec)
209226
end)

lib/groupher_server_web/resolvers/accounts_resolver.ex

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -254,25 +254,16 @@ defmodule GroupherServerWeb.Resolvers.Accounts do
254254
Accounts.mark_mail_read(%SysNotificationMail{id: id}, cur_user)
255255
end
256256

257-
def subscribed_communities(%{id: id}, %{filter: filter}, _info) do
258-
Accounts.subscribed_communities(%User{id: id}, filter)
259-
end
260-
261-
# for user self's
262-
def subscribed_communities(_root, %{filter: filter}, %{context: %{cur_user: cur_user}}) do
263-
Accounts.subscribed_communities(%User{id: cur_user.id}, filter)
264-
end
265-
266-
def subscribed_communities(_root, %{user_id: "", filter: filter}, _info) do
267-
Accounts.default_subscribed_communities(filter)
268-
end
269-
270257
# for check other users subscribed_communities
271-
def subscribed_communities(_root, %{user_id: user_id, filter: filter}, _info) do
272-
Accounts.subscribed_communities(%User{id: user_id}, filter)
258+
def subscribed_communities(_root, %{login: login, filter: filter}, _info) do
259+
with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do
260+
Accounts.subscribed_communities(%User{id: user_id}, filter)
261+
else
262+
_ -> raise_error(:not_exsit, "#{login} not found")
263+
end
273264
end
274265

275-
def subscribed_communities(_root, %{filter: filter}, _info) do
266+
def subscribed_communities(_root, %{filter: filter} = args, _info) do
276267
Accounts.default_subscribed_communities(filter)
277268
end
278269

lib/groupher_server_web/schema/account/account_queries.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ defmodule GroupherServerWeb.Schema.Account.Queries do
2727

2828
@desc "anyone can get anyone's subscribed communities"
2929
field :subscribed_communities, :paged_communities do
30-
arg(:user_id, :id)
30+
arg(:login, :string)
3131
arg(:filter, non_null(:paged_filter))
3232

3333
middleware(M.PageSizeProof)

lib/groupher_server_web/schema/account/account_types.ex

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,7 @@ defmodule GroupherServerWeb.Schema.Account.Types do
6161
resolve(&R.Accounts.get_passport/3)
6262
end
6363

64-
# field :subscribed_communities, list_of(:community) do
65-
# arg(:filter, :members_filter)
66-
67-
# middleware(M.PageSizeProof)
68-
# resolve(dataloader(Accounts, :subscribed_communities))
69-
# end
70-
@desc "paged communities subscribed by this user"
71-
field :subscribed_communities, :paged_communities do
72-
arg(:filter, :paged_filter)
73-
74-
middleware(M.PageSizeProof)
75-
resolve(&R.Accounts.subscribed_communities/3)
76-
end
77-
78-
field :subscribed_communities_count, :integer do
79-
arg(:count, :count_type, default_value: :count)
80-
81-
resolve(dataloader(Accounts, :subscribed_communities))
82-
middleware(M.ConvertToInt)
83-
end
64+
field(:subscribed_communities_count, :integer)
8465

8566
@desc "paged communities which the user it's the editor"
8667
field :editable_communities, :paged_communities do
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule GroupherServer.Repo.Migrations.AddSubscribeCountToUsers do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:users) do
6+
add(:subscribed_communities_count, :integer)
7+
end
8+
end
9+
end

test/groupher_server_web/mutation/cms/cms_test.exs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do
33

44
use GroupherServer.TestTools
55

6-
alias GroupherServer.CMS
6+
alias GroupherServer.{Accounts, CMS}
7+
8+
alias Accounts.User
79
alias CMS.{Category, Community, CommunityEditor, Passport}
810

911
alias Helper.ORM
@@ -495,6 +497,17 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do
495497
assert created["id"] == to_string(community.id)
496498
end
497499

500+
test "subscribe should update user's subscribed count", ~m(user community)a do
501+
login_conn = simu_conn(:user, user)
502+
503+
variables = %{communityId: community.id}
504+
created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity")
505+
506+
{:ok, user} = ORM.find(User, user.id)
507+
508+
assert user.subscribed_communities_count == 1
509+
end
510+
498511
test "login user subscribe non-exsit community fails", ~m(user)a do
499512
login_conn = simu_conn(:user, user)
500513
variables = %{communityId: non_exsit_id()}
@@ -555,6 +568,21 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do
555568
assert false == cur_subscribers.entries |> Enum.any?(&(&1.id == user.id))
556569
end
557570

571+
test "unsubscribe should update user's subscribed count", ~m(user community)a do
572+
login_conn = simu_conn(:user, user)
573+
574+
variables = %{communityId: community.id}
575+
created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity")
576+
577+
{:ok, user} = ORM.find(User, user.id)
578+
assert user.subscribed_communities_count == 1
579+
580+
login_conn |> mutation_result(@unsubscribe_query, variables, "unsubscribeCommunity")
581+
582+
{:ok, user} = ORM.find(User, user.id)
583+
assert user.subscribed_communities_count == 0
584+
end
585+
558586
test "other login user unsubscribe community fails", ~m(user_conn community)a do
559587
variables = %{communityId: community.id}
560588

0 commit comments

Comments
 (0)