diff --git a/lib/groupher_server/accounts/accounts.ex b/lib/groupher_server/accounts/accounts.ex index 24ea50ae7..cf51842c3 100644 --- a/lib/groupher_server/accounts/accounts.ex +++ b/lib/groupher_server/accounts/accounts.ex @@ -22,6 +22,7 @@ defmodule GroupherServer.Accounts do defdelegate update_profile(user, attrs), to: Profile defdelegate update_geo(user, remote_ip), to: Profile + defdelegate update_subscribe_count(user), to: Profile defdelegate github_signin(github_user), to: Profile defdelegate default_subscribed_communities(filter), to: Profile defdelegate subscribed_communities(user, filter), to: Profile diff --git a/lib/groupher_server/accounts/delegates/profile.ex b/lib/groupher_server/accounts/delegates/profile.ex index a9be7a517..b2eb82491 100644 --- a/lib/groupher_server/accounts/delegates/profile.ex +++ b/lib/groupher_server/accounts/delegates/profile.ex @@ -65,6 +65,18 @@ defmodule GroupherServer.Accounts.Delegate.Profile do |> Repo.update() end + @doc """ + update user's subscribed communities count + """ + def update_subscribe_count(user_id) do + with {:ok, user} <- ORM.find(User, user_id) do + count_query = from(s in CMS.CommunitySubscriber, where: s.user_id == ^user.id) + count = Repo.aggregate(count_query, :count) + + user |> ORM.update(%{subscribed_communities_count: count}) + end + end + @doc """ update geo info for user, include geo_city & remote ip """ diff --git a/lib/groupher_server/accounts/helper/loader.ex b/lib/groupher_server/accounts/helper/loader.ex index d4ad681db..d371f4957 100644 --- a/lib/groupher_server/accounts/helper/loader.ex +++ b/lib/groupher_server/accounts/helper/loader.ex @@ -9,12 +9,6 @@ defmodule GroupherServer.Accounts.Helper.Loader do def data, do: Dataloader.Ecto.new(Repo, query: &query/2) - def query({"communities_subscribers", CMS.CommunitySubscriber}, %{count: _}) do - CMS.CommunitySubscriber - |> group_by([f], f.user_id) - |> select([f], count(f.id)) - end - def query({"communities_subscribers", CMS.CommunitySubscriber}, %{filter: filter}) do CMS.CommunitySubscriber |> QueryBuilder.filter_pack(filter) diff --git a/lib/groupher_server/accounts/user.ex b/lib/groupher_server/accounts/user.ex index 067134b5c..f5802414c 100644 --- a/lib/groupher_server/accounts/user.ex +++ b/lib/groupher_server/accounts/user.ex @@ -25,7 +25,7 @@ defmodule GroupherServer.Accounts.User do alias GroupherServer.CMS @required_fields ~w(nickname avatar)a - @optional_fields ~w(login nickname bio remote_ip sex location email)a + @optional_fields ~w(login nickname bio remote_ip sex location email subscribed_communities_count)a @type t :: %User{} schema "users" do @@ -55,6 +55,7 @@ defmodule GroupherServer.Accounts.User do has_many(:followings, {"users_followings", UserFollowing}) has_many(:subscribed_communities, {"communities_subscribers", CMS.CommunitySubscriber}) + field(:subscribed_communities_count, :integer, default: 0) has_many(:collect_folder, {"collect_folders", CollectFolder}) diff --git a/lib/groupher_server/cms/delegates/community_operation.ex b/lib/groupher_server/cms/delegates/community_operation.ex index 2b6d02b8a..4c434a305 100644 --- a/lib/groupher_server/cms/delegates/community_operation.ex +++ b/lib/groupher_server/cms/delegates/community_operation.ex @@ -5,11 +5,13 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do import ShortMaps alias Helper.{Certification, RadarSearch, ORM} - alias GroupherServer.Accounts.User - alias GroupherServer.CMS.Delegate.PassportCURD - alias GroupherServer.Repo - alias GroupherServer.CMS.{ + alias GroupherServer.{Accounts, CMS, Repo} + + alias Accounts.User + alias CMS.Delegate.PassportCURD + + alias CMS.{ Delegate, Category, Community, @@ -116,6 +118,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do |> Multi.run(:update_community_count, fn _, %{subscribed_community: community} -> CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :inc) end) + |> Multi.run(:update_user_subscribe_count, fn _, _ -> + Accounts.update_subscribe_count(user_id) + end) |> Repo.transaction() |> result() end @@ -133,6 +138,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do |> Multi.run(:update_community_count, fn _, %{subscribed_community: community} -> CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :inc) end) + |> Multi.run(:update_user_subscribe_count, fn _, _ -> + Accounts.update_subscribe_count(user_id) + end) |> Repo.transaction() |> result() end @@ -151,6 +159,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do |> Multi.run(:update_community_count, fn _, _ -> CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec) end) + |> Multi.run(:update_user_subscribe_count, fn _, _ -> + Accounts.update_subscribe_count(user_id) + end) |> Repo.transaction() |> result() else @@ -176,6 +187,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do |> Multi.run(:update_community_count, fn _, _ -> CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec) end) + |> Multi.run(:update_user_subscribe_count, fn _, _ -> + Accounts.update_subscribe_count(user_id) + end) |> Multi.run(:update_community_geo, fn _, _ -> update_community_geo(community_id, user_id, remote_ip, :dec) end) @@ -204,6 +218,9 @@ defmodule GroupherServer.CMS.Delegate.CommunityOperation do |> Multi.run(:update_community_count, fn _, _ -> CommunityCURD.update_community_count_field(community, user_id, :subscribers_count, :dec) end) + |> Multi.run(:update_user_subscribe_count, fn _, _ -> + Accounts.update_subscribe_count(user_id) + end) |> Multi.run(:update_community_geo_city, fn _, _ -> update_community_geo_map(community.id, city, :dec) end) diff --git a/lib/groupher_server_web/resolvers/accounts_resolver.ex b/lib/groupher_server_web/resolvers/accounts_resolver.ex index d9a99bd7a..a92b920f8 100644 --- a/lib/groupher_server_web/resolvers/accounts_resolver.ex +++ b/lib/groupher_server_web/resolvers/accounts_resolver.ex @@ -254,25 +254,16 @@ defmodule GroupherServerWeb.Resolvers.Accounts do Accounts.mark_mail_read(%SysNotificationMail{id: id}, cur_user) end - def subscribed_communities(%{id: id}, %{filter: filter}, _info) do - Accounts.subscribed_communities(%User{id: id}, filter) - end - - # for user self's - def subscribed_communities(_root, %{filter: filter}, %{context: %{cur_user: cur_user}}) do - Accounts.subscribed_communities(%User{id: cur_user.id}, filter) - end - - def subscribed_communities(_root, %{user_id: "", filter: filter}, _info) do - Accounts.default_subscribed_communities(filter) - end - # for check other users subscribed_communities - def subscribed_communities(_root, %{user_id: user_id, filter: filter}, _info) do - Accounts.subscribed_communities(%User{id: user_id}, filter) + def subscribed_communities(_root, %{login: login, filter: filter}, _info) do + with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do + Accounts.subscribed_communities(%User{id: user_id}, filter) + else + _ -> raise_error(:not_exsit, "#{login} not found") + end end - def subscribed_communities(_root, %{filter: filter}, _info) do + def subscribed_communities(_root, %{filter: filter} = args, _info) do Accounts.default_subscribed_communities(filter) end diff --git a/lib/groupher_server_web/schema/account/account_queries.ex b/lib/groupher_server_web/schema/account/account_queries.ex index 240304762..c1dea0bdd 100644 --- a/lib/groupher_server_web/schema/account/account_queries.ex +++ b/lib/groupher_server_web/schema/account/account_queries.ex @@ -27,7 +27,7 @@ defmodule GroupherServerWeb.Schema.Account.Queries do @desc "anyone can get anyone's subscribed communities" field :subscribed_communities, :paged_communities do - arg(:user_id, :id) + arg(:login, :string) arg(:filter, non_null(:paged_filter)) middleware(M.PageSizeProof) diff --git a/lib/groupher_server_web/schema/account/account_types.ex b/lib/groupher_server_web/schema/account/account_types.ex index 227d0833f..e7b5df214 100644 --- a/lib/groupher_server_web/schema/account/account_types.ex +++ b/lib/groupher_server_web/schema/account/account_types.ex @@ -61,26 +61,7 @@ defmodule GroupherServerWeb.Schema.Account.Types do resolve(&R.Accounts.get_passport/3) end - # field :subscribed_communities, list_of(:community) do - # arg(:filter, :members_filter) - - # middleware(M.PageSizeProof) - # resolve(dataloader(Accounts, :subscribed_communities)) - # end - @desc "paged communities subscribed by this user" - field :subscribed_communities, :paged_communities do - arg(:filter, :paged_filter) - - middleware(M.PageSizeProof) - resolve(&R.Accounts.subscribed_communities/3) - end - - field :subscribed_communities_count, :integer do - arg(:count, :count_type, default_value: :count) - - resolve(dataloader(Accounts, :subscribed_communities)) - middleware(M.ConvertToInt) - end + field(:subscribed_communities_count, :integer) @desc "paged communities which the user it's the editor" field :editable_communities, :paged_communities do diff --git a/priv/repo/migrations/20210529093621_add_subscribe_count_to_users.exs b/priv/repo/migrations/20210529093621_add_subscribe_count_to_users.exs new file mode 100644 index 000000000..f1a3478ee --- /dev/null +++ b/priv/repo/migrations/20210529093621_add_subscribe_count_to_users.exs @@ -0,0 +1,9 @@ +defmodule GroupherServer.Repo.Migrations.AddSubscribeCountToUsers do + use Ecto.Migration + + def change do + alter table(:users) do + add(:subscribed_communities_count, :integer) + end + end +end diff --git a/test/groupher_server_web/mutation/cms/cms_test.exs b/test/groupher_server_web/mutation/cms/cms_test.exs index ec08ca434..cc602de03 100644 --- a/test/groupher_server_web/mutation/cms/cms_test.exs +++ b/test/groupher_server_web/mutation/cms/cms_test.exs @@ -3,7 +3,9 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do use GroupherServer.TestTools - alias GroupherServer.CMS + alias GroupherServer.{Accounts, CMS} + + alias Accounts.User alias CMS.{Category, Community, CommunityEditor, Passport} alias Helper.ORM @@ -495,6 +497,17 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do assert created["id"] == to_string(community.id) end + test "subscribe should update user's subscribed count", ~m(user community)a do + login_conn = simu_conn(:user, user) + + variables = %{communityId: community.id} + created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") + + {:ok, user} = ORM.find(User, user.id) + + assert user.subscribed_communities_count == 1 + end + test "login user subscribe non-exsit community fails", ~m(user)a do login_conn = simu_conn(:user, user) variables = %{communityId: non_exsit_id()} @@ -555,6 +568,21 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do assert false == cur_subscribers.entries |> Enum.any?(&(&1.id == user.id)) end + test "unsubscribe should update user's subscribed count", ~m(user community)a do + login_conn = simu_conn(:user, user) + + variables = %{communityId: community.id} + created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") + + {:ok, user} = ORM.find(User, user.id) + assert user.subscribed_communities_count == 1 + + login_conn |> mutation_result(@unsubscribe_query, variables, "unsubscribeCommunity") + + {:ok, user} = ORM.find(User, user.id) + assert user.subscribed_communities_count == 0 + end + test "other login user unsubscribe community fails", ~m(user_conn community)a do variables = %{communityId: community.id} diff --git a/test/groupher_server_web/mutation/delivery/delivery_test.exs b/test/groupher_server_web/mutation/delivery/delivery_test.exs index 1d90429f5..c7a18f8e6 100644 --- a/test/groupher_server_web/mutation/delivery/delivery_test.exs +++ b/test/groupher_server_web/mutation/delivery/delivery_test.exs @@ -53,7 +53,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "auth user can publish system notifications" do {:ok, user} = db_insert(:user) @@ -100,7 +100,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "auth user can mark a system notification as read" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -200,7 +200,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "user can mark a mention as read" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -237,7 +237,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "user can mark all unread mentions as read" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -265,7 +265,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "user can mark a notification as read" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -303,7 +303,7 @@ defmodule GroupherServer.Test.Mutation.Delivery do } } """ - @tag :wip2 + test "user can mark all unread notifications as read" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) diff --git a/test/groupher_server_web/query/accounts/account_test.exs b/test/groupher_server_web/query/accounts/account_test.exs index ea444067d..0728d92a4 100644 --- a/test/groupher_server_web/query/accounts/account_test.exs +++ b/test/groupher_server_web/query/accounts/account_test.exs @@ -46,13 +46,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do company title } - subscribedCommunities { - entries { - id - } - pageSize - totalCount - } } } """ @@ -69,7 +62,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do assert results["cmsPassport"] == nil end - @tag :wip2 test "user should have default contributes", ~m(guest_conn user_conn user)a do variables = %{login: user.login} results = guest_conn |> query_result(@query, variables, "user") @@ -87,7 +79,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do assert contributes["totalCount"] == 0 end - @tag :wip2 test "login user can get it's own profile", ~m(user_conn user)a do results = user_conn |> query_result(@query, %{login: user.login}, "user") assert results["id"] == to_string(user.id) @@ -118,7 +109,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do } } - @tag :wip2 test "login user can get own cms_passport and cms_passport_string", ~m(user)a do user_conn = simu_conn(:user, user) @@ -130,7 +120,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do assert Map.equal?(Jason.decode!(results["cmsPassportString"]), @valid_rules) end - @tag :wip2 test "login user can get empty if cms_passport not exsit", ~m(user)a do user_conn = simu_conn(:user, user) @@ -207,102 +196,6 @@ defmodule GroupherServer.Test.Query.Account.Basic do end describe "[account subscrube]" do - alias CMS.Community - - @query """ - query($login: String!) { - user(login: $login) { - id - nickname - subscribedCommunitiesCount - subscribedCommunities { - entries { - id - title - raw - index - } - pageSize - totalCount - } - } - } - """ - test "guest user can get subscrubed communities list and count", ~m(guest_conn user)a do - variables = %{login: user.login} - {:ok, communities} = db_insert_multi(:community, assert_v(:page_size)) - - Enum.each( - communities, - &CMS.subscribe_community(%Community{id: &1.id}, user) - ) - - results = guest_conn |> query_result(@query, variables, "user") - subscribed_communities = results["subscribedCommunities"]["entries"] - - subscribed_communities_count = results["subscribedCommunitiesCount"] - [community_1, community_2, community_3, community_x] = communities |> firstn_and_last(3) - - assert subscribed_communities |> Enum.any?(&(&1["id"] == to_string(community_1.id))) - assert subscribed_communities |> Enum.any?(&(&1["id"] == to_string(community_2.id))) - assert subscribed_communities |> Enum.any?(&(&1["id"] == to_string(community_3.id))) - assert subscribed_communities |> Enum.any?(&(&1["id"] == to_string(community_x.id))) - assert subscribed_communities_count == assert_v(:page_size) - end - - test "guest user can get subscrubed community list by index", ~m(guest_conn user)a do - variables = %{login: user.login} - {:ok, communities} = db_insert_multi(:community, assert_v(:page_size)) - - Enum.each( - communities, - &CMS.subscribe_community(%Community{id: &1.id}, user) - ) - - [community_1, community_2, community_3, _community_x] = communities |> firstn_and_last(3) - - {:ok, _} = - Accounts.set_customization(user, %{ - sidebar_communities_index: %{ - community_1.raw => 3, - community_2.raw => 2, - community_3.raw => 1 - } - }) - - results = guest_conn |> query_result(@query, variables, "user") - subscribed_communities = results["subscribedCommunities"]["entries"] - - found_community_1 = - Enum.find(subscribed_communities, fn c -> c["raw"] == community_1.raw end) - - found_community_2 = - Enum.find(subscribed_communities, fn c -> c["raw"] == community_2.raw end) - - found_community_3 = - Enum.find(subscribed_communities, fn c -> c["raw"] == community_3.raw end) - - assert found_community_1["index"] == 3 - assert found_community_2["index"] == 2 - assert found_community_3["index"] == 1 - end - - test "guest user can get subscrubed communities count of 20 at most", ~m(guest_conn user)a do - variables = %{login: user.login} - {:ok, communities} = db_insert_multi(:community, assert_v(:page_size) + 1) - - Enum.each( - communities, - &CMS.subscribe_community(%Community{id: &1.id}, user) - ) - - results = guest_conn |> query_result(@query, variables, "user") - subscribed_communities = results["subscribedCommunities"] - - assert subscribed_communities["totalCount"] == assert_v(:page_size) + 1 - assert subscribed_communities["pageSize"] == assert_v(:page_size) - end - @query """ query($filter: PagedFilter!) { subscribedCommunities(filter: $filter) { @@ -340,8 +233,8 @@ defmodule GroupherServer.Test.Query.Account.Basic do end @query """ - query($userId: ID, $filter: PagedFilter!) { - subscribedCommunities(userId: $userId, filter: $filter) { + query($login: String, $filter: PagedFilter!) { + subscribedCommunities(login: $login, filter: $filter) { entries { title } @@ -352,11 +245,12 @@ defmodule GroupherServer.Test.Query.Account.Basic do } } """ + test "guest user can get paged default subscrubed communities with empty args", ~m(guest_conn)a do {:ok, _} = db_insert_multi(:community, 25) - variables = %{userId: "", filter: %{page: 1, size: 10}} + variables = %{filter: %{page: 1, size: 10}} results = guest_conn |> query_result(@query, variables, "subscribedCommunities") assert results |> is_valid_pagination? diff --git a/test/groupher_server_web/query/accounts/achievement_test.exs b/test/groupher_server_web/query/accounts/achievement_test.exs index 181fcf0ea..c15c2f23d 100644 --- a/test/groupher_server_web/query/accounts/achievement_test.exs +++ b/test/groupher_server_web/query/accounts/achievement_test.exs @@ -99,7 +99,7 @@ defmodule GroupherServer.Test.Query.Account.Achievement do } } """ - @tag :wip2 + test "user can get own editable communities list", ~m(user)a do user_conn = simu_conn(:user, user) diff --git a/test/groupher_server_web/query/accounts/customization_test.exs b/test/groupher_server_web/query/accounts/customization_test.exs index f9909d6af..777b2798b 100644 --- a/test/groupher_server_web/query/accounts/customization_test.exs +++ b/test/groupher_server_web/query/accounts/customization_test.exs @@ -30,7 +30,7 @@ defmodule GroupherServer.Test.Query.Account.Customization do } } """ - @tag :wip2 + test "user can have default customization configs", ~m(user_conn user)a do results = user_conn |> query_result(@query, %{login: user.login}, "user") diff --git a/test/groupher_server_web/query/accounts/fans_test.exs b/test/groupher_server_web/query/accounts/fans_test.exs index 1e5a0e62f..419e2967a 100644 --- a/test/groupher_server_web/query/accounts/fans_test.exs +++ b/test/groupher_server_web/query/accounts/fans_test.exs @@ -96,7 +96,6 @@ defmodule GroupherServer.Test.Query.Account.Fans do assert user4 |> exist_in?(entries, :string_key) end - @tag :wip2 test "login user can get other user's paged followings", ~m(guest_conn user)a do {:ok, user2} = db_insert(:user) {:ok, _followeer} = user |> Accounts.follow(user2) diff --git a/test/groupher_server_web/query/accounts/mention_test.exs b/test/groupher_server_web/query/accounts/mention_test.exs index 27ce9583c..ae15cf14a 100644 --- a/test/groupher_server_web/query/accounts/mention_test.exs +++ b/test/groupher_server_web/query/accounts/mention_test.exs @@ -26,7 +26,7 @@ defmodule GroupherServer.Test.Query.Accounts.Mention do } } """ - @tag :wip2 + test "auth user can get it's own mailbox status" do {:ok, [user, user2]} = db_insert_multi(:user, 2) diff --git a/test/groupher_server_web/query/accounts/messages_test.exs b/test/groupher_server_web/query/accounts/messages_test.exs index ce5dda2d7..da5a68326 100644 --- a/test/groupher_server_web/query/accounts/messages_test.exs +++ b/test/groupher_server_web/query/accounts/messages_test.exs @@ -25,7 +25,7 @@ defmodule GroupherServer.Test.Query.Accounts.Messages do } } """ - @tag :wip2 + test "login user can get mail box status" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -48,7 +48,6 @@ defmodule GroupherServer.Test.Query.Accounts.Messages do assert mail_box["notificationCount"] == 18 end - @tag :wip2 test "unauth user get mailBox status fails", ~m(guest_conn user)a do variables = %{login: user.login} @@ -87,7 +86,7 @@ defmodule GroupherServer.Test.Query.Accounts.Messages do } } """ - @tag :wip2 + test "user can get mentions send by others" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -107,7 +106,6 @@ defmodule GroupherServer.Test.Query.Accounts.Messages do assert mentions["entries"] |> List.first() |> Map.get("toUserId") == to_string(user.id) end - @tag :wip2 test "user can get notifications send by others" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user) @@ -127,7 +125,6 @@ defmodule GroupherServer.Test.Query.Accounts.Messages do assert notifications["entries"] |> List.first() |> Map.get("toUserId") == to_string(user.id) end - @tag :wip2 test "user can get system notifications" do {:ok, user} = db_insert(:user) user_conn = simu_conn(:user, user)