From 9c8a6357955a14bcee0d56dce897086095de625f Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 11:22:32 +0800 Subject: [PATCH 01/10] refactor(user): extract published queries --- lib/groupher_server/accounts/accounts.ex | 2 +- .../accounts/delegates/publish.ex | 2 +- .../resolvers/accounts_resolver.ex | 8 ++--- .../schema/account/account_queries.ex | 32 ++----------------- .../published_posts_test.exs} | 14 ++++---- 5 files changed, 15 insertions(+), 43 deletions(-) rename test/groupher_server/accounts/{published_contents_test.exs => published/published_posts_test.exs} (91%) diff --git a/lib/groupher_server/accounts/accounts.ex b/lib/groupher_server/accounts/accounts.ex index cf51842c3..6b339f629 100644 --- a/lib/groupher_server/accounts/accounts.ex +++ b/lib/groupher_server/accounts/accounts.ex @@ -46,7 +46,7 @@ defmodule GroupherServer.Accounts do # defdelegate paged_editable_communities(filter), to: Achievements # publish - defdelegate published_contents(user, thread, filter), to: Publish + defdelegate published_articles(user, thread, filter), to: Publish defdelegate published_comments(user, thread, filter), to: Publish # fans diff --git a/lib/groupher_server/accounts/delegates/publish.ex b/lib/groupher_server/accounts/delegates/publish.ex index 0dc85dc55..20bfcb91e 100644 --- a/lib/groupher_server/accounts/delegates/publish.ex +++ b/lib/groupher_server/accounts/delegates/publish.ex @@ -18,7 +18,7 @@ defmodule GroupherServer.Accounts.Delegate.Publish do @doc """ get paged published contets of a user """ - def published_contents(%User{id: user_id}, thread, %{page: page, size: size} = filter) do + def published_articles(%User{id: user_id}, thread, %{page: page, size: size} = filter) do with {:ok, user} <- ORM.find(User, user_id), {:ok, content} <- match_action(thread, :self) do content.target diff --git a/lib/groupher_server_web/resolvers/accounts_resolver.ex b/lib/groupher_server_web/resolvers/accounts_resolver.ex index b8e973799..f44f0c2db 100644 --- a/lib/groupher_server_web/resolvers/accounts_resolver.ex +++ b/lib/groupher_server_web/resolvers/accounts_resolver.ex @@ -179,12 +179,12 @@ defmodule GroupherServerWeb.Resolvers.Accounts do end # published contents - def published_contents(_root, ~m(user_id filter thread)a, _info) do - Accounts.published_contents(%User{id: user_id}, thread, filter) + def published_articles(_root, ~m(user_id filter thread)a, _info) do + Accounts.published_articles(%User{id: user_id}, thread, filter) end - def published_contents(_root, ~m(filter thread)a, %{context: %{cur_user: cur_user}}) do - Accounts.published_contents(cur_user, thread, filter) + def published_articles(_root, ~m(filter thread)a, %{context: %{cur_user: cur_user}}) do + Accounts.published_articles(cur_user, thread, filter) end # published comments diff --git a/lib/groupher_server_web/schema/account/account_queries.ex b/lib/groupher_server_web/schema/account/account_queries.ex index 98c599cd8..457f355c4 100644 --- a/lib/groupher_server_web/schema/account/account_queries.ex +++ b/lib/groupher_server_web/schema/account/account_queries.ex @@ -87,36 +87,6 @@ defmodule GroupherServerWeb.Schema.Account.Queries do resolve(&R.Accounts.paged_collected_articles/3) end - @desc "get paged published posts" - field :published_posts, :paged_posts do - arg(:user_id, non_null(:id)) - arg(:filter, non_null(:paged_filter)) - arg(:thread, :post_thread, default_value: :post) - - middleware(M.PageSizeProof) - resolve(&R.Accounts.published_contents/3) - end - - @desc "get paged published jobs" - field :published_jobs, :paged_jobs do - arg(:user_id, non_null(:id)) - arg(:filter, non_null(:paged_filter)) - arg(:thread, :job_thread, default_value: :job) - - middleware(M.PageSizeProof) - resolve(&R.Accounts.published_contents/3) - end - - @desc "get paged published repos" - field :published_repos, :paged_repos do - arg(:user_id, non_null(:id)) - arg(:filter, non_null(:paged_filter)) - arg(:thread, :repo_thread, default_value: :repo) - - middleware(M.PageSizeProof) - resolve(&R.Accounts.published_contents/3) - end - @desc "get paged published comments on post" field :published_post_comments, :paged_post_comments do arg(:user_id, non_null(:id)) @@ -149,5 +119,7 @@ defmodule GroupherServerWeb.Schema.Account.Queries do resolve(&R.Accounts.search_users/3) end + + published_article_queries() end end diff --git a/test/groupher_server/accounts/published_contents_test.exs b/test/groupher_server/accounts/published/published_posts_test.exs similarity index 91% rename from test/groupher_server/accounts/published_contents_test.exs rename to test/groupher_server/accounts/published/published_posts_test.exs index a6406dd57..c2ca73d20 100644 --- a/test/groupher_server/accounts/published_contents_test.exs +++ b/test/groupher_server/accounts/published/published_posts_test.exs @@ -1,4 +1,4 @@ -defmodule GroupherServer.Test.Accounts.PublishedContents do +defmodule GroupherServer.Test.Accounts.Published.Post do use GroupherServer.TestTools alias GroupherServer.{Accounts, CMS} @@ -16,7 +16,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do describe "[Accounts Publised posts]" do test "fresh user get empty paged published posts", ~m(user)a do - {:ok, results} = Accounts.published_contents(user, :post, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -47,7 +47,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do acc ++ [post] end) - {:ok, results} = Accounts.published_contents(user, :post, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 @@ -61,7 +61,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do describe "[Accounts Publised jobs]" do test "fresh user get empty paged published jobs", ~m(user)a do - {:ok, results} = Accounts.published_contents(user, :job, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -92,7 +92,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do acc ++ [job] end) - {:ok, results} = Accounts.published_contents(user, :job, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 @@ -106,7 +106,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do describe "[Accounts Publised repos]" do test "fresh user get empty paged published repos", ~m(user)a do - {:ok, results} = Accounts.published_contents(user, :repo, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -137,7 +137,7 @@ defmodule GroupherServer.Test.Accounts.PublishedContents do acc ++ [repo] end) - {:ok, results} = Accounts.published_contents(user, :repo, %{page: 1, size: 20}) + {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 From 2127c93a27c086db28d802700b24e795e19c67cd Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 11:24:18 +0800 Subject: [PATCH 02/10] refactor(user): wip --- lib/groupher_server_web/schema/account/account_queries.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/groupher_server_web/schema/account/account_queries.ex b/lib/groupher_server_web/schema/account/account_queries.ex index 457f355c4..b6302b685 100644 --- a/lib/groupher_server_web/schema/account/account_queries.ex +++ b/lib/groupher_server_web/schema/account/account_queries.ex @@ -2,6 +2,7 @@ defmodule GroupherServerWeb.Schema.Account.Queries do @moduledoc """ accounts GraphQL queries """ + import GroupherServerWeb.Schema.Helper.Queries use Helper.GqlSchemaSuite object :account_queries do From 5c0a3a94b45e272724e8bfac82004efb7b7e83e5 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 11:26:02 +0800 Subject: [PATCH 03/10] refactor(user): wip --- .../cms/delegates/article_curd.ex | 4 +--- .../schema/Helper/queries.ex | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index d66486263..af9cc0236 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -448,7 +448,5 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do defp result({:ok, %{update_article: result}}), do: {:ok, result} defp result({:ok, %{set_viewer_has_states: result}}), do: result |> done() - defp result({:error, _, result, _steps}) do - {:error, result} - end + defp result({:error, _, result, _steps}), do: {:error, result} end diff --git a/lib/groupher_server_web/schema/Helper/queries.ex b/lib/groupher_server_web/schema/Helper/queries.ex index 0f348abbc..f2018bc06 100644 --- a/lib/groupher_server_web/schema/Helper/queries.ex +++ b/lib/groupher_server_web/schema/Helper/queries.ex @@ -9,6 +9,24 @@ defmodule GroupherServerWeb.Schema.Helper.Queries do @article_threads get_config(:article, :article_threads) + # user published articles + defmacro published_article_queries() do + @article_threads + |> Enum.map(fn thread -> + quote do + @desc unquote("paged published #{thread}s") + field unquote(:"published_#{thread}s"), unquote(:"paged_#{thread}s") do + arg(:login, non_null(:string)) + arg(:filter, non_null(:paged_filter)) + arg(:thread, unquote(:"#{thread}_thread"), default_value: unquote(thread)) + + middleware(M.PageSizeProof) + resolve(&R.Accounts.published_articles/3) + end + end + end) + end + defmacro article_search_queries() do @article_threads |> Enum.map(fn thread -> From 4698a4bc0e7dc9a623b8a163d050d5db545bdea3 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 11:31:15 +0800 Subject: [PATCH 04/10] refactor(user): use new matcher in publish --- lib/groupher_server/accounts/delegates/publish.ex | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/groupher_server/accounts/delegates/publish.ex b/lib/groupher_server/accounts/delegates/publish.ex index 20bfcb91e..59266c40c 100644 --- a/lib/groupher_server/accounts/delegates/publish.ex +++ b/lib/groupher_server/accounts/delegates/publish.ex @@ -7,6 +7,7 @@ defmodule GroupherServer.Accounts.Delegate.Publish do # import Helper.ErrorCode import ShortMaps + import GroupherServer.CMS.Helper.Matcher import GroupherServer.CMS.Helper.MatcherOld alias Helper.{ORM, QueryBuilder} @@ -19,12 +20,12 @@ defmodule GroupherServer.Accounts.Delegate.Publish do get paged published contets of a user """ def published_articles(%User{id: user_id}, thread, %{page: page, size: size} = filter) do - with {:ok, user} <- ORM.find(User, user_id), - {:ok, content} <- match_action(thread, :self) do - content.target - |> join(:inner, [content], author in assoc(content, :author)) - |> where([content, author], author.user_id == ^user.id) - |> select([content, author], content) + with {:ok, info} <- match(thread), + {:ok, user} <- ORM.find(User, user_id) do + info.model + |> join(:inner, [article], author in assoc(article, :author)) + |> where([article, author], author.user_id == ^user.id) + |> select([article, author], article) |> QueryBuilder.filter_pack(filter) |> ORM.paginater(~m(page size)a) |> done() From 336b81428c2eee6318892d7c8b4cdc70ad66c995 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 11:54:21 +0800 Subject: [PATCH 05/10] refactor(user): seperate published tests --- .../published/published_jobs_test.exs | 61 +++++++++++++++++++ .../published/published_posts_test.exs | 3 +- .../published/published_repos_test.exs | 61 +++++++++++++++++++ .../query/accounts/achievement_test.exs | 2 - 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 test/groupher_server/accounts/published/published_jobs_test.exs create mode 100644 test/groupher_server/accounts/published/published_repos_test.exs diff --git a/test/groupher_server/accounts/published/published_jobs_test.exs b/test/groupher_server/accounts/published/published_jobs_test.exs new file mode 100644 index 000000000..9d079ab31 --- /dev/null +++ b/test/groupher_server/accounts/published/published_jobs_test.exs @@ -0,0 +1,61 @@ +defmodule GroupherServer.Test.Accounts.Published.Job do + use GroupherServer.TestTools + + alias GroupherServer.{Accounts, CMS} + + @publish_count 10 + + setup do + {:ok, user} = db_insert(:user) + {:ok, user2} = db_insert(:user) + {:ok, community} = db_insert(:community) + {:ok, community2} = db_insert(:community) + + {:ok, ~m(user user2 community community2)a} + end + + describe "[Accounts Publised jobs]" do + test "fresh user get empty paged published jobs", ~m(user)a do + {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) + + assert results |> is_valid_pagination?(:raw) + assert results.total_count == 0 + end + + test "user can get paged published jobs", ~m(user user2 community community2)a do + pub_jobs = + Enum.reduce(1..@publish_count, [], fn _, acc -> + job_attrs = mock_attrs(:job, %{community_id: community.id}) + {:ok, job} = CMS.create_article(community, :job, job_attrs, user) + + acc ++ [job] + end) + + pub_jobs2 = + Enum.reduce(1..@publish_count, [], fn _, acc -> + job_attrs = mock_attrs(:job, %{community_id: community2.id}) + {:ok, job} = CMS.create_article(community, :job, job_attrs, user) + + acc ++ [job] + end) + + # unrelated other user + Enum.reduce(1..5, [], fn _, acc -> + job_attrs = mock_attrs(:job, %{community_id: community.id}) + {:ok, job} = CMS.create_article(community, :job, job_attrs, user2) + + acc ++ [job] + end) + + {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) + + assert results |> is_valid_pagination?(:raw) + assert results.total_count == @publish_count * 2 + + random_job_id = pub_jobs |> Enum.random() |> Map.get(:id) + random_job_id2 = pub_jobs2 |> Enum.random() |> Map.get(:id) + assert results.entries |> Enum.any?(&(&1.id == random_job_id)) + assert results.entries |> Enum.any?(&(&1.id == random_job_id2)) + end + end +end diff --git a/test/groupher_server/accounts/published/published_posts_test.exs b/test/groupher_server/accounts/published/published_posts_test.exs index c2ca73d20..53edf72d3 100644 --- a/test/groupher_server/accounts/published/published_posts_test.exs +++ b/test/groupher_server/accounts/published/published_posts_test.exs @@ -14,7 +14,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do {:ok, ~m(user user2 community community2)a} end - describe "[Accounts Publised posts]" do + describe "[Publised posts]" do test "fresh user get empty paged published posts", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) @@ -22,6 +22,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do assert results.total_count == 0 end + @tag :wip2 test "user can get paged published posts", ~m(user user2 community community2)a do pub_posts = Enum.reduce(1..@publish_count, [], fn _, acc -> diff --git a/test/groupher_server/accounts/published/published_repos_test.exs b/test/groupher_server/accounts/published/published_repos_test.exs new file mode 100644 index 000000000..a31c2b151 --- /dev/null +++ b/test/groupher_server/accounts/published/published_repos_test.exs @@ -0,0 +1,61 @@ +defmodule GroupherServer.Test.Accounts.Published.Post do + use GroupherServer.TestTools + + alias GroupherServer.{Accounts, CMS} + + @publish_count 10 + + setup do + {:ok, user} = db_insert(:user) + {:ok, user2} = db_insert(:user) + {:ok, community} = db_insert(:community) + {:ok, community2} = db_insert(:community) + + {:ok, ~m(user user2 community community2)a} + end + + describe "[Accounts Publised repos]" do + test "fresh user get empty paged published repos", ~m(user)a do + {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) + + assert results |> is_valid_pagination?(:raw) + assert results.total_count == 0 + end + + test "user can get paged published repos", ~m(user user2 community community2)a do + pub_repos = + Enum.reduce(1..@publish_count, [], fn _, acc -> + repo_attrs = mock_attrs(:repo, %{community_id: community.id}) + {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) + + acc ++ [repo] + end) + + pub_repos2 = + Enum.reduce(1..@publish_count, [], fn _, acc -> + repo_attrs = mock_attrs(:repo, %{community_id: community2.id}) + {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) + + acc ++ [repo] + end) + + # unrelated other user + Enum.reduce(1..5, [], fn _, acc -> + repo_attrs = mock_attrs(:repo, %{community_id: community.id}) + {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user2) + + acc ++ [repo] + end) + + {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) + + assert results |> is_valid_pagination?(:raw) + assert results.total_count == @publish_count * 2 + + random_repo_id = pub_repos |> Enum.random() |> Map.get(:id) + random_repo_id2 = pub_repos2 |> Enum.random() |> Map.get(:id) + assert results.entries |> Enum.any?(&(&1.id == random_repo_id)) + assert results.entries |> Enum.any?(&(&1.id == random_repo_id2)) + end + end +end diff --git a/test/groupher_server_web/query/accounts/achievement_test.exs b/test/groupher_server_web/query/accounts/achievement_test.exs index 135c568b0..e36f8bcdc 100644 --- a/test/groupher_server_web/query/accounts/achievement_test.exs +++ b/test/groupher_server_web/query/accounts/achievement_test.exs @@ -60,7 +60,6 @@ defmodule GroupherServer.Test.Query.Account.Achievement do } } """ - @tag :wip2 test "can get user's empty editable communities list", ~m(guest_conn user)a do variables = %{login: user.login, filter: %{page: 1, size: 20}} results = guest_conn |> query_result(@query, variables, "editableCommunities") @@ -68,7 +67,6 @@ defmodule GroupherServer.Test.Query.Account.Achievement do assert results |> is_valid_pagination?(:empty) end - @tag :wip2 test "can get user's editable communities list when user is editor", ~m(guest_conn user)a do {:ok, community} = db_insert(:community) {:ok, community2} = db_insert(:community) From 35283c02fc72e0060f678b3d8793059bf28b9668 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 12:05:12 +0800 Subject: [PATCH 06/10] refactor(user): seperate published wip --- .../accounts/published/published_jobs_test.exs | 2 +- .../accounts/published/published_repos_test.exs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/groupher_server/accounts/published/published_jobs_test.exs b/test/groupher_server/accounts/published/published_jobs_test.exs index 9d079ab31..d469c0da1 100644 --- a/test/groupher_server/accounts/published/published_jobs_test.exs +++ b/test/groupher_server/accounts/published/published_jobs_test.exs @@ -14,7 +14,7 @@ defmodule GroupherServer.Test.Accounts.Published.Job do {:ok, ~m(user user2 community community2)a} end - describe "[Accounts Publised jobs]" do + describe "[publised jobs]" do test "fresh user get empty paged published jobs", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) diff --git a/test/groupher_server/accounts/published/published_repos_test.exs b/test/groupher_server/accounts/published/published_repos_test.exs index a31c2b151..bc9bbe87f 100644 --- a/test/groupher_server/accounts/published/published_repos_test.exs +++ b/test/groupher_server/accounts/published/published_repos_test.exs @@ -1,4 +1,4 @@ -defmodule GroupherServer.Test.Accounts.Published.Post do +defmodule GroupherServer.Test.Accounts.Published.Repo do use GroupherServer.TestTools alias GroupherServer.{Accounts, CMS} @@ -14,7 +14,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do {:ok, ~m(user user2 community community2)a} end - describe "[Accounts Publised repos]" do + describe "[publised repos]" do test "fresh user get empty paged published repos", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) From 3aecf860eb557578a64e6bba1f19bfd531f2f035 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 12:14:16 +0800 Subject: [PATCH 07/10] refactor(user): seperate published wip --- .../accounts/published_comments_test.exs | 2 +- .../accounts/published_contents_test.exs | 134 ------------------ 2 files changed, 1 insertion(+), 135 deletions(-) delete mode 100644 test/groupher_server_web/query/accounts/published_contents_test.exs diff --git a/test/groupher_server/accounts/published_comments_test.exs b/test/groupher_server/accounts/published_comments_test.exs index fcf55c368..3458f07f2 100644 --- a/test/groupher_server/accounts/published_comments_test.exs +++ b/test/groupher_server/accounts/published_comments_test.exs @@ -21,7 +21,7 @@ defmodule GroupherServer.Test.Accounts.PublishedComments do assert results.total_count == 0 end - test "user can get paged published posts", ~m(user user2 community)a do + test "user can get paged published post comments", ~m(user user2 community)a do body = "this is a test comment" {:ok, post} = db_insert(:post) {:ok, post2} = db_insert(:post) diff --git a/test/groupher_server_web/query/accounts/published_contents_test.exs b/test/groupher_server_web/query/accounts/published_contents_test.exs deleted file mode 100644 index 2fb553c09..000000000 --- a/test/groupher_server_web/query/accounts/published_contents_test.exs +++ /dev/null @@ -1,134 +0,0 @@ -defmodule GroupherServer.Test.Query.Accounts.PublishedContents do - use GroupherServer.TestTools - - alias GroupherServer.CMS - - @publish_count 10 - - setup do - {:ok, user} = db_insert(:user) - {:ok, community} = db_insert(:community) - - guest_conn = simu_conn(:guest) - user_conn = simu_conn(:user, user) - - {:ok, ~m(guest_conn user_conn user community)a} - end - - describe "[account published posts]" do - @query """ - query($userId: ID!, $filter: PagedFilter!) { - publishedPosts(userId: $userId, filter: $filter) { - entries { - id - author { - id - } - } - totalPages - totalCount - pageSize - pageNumber - } - } - """ - test "user can get paged published posts", ~m(guest_conn user community)a do - pub_posts = - Enum.reduce(1..@publish_count, [], fn _, acc -> - post_attrs = mock_attrs(:post, %{community_id: community.id}) - {:ok, post} = CMS.create_article(community, :post, post_attrs, user) - - acc ++ [post] - end) - - random_post_id = pub_posts |> Enum.random() |> Map.get(:id) |> to_string - - variables = %{userId: user.id, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedPosts") - - assert results |> is_valid_pagination? - assert results["totalCount"] == @publish_count - - assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) - assert results["entries"] |> Enum.any?(&(&1["id"] == random_post_id)) - end - end - - describe "[account published jobs]" do - @query """ - query($userId: ID!, $filter: PagedFilter!) { - publishedJobs(userId: $userId, filter: $filter) { - entries { - id - author { - id - } - } - totalPages - totalCount - pageSize - pageNumber - } - } - """ - test "user can get paged published jobs", ~m(guest_conn user community)a do - pub_jobs = - Enum.reduce(1..@publish_count, [], fn _, acc -> - job_attrs = mock_attrs(:job, %{community_id: community.id}) - {:ok, job} = CMS.create_article(community, :job, job_attrs, user) - - acc ++ [job] - end) - - random_job_id = pub_jobs |> Enum.random() |> Map.get(:id) |> to_string - - variables = %{userId: user.id, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedJobs") - - assert results |> is_valid_pagination? - assert results["totalCount"] == @publish_count - - assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) - assert results["entries"] |> Enum.any?(&(&1["id"] == random_job_id)) - end - end - - describe "[account published repos]" do - @query """ - query($userId: ID!, $filter: PagedFilter!) { - publishedRepos(userId: $userId, filter: $filter) { - entries { - id - author { - id - } - } - totalPages - totalCount - pageSize - pageNumber - } - } - """ - test "user can get paged published repos", ~m(guest_conn user community)a do - pub_repos = - Enum.reduce(1..@publish_count, [], fn _, acc -> - repo_attrs = mock_attrs(:repo, %{community_id: community.id}) - {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) - - acc ++ [repo] - end) - - random_repo_id = pub_repos |> Enum.random() |> Map.get(:id) |> to_string - - variables = %{userId: user.id, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedRepos") - - assert results |> is_valid_pagination? - assert results["totalCount"] == @publish_count - - assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) - assert results["entries"] |> Enum.any?(&(&1["id"] == random_repo_id)) - end - end -end From 7589e9f33f6000df84feb769c852ab63dd34cef8 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 13:03:10 +0800 Subject: [PATCH 08/10] refactor(user): published article states in meta --- lib/groupher_server/accounts/accounts.ex | 1 + .../accounts/delegates/publish.ex | 45 ++++++++++++++----- .../accounts/embeds/user_meta.ex | 44 +++++++++++++++--- .../cms/article_user_emotion.ex | 2 - .../cms/delegates/article_curd.ex | 11 +++-- .../published/published_jobs_test.exs | 10 +++++ .../published/published_posts_test.exs | 13 +++++- .../published/published_repos_test.exs | 10 +++++ 8 files changed, 108 insertions(+), 28 deletions(-) diff --git a/lib/groupher_server/accounts/accounts.ex b/lib/groupher_server/accounts/accounts.ex index 6b339f629..3649dd3d0 100644 --- a/lib/groupher_server/accounts/accounts.ex +++ b/lib/groupher_server/accounts/accounts.ex @@ -48,6 +48,7 @@ defmodule GroupherServer.Accounts do # publish defdelegate published_articles(user, thread, filter), to: Publish defdelegate published_comments(user, thread, filter), to: Publish + defdelegate update_published_states(user, thread), to: Publish # fans defdelegate follow(user, follower), to: Fans diff --git a/lib/groupher_server/accounts/delegates/publish.ex b/lib/groupher_server/accounts/delegates/publish.ex index 59266c40c..2a687a4ea 100644 --- a/lib/groupher_server/accounts/delegates/publish.ex +++ b/lib/groupher_server/accounts/delegates/publish.ex @@ -3,7 +3,7 @@ defmodule GroupherServer.Accounts.Delegate.Publish do user followers / following related """ import Ecto.Query, warn: false - import Helper.Utils, only: [done: 1] + import Helper.Utils, only: [done: 1, ensure: 2] # import Helper.ErrorCode import ShortMaps @@ -11,27 +11,48 @@ defmodule GroupherServer.Accounts.Delegate.Publish do import GroupherServer.CMS.Helper.MatcherOld alias Helper.{ORM, QueryBuilder} - # alias GroupherServer.{Accounts, Repo} + alias GroupherServer.Accounts.{Embeds, User} - alias GroupherServer.Accounts.User - # alias GroupherServer.CMS + @default_meta Embeds.UserMeta.default_meta() @doc """ get paged published contets of a user """ - def published_articles(%User{id: user_id}, thread, %{page: page, size: size} = filter) do + def published_articles(%User{id: user_id}, thread, filter) do with {:ok, info} <- match(thread), {:ok, user} <- ORM.find(User, user_id) do - info.model - |> join(:inner, [article], author in assoc(article, :author)) - |> where([article, author], author.user_id == ^user.id) - |> select([article, author], article) - |> QueryBuilder.filter_pack(filter) - |> ORM.paginater(~m(page size)a) - |> done() + do_paged_published_articles(info.model, user, filter) + end + end + + @doc """ + update published articles count in user meta + """ + def update_published_states(user_id, thread) do + filter = %{page: 1, size: 1} + + with {:ok, info} <- match(thread), + {:ok, user} <- ORM.find(User, user_id), + {:ok, paged_published_articles} <- do_paged_published_articles(info.model, user, filter) do + articles_count = paged_published_articles.total_count + + meta = + ensure(user.meta, @default_meta) |> Map.put(:"published_#{thread}s_count", articles_count) + + ORM.update_meta(user, meta) end end + defp do_paged_published_articles(queryable, %User{} = user, %{page: page, size: size} = filter) do + queryable + |> join(:inner, [article], author in assoc(article, :author)) + |> where([article, author], author.user_id == ^user.id) + |> select([article, author], article) + |> QueryBuilder.filter_pack(filter) + |> ORM.paginater(~m(page size)a) + |> done() + end + @doc """ get paged published comments of a user """ diff --git a/lib/groupher_server/accounts/embeds/user_meta.ex b/lib/groupher_server/accounts/embeds/user_meta.ex index 7eef19cdd..5fa95acdb 100644 --- a/lib/groupher_server/accounts/embeds/user_meta.ex +++ b/lib/groupher_server/accounts/embeds/user_meta.ex @@ -1,22 +1,51 @@ +defmodule GroupherServer.Accounts.Embeds.UserMeta.Macro do + @moduledoc false + + import Helper.Utils, only: [get_config: 2] + + @article_threads get_config(:article, :article_threads) + + defmacro published_article_count_fields() do + @article_threads + |> Enum.map(fn thread -> + quote do + field(unquote(:"published_#{thread}s_count"), :integer, default: 0) + end + end) + end +end + defmodule GroupherServer.Accounts.Embeds.UserMeta do @moduledoc """ - general article meta info for article-like content, like post, job, works ... + general article meta info for articles """ use Ecto.Schema use Accessible + import Ecto.Changeset + import GroupherServer.Accounts.Embeds.UserMeta.Macro + import Helper.Utils, only: [get_config: 2] - @optional_fields ~w(reported_count follower_user_ids following_user_ids)a + @article_threads get_config(:article, :article_threads) - @default_meta %{ + @general_options %{ reported_count: 0, reported_user_ids: [], follower_user_ids: [], following_user_ids: [] } - @doc "for test usage" - def default_meta(), do: @default_meta + @optional_fields Map.keys(@general_options) ++ + Enum.map(@article_threads, &:"published_#{&1}s_count") + + def default_meta() do + published_article_counts = + @article_threads + |> Enum.reduce([], &(&2 ++ ["published_#{&1}s_count": 0])) + |> Enum.into(%{}) + + @general_options |> Map.merge(published_article_counts) + end embedded_schema do field(:reported_count, :integer, default: 0) @@ -25,10 +54,11 @@ defmodule GroupherServer.Accounts.Embeds.UserMeta do # TODO: 怎样处理历史数据 ? field(:follower_user_ids, {:array, :integer}, default: []) field(:following_user_ids, {:array, :integer}, default: []) + + published_article_count_fields() end def changeset(struct, params) do - struct - |> cast(params, @optional_fields) + struct |> cast(params, @optional_fields) end end diff --git a/lib/groupher_server/cms/article_user_emotion.ex b/lib/groupher_server/cms/article_user_emotion.ex index 557134de2..48c6d9d34 100644 --- a/lib/groupher_server/cms/article_user_emotion.ex +++ b/lib/groupher_server/cms/article_user_emotion.ex @@ -1,8 +1,6 @@ defmodule GroupherServer.CMS.ArticleUserEmotion.Macros do import Helper.Utils, only: [get_config: 2] - alias GroupherServer.CMS - @supported_emotions get_config(:article, :supported_emotions) defmacro emotion_fields() do diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index af9cc0236..0c07744c0 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -121,16 +121,12 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do end @doc """ - Creates a article(post/job ...), and set community. + Creates a article ## Examples - iex> create_post(%{field: value}) + iex> create_article(community, :post, %{title: ...}, user) {:ok, %Post{}} - - iex> create_post(%{field: bad_value}) - {:error, %Ecto.Changeset{}} - """ def create_article(%Community{id: cid}, thread, attrs, %User{id: uid}) do with {:ok, author} <- ensure_author_exists(%User{id: uid}), @@ -149,6 +145,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do |> Multi.run(:update_community_article_count, fn _, _ -> CommunityCURD.update_community_count_field(community, thread) end) + |> Multi.run(:update_user_published_meta, fn _, _ -> + Accounts.update_published_states(uid, thread) + end) |> Multi.run(:mention_users, fn _, %{create_article: article} -> Delivery.mention_from_content(community.raw, thread, article, attrs, %User{id: uid}) {:ok, :pass} diff --git a/test/groupher_server/accounts/published/published_jobs_test.exs b/test/groupher_server/accounts/published/published_jobs_test.exs index d469c0da1..4ca442177 100644 --- a/test/groupher_server/accounts/published/published_jobs_test.exs +++ b/test/groupher_server/accounts/published/published_jobs_test.exs @@ -15,6 +15,16 @@ defmodule GroupherServer.Test.Accounts.Published.Job do end describe "[publised jobs]" do + @tag :wip2 + test "create job should update user published meta", ~m(community user)a do + job_attrs = mock_attrs(:job, %{community_id: community.id}) + {:ok, _job} = CMS.create_article(community, :job, job_attrs, user) + {:ok, _job} = CMS.create_article(community, :job, job_attrs, user) + + {:ok, user} = ORM.find(User, user.id) + assert user.meta.published_jobs_count == 2 + end + test "fresh user get empty paged published jobs", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) diff --git a/test/groupher_server/accounts/published/published_posts_test.exs b/test/groupher_server/accounts/published/published_posts_test.exs index 53edf72d3..febfafaa3 100644 --- a/test/groupher_server/accounts/published/published_posts_test.exs +++ b/test/groupher_server/accounts/published/published_posts_test.exs @@ -2,6 +2,8 @@ defmodule GroupherServer.Test.Accounts.Published.Post do use GroupherServer.TestTools alias GroupherServer.{Accounts, CMS} + alias Accounts.User + alias Helper.ORM @publish_count 10 @@ -15,6 +17,16 @@ defmodule GroupherServer.Test.Accounts.Published.Post do end describe "[Publised posts]" do + @tag :wip2 + test "create post should update user published meta", ~m(community user)a do + post_attrs = mock_attrs(:post, %{community_id: community.id}) + {:ok, _post} = CMS.create_article(community, :post, post_attrs, user) + {:ok, _post} = CMS.create_article(community, :post, post_attrs, user) + + {:ok, user} = ORM.find(User, user.id) + assert user.meta.published_posts_count == 2 + end + test "fresh user get empty paged published posts", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) @@ -22,7 +34,6 @@ defmodule GroupherServer.Test.Accounts.Published.Post do assert results.total_count == 0 end - @tag :wip2 test "user can get paged published posts", ~m(user user2 community community2)a do pub_posts = Enum.reduce(1..@publish_count, [], fn _, acc -> diff --git a/test/groupher_server/accounts/published/published_repos_test.exs b/test/groupher_server/accounts/published/published_repos_test.exs index bc9bbe87f..c98b295b8 100644 --- a/test/groupher_server/accounts/published/published_repos_test.exs +++ b/test/groupher_server/accounts/published/published_repos_test.exs @@ -15,6 +15,16 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do end describe "[publised repos]" do + @tag :wip2 + test "create repo should update user published meta", ~m(community user)a do + repo_attrs = mock_attrs(:repo, %{community_id: community.id}) + {:ok, _repo} = CMS.create_article(community, :repo, repo_attrs, user) + {:ok, _repo} = CMS.create_article(community, :repo, repo_attrs, user) + + {:ok, user} = ORM.find(User, user.id) + assert user.meta.published_repos_count == 2 + end + test "fresh user get empty paged published repos", ~m(user)a do {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) From fa669ddf4fe5b0be82cccb765bba5c534f2df96a Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 22:37:17 +0800 Subject: [PATCH 09/10] refactor(user): done --- lib/groupher_server/accounts/accounts.ex | 2 + .../accounts/delegates/publish.ex | 35 +++++- lib/groupher_server/cms/article_comment.ex | 5 +- .../cms/delegates/article_comment.ex | 3 + .../cms/delegates/article_comment_action.ex | 6 +- .../resolvers/accounts_resolver.ex | 24 ++++- .../schema/Helper/queries.ex | 2 +- .../schema/account/account_queries.ex | 30 ++++-- .../schema/cms/cms_types.ex | 3 + lib/helper/orm.ex | 14 ++- ...30060122_add_thread_to_article_comment.exs | 9 ++ .../published/published_jobs_test.exs | 27 ++++- .../published/published_posts_test.exs | 101 +++--------------- .../published/published_repos_test.exs | 27 ++++- .../mutation/cms/cms_test.exs | 4 +- .../published/published_jobs_test.exs | 95 ++++++++++++++++ .../published/published_posts_test.exs | 95 ++++++++++++++++ .../published/published_repos_test.exs | 95 ++++++++++++++++ .../accounts/published_comments_test.exs | 66 ------------ 19 files changed, 464 insertions(+), 179 deletions(-) create mode 100644 priv/repo/migrations/20210530060122_add_thread_to_article_comment.exs create mode 100644 test/groupher_server_web/query/accounts/published/published_jobs_test.exs create mode 100644 test/groupher_server_web/query/accounts/published/published_posts_test.exs create mode 100644 test/groupher_server_web/query/accounts/published/published_repos_test.exs delete mode 100644 test/groupher_server_web/query/accounts/published_comments_test.exs diff --git a/lib/groupher_server/accounts/accounts.ex b/lib/groupher_server/accounts/accounts.ex index 3649dd3d0..36184551b 100644 --- a/lib/groupher_server/accounts/accounts.ex +++ b/lib/groupher_server/accounts/accounts.ex @@ -48,6 +48,8 @@ defmodule GroupherServer.Accounts do # publish defdelegate published_articles(user, thread, filter), to: Publish defdelegate published_comments(user, thread, filter), to: Publish + defdelegate published_article_comments(user, thread, filter), to: Publish + defdelegate published_article_comments(user, thread), to: Publish defdelegate update_published_states(user, thread), to: Publish # fans diff --git a/lib/groupher_server/accounts/delegates/publish.ex b/lib/groupher_server/accounts/delegates/publish.ex index 2a687a4ea..4c126819d 100644 --- a/lib/groupher_server/accounts/delegates/publish.ex +++ b/lib/groupher_server/accounts/delegates/publish.ex @@ -10,8 +10,9 @@ defmodule GroupherServer.Accounts.Delegate.Publish do import GroupherServer.CMS.Helper.Matcher import GroupherServer.CMS.Helper.MatcherOld - alias Helper.{ORM, QueryBuilder} alias GroupherServer.Accounts.{Embeds, User} + alias GroupherServer.CMS.ArticleComment + alias Helper.{ORM, QueryBuilder} @default_meta Embeds.UserMeta.default_meta() @@ -53,6 +54,38 @@ defmodule GroupherServer.Accounts.Delegate.Publish do |> done() end + def published_article_comments(%User{id: user_id}, %{page: page, size: size} = filter) do + with {:ok, user} <- ORM.find(User, user_id) do + ArticleComment + |> join(:inner, [comment], author in assoc(comment, :author)) + |> where([comment, author], author.id == ^user.id) + |> QueryBuilder.filter_pack(filter) + |> ORM.paginater(~m(page size)a) + |> ORM.extract_and_assign_article() + |> done() + end + end + + def published_article_comments(%User{id: user_id}, thread, %{page: page, size: size} = filter) do + with {:ok, user} <- ORM.find(User, user_id) do + thread = thread |> to_string |> String.upcase() + thread_atom = thread |> String.downcase() |> String.to_atom() + + # article_preload = Keyword.new([{thread_atom, :author}]) + # query = from(comment in ArticleComment, preload: ^article_preload) + query = from(comment in ArticleComment, preload: ^thread_atom) + + query + |> join(:inner, [comment], author in assoc(comment, :author)) + |> where([comment, author], author.id == ^user.id) + |> where([comment, author], comment.thread == ^thread) + |> QueryBuilder.filter_pack(filter) + |> ORM.paginater(~m(page size)a) + |> ORM.extract_and_assign_article() + |> done() + end + end + @doc """ get paged published comments of a user """ diff --git a/lib/groupher_server/cms/article_comment.ex b/lib/groupher_server/cms/article_comment.ex index c8055d239..908dd30db 100644 --- a/lib/groupher_server/cms/article_comment.ex +++ b/lib/groupher_server/cms/article_comment.ex @@ -17,7 +17,7 @@ defmodule GroupherServer.CMS.ArticleComment do @article_threads get_config(:article, :article_threads) @required_fields ~w(body_html author_id)a - @optional_fields ~w(reply_to_id replies_count is_folded is_deleted floor is_article_author)a + @optional_fields ~w(reply_to_id replies_count is_folded is_deleted floor is_article_author thread)a @updatable_fields ~w(is_folded is_deleted floor upvotes_count is_pinned)a @article_fields @article_threads |> Enum.map(&:"#{&1}_id") @@ -41,8 +41,6 @@ defmodule GroupherServer.CMS.ArticleComment do @doc "操作某 emotion 的最近用户" def max_latest_emotion_users_count(), do: @max_latest_emotion_users_count - - def supported_emotions(), do: @supported_emotions def delete_hint(), do: @delete_hint def report_threshold_for_fold, do: @report_threshold_for_fold @@ -52,6 +50,7 @@ defmodule GroupherServer.CMS.ArticleComment do schema "articles_comments" do belongs_to(:author, Accounts.User, foreign_key: :author_id) + field(:thread, :string) field(:body_html, :string) # 是否被折叠 field(:is_folded, :boolean, default: false) diff --git a/lib/groupher_server/cms/delegates/article_comment.ex b/lib/groupher_server/cms/delegates/article_comment.ex index 716cb8c14..835acc3d0 100644 --- a/lib/groupher_server/cms/delegates/article_comment.ex +++ b/lib/groupher_server/cms/delegates/article_comment.ex @@ -175,6 +175,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleComment do # TODO: parse editor-json # set default emotions def do_create_comment(content, foreign_key, article, %User{id: user_id}) do + thread = foreign_key |> to_string |> String.split("_id") |> List.first() |> String.upcase() + count_query = from(c in ArticleComment, where: field(c, ^foreign_key) == ^article.id) floor = Repo.aggregate(count_query, :count) + 1 @@ -187,6 +189,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleComment do emotions: @default_emotions, floor: floor, is_article_author: user_id == article.author.user.id, + thread: thread, meta: @default_comment_meta }, foreign_key, diff --git a/lib/groupher_server/cms/delegates/article_comment_action.ex b/lib/groupher_server/cms/delegates/article_comment_action.ex index 1723fe925..d063f3a7d 100644 --- a/lib/groupher_server/cms/delegates/article_comment_action.ex +++ b/lib/groupher_server/cms/delegates/article_comment_action.ex @@ -108,12 +108,10 @@ defmodule GroupherServer.CMS.Delegate.ArticleCommentAction do |> Multi.run(:create_reply_comment, fn _, _ -> do_create_comment(content, info.foreign_key, article, user) end) - |> Multi.run(:update_article_comments_count, fn _, - %{create_reply_comment: replyed_comment} -> + |> Multi.run(:update_comments_count, fn _, %{create_reply_comment: replyed_comment} -> update_article_comments_count(replyed_comment, :inc) end) - |> Multi.run(:create_article_comment_reply, fn _, - %{create_reply_comment: replyed_comment} -> + |> Multi.run(:create_comment_reply, fn _, %{create_reply_comment: replyed_comment} -> ArticleCommentReply |> ORM.create(%{article_comment_id: replyed_comment.id, reply_to_id: replying_comment.id}) end) diff --git a/lib/groupher_server_web/resolvers/accounts_resolver.ex b/lib/groupher_server_web/resolvers/accounts_resolver.ex index f44f0c2db..916eb9f8f 100644 --- a/lib/groupher_server_web/resolvers/accounts_resolver.ex +++ b/lib/groupher_server_web/resolvers/accounts_resolver.ex @@ -179,14 +179,34 @@ defmodule GroupherServerWeb.Resolvers.Accounts do end # published contents - def published_articles(_root, ~m(user_id filter thread)a, _info) do - Accounts.published_articles(%User{id: user_id}, thread, filter) + def published_articles(_root, ~m(login filter thread)a, _info) do + with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do + Accounts.published_articles(%User{id: user_id}, thread, filter) + else + _ -> raise_error(:not_exsit, "#{login} not found") + end end def published_articles(_root, ~m(filter thread)a, %{context: %{cur_user: cur_user}}) do Accounts.published_articles(cur_user, thread, filter) end + def published_article_comments(_root, ~m(login filter thread)a, _info) do + with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do + Accounts.published_article_comments(%User{id: user_id}, thread, filter) + else + _ -> raise_error(:not_exsit, "#{login} not found") + end + end + + def published_article_comments(_root, ~m(login filter)a, _info) do + with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do + Accounts.published_article_comments(%User{id: user_id}, filter) + else + _ -> raise_error(:not_exsit, "#{login} not found") + end + end + # published comments def published_comments(_root, ~m(user_id filter thread)a, _info) do Accounts.published_comments(%User{id: user_id}, thread, filter) diff --git a/lib/groupher_server_web/schema/Helper/queries.ex b/lib/groupher_server_web/schema/Helper/queries.ex index f2018bc06..308cd7e5c 100644 --- a/lib/groupher_server_web/schema/Helper/queries.ex +++ b/lib/groupher_server_web/schema/Helper/queries.ex @@ -18,7 +18,7 @@ defmodule GroupherServerWeb.Schema.Helper.Queries do field unquote(:"published_#{thread}s"), unquote(:"paged_#{thread}s") do arg(:login, non_null(:string)) arg(:filter, non_null(:paged_filter)) - arg(:thread, unquote(:"#{thread}_thread"), default_value: unquote(thread)) + arg(:thread, :thread, default_value: unquote(thread)) middleware(M.PageSizeProof) resolve(&R.Accounts.published_articles/3) diff --git a/lib/groupher_server_web/schema/account/account_queries.ex b/lib/groupher_server_web/schema/account/account_queries.ex index b6302b685..95a928950 100644 --- a/lib/groupher_server_web/schema/account/account_queries.ex +++ b/lib/groupher_server_web/schema/account/account_queries.ex @@ -88,16 +88,6 @@ defmodule GroupherServerWeb.Schema.Account.Queries do resolve(&R.Accounts.paged_collected_articles/3) end - @desc "get paged published comments on post" - field :published_post_comments, :paged_post_comments do - arg(:user_id, non_null(:id)) - arg(:filter, non_null(:paged_filter)) - arg(:thread, :post_thread, default_value: :post) - - middleware(M.PageSizeProof) - resolve(&R.Accounts.published_comments/3) - end - @desc "paged communities which the user it's the editor" field :editable_communities, :paged_communities do arg(:login, :string) @@ -121,6 +111,26 @@ defmodule GroupherServerWeb.Schema.Account.Queries do resolve(&R.Accounts.search_users/3) end + @desc "get paged published comments on post" + field :published_post_comments, :paged_post_comments do + arg(:user_id, non_null(:id)) + arg(:filter, non_null(:paged_filter)) + arg(:thread, :post_thread, default_value: :post) + + middleware(M.PageSizeProof) + resolve(&R.Accounts.published_comments/3) + end + + @desc "get paged published article comments" + field :published_article_comments, :paged_article_comments do + arg(:login, non_null(:string)) + arg(:filter, non_null(:paged_filter)) + arg(:thread, :thread, default_value: :post) + + middleware(M.PageSizeProof) + resolve(&R.Accounts.published_article_comments/3) + end + published_article_queries() end end diff --git a/lib/groupher_server_web/schema/cms/cms_types.ex b/lib/groupher_server_web/schema/cms/cms_types.ex index 2cd04c191..ffe3b02bf 100644 --- a/lib/groupher_server_web/schema/cms/cms_types.ex +++ b/lib/groupher_server_web/schema/cms/cms_types.ex @@ -328,6 +328,7 @@ defmodule GroupherServerWeb.Schema.CMS.Types do field(:replies_count, :integer) field(:reply_to, :article_comment_reply) field(:viewer_has_upvoted, :boolean) + field(:thread, :string) timestamp_fields() end @@ -345,6 +346,8 @@ defmodule GroupherServerWeb.Schema.CMS.Types do field(:reply_to, :article_comment_reply) field(:replies, list_of(:article_comment_reply)) field(:replies_count, :integer) + field(:thread, :string) + field(:article, :common_article) field(:is_deleted, :boolean) field(:viewer_has_upvoted, :boolean) diff --git a/lib/helper/orm.ex b/lib/helper/orm.ex index 469b49ef9..e16f627af 100644 --- a/lib/helper/orm.ex +++ b/lib/helper/orm.ex @@ -3,7 +3,7 @@ defmodule Helper.ORM do General CORD functions """ import Ecto.Query, warn: false - import Helper.Utils, only: [done: 1, done: 3, add: 1, strip_struct: 1] + import Helper.Utils, only: [done: 1, done: 3, add: 1, strip_struct: 1, get_config: 2] import ShortMaps import Helper.ErrorHandler @@ -12,6 +12,8 @@ defmodule Helper.ORM do alias GroupherServer.Repo alias Helper.{QueryBuilder, SpecType} + @article_threads get_config(:article, :article_threads) + @doc """ a wrap for paginate request """ @@ -293,6 +295,16 @@ defmodule Helper.ORM do |> Repo.update() end + def extract_and_assign_article(%{entries: entries} = paged_articles) do + entries = + Enum.map(entries, fn item -> + thread = Enum.find(@article_threads, &(not is_nil(Map.get(item, :"#{&1}_id")))) + Map.merge(item, %{article: export_article_info(thread, Map.get(item, thread))}) + end) + + paged_articles |> Map.put(:entries, entries) + end + @doc "extract common articles info" @spec extract_articles(T.paged_data(), [Atom.t()]) :: T.paged_article_common() def extract_articles(%{entries: entries} = paged_articles, supported_threads) do diff --git a/priv/repo/migrations/20210530060122_add_thread_to_article_comment.exs b/priv/repo/migrations/20210530060122_add_thread_to_article_comment.exs new file mode 100644 index 000000000..727d942bb --- /dev/null +++ b/priv/repo/migrations/20210530060122_add_thread_to_article_comment.exs @@ -0,0 +1,9 @@ +defmodule GroupherServer.Repo.Migrations.AddThreadToArticleComment do + use Ecto.Migration + + def change do + alter table(:articles_comments) do + add(:thread, :string) + end + end +end diff --git a/test/groupher_server/accounts/published/published_jobs_test.exs b/test/groupher_server/accounts/published/published_jobs_test.exs index 4ca442177..010d4c969 100644 --- a/test/groupher_server/accounts/published/published_jobs_test.exs +++ b/test/groupher_server/accounts/published/published_jobs_test.exs @@ -2,20 +2,22 @@ defmodule GroupherServer.Test.Accounts.Published.Job do use GroupherServer.TestTools alias GroupherServer.{Accounts, CMS} + alias Accounts.User + alias Helper.ORM @publish_count 10 setup do {:ok, user} = db_insert(:user) {:ok, user2} = db_insert(:user) + {:ok, job} = db_insert(:job) {:ok, community} = db_insert(:community) {:ok, community2} = db_insert(:community) - {:ok, ~m(user user2 community community2)a} + {:ok, ~m(user user2 job community community2)a} end describe "[publised jobs]" do - @tag :wip2 test "create job should update user published meta", ~m(community user)a do job_attrs = mock_attrs(:job, %{community_id: community.id}) {:ok, _job} = CMS.create_article(community, :job, job_attrs, user) @@ -68,4 +70,25 @@ defmodule GroupherServer.Test.Accounts.Published.Job do assert results.entries |> Enum.any?(&(&1.id == random_job_id2)) end end + + describe "[publised job comments]" do + @tag :wip2 + test "can get published article comments", ~m(job user)a do + total_count = 10 + + Enum.reduce(1..total_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:job, job.id, "commment", user) + acc ++ [comment] + end) + + filter = %{page: 1, size: 20} + {:ok, articles} = Accounts.published_article_comments(user, :job, filter) + + entries = articles.entries + article = entries |> List.first() + + assert article.article.id == job.id + assert article.article.title == job.title + end + end end diff --git a/test/groupher_server/accounts/published/published_posts_test.exs b/test/groupher_server/accounts/published/published_posts_test.exs index febfafaa3..56fe8c269 100644 --- a/test/groupher_server/accounts/published/published_posts_test.exs +++ b/test/groupher_server/accounts/published/published_posts_test.exs @@ -10,14 +10,14 @@ defmodule GroupherServer.Test.Accounts.Published.Post do setup do {:ok, user} = db_insert(:user) {:ok, user2} = db_insert(:user) + {:ok, post} = db_insert(:post) {:ok, community} = db_insert(:community) {:ok, community2} = db_insert(:community) - {:ok, ~m(user user2 community community2)a} + {:ok, ~m(user user2 post community community2)a} end - describe "[Publised posts]" do - @tag :wip2 + describe "[publised posts]" do test "create post should update user published meta", ~m(community user)a do post_attrs = mock_attrs(:post, %{community_id: community.id}) {:ok, _post} = CMS.create_article(community, :post, post_attrs, user) @@ -71,93 +71,24 @@ defmodule GroupherServer.Test.Accounts.Published.Post do end end - describe "[Accounts Publised jobs]" do - test "fresh user get empty paged published jobs", ~m(user)a do - {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) - - assert results |> is_valid_pagination?(:raw) - assert results.total_count == 0 - end - - test "user can get paged published jobs", ~m(user user2 community community2)a do - pub_jobs = - Enum.reduce(1..@publish_count, [], fn _, acc -> - job_attrs = mock_attrs(:job, %{community_id: community.id}) - {:ok, job} = CMS.create_article(community, :job, job_attrs, user) - - acc ++ [job] - end) - - pub_jobs2 = - Enum.reduce(1..@publish_count, [], fn _, acc -> - job_attrs = mock_attrs(:job, %{community_id: community2.id}) - {:ok, job} = CMS.create_article(community, :job, job_attrs, user) - - acc ++ [job] - end) - - # unrelated other user - Enum.reduce(1..5, [], fn _, acc -> - job_attrs = mock_attrs(:job, %{community_id: community.id}) - {:ok, job} = CMS.create_article(community, :job, job_attrs, user2) - - acc ++ [job] - end) - - {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) - - assert results |> is_valid_pagination?(:raw) - assert results.total_count == @publish_count * 2 - - random_job_id = pub_jobs |> Enum.random() |> Map.get(:id) - random_job_id2 = pub_jobs2 |> Enum.random() |> Map.get(:id) - assert results.entries |> Enum.any?(&(&1.id == random_job_id)) - assert results.entries |> Enum.any?(&(&1.id == random_job_id2)) - end - end - - describe "[Accounts Publised repos]" do - test "fresh user get empty paged published repos", ~m(user)a do - {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) - - assert results |> is_valid_pagination?(:raw) - assert results.total_count == 0 - end - - test "user can get paged published repos", ~m(user user2 community community2)a do - pub_repos = - Enum.reduce(1..@publish_count, [], fn _, acc -> - repo_attrs = mock_attrs(:repo, %{community_id: community.id}) - {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) - - acc ++ [repo] - end) - - pub_repos2 = - Enum.reduce(1..@publish_count, [], fn _, acc -> - repo_attrs = mock_attrs(:repo, %{community_id: community2.id}) - {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) - - acc ++ [repo] - end) - - # unrelated other user - Enum.reduce(1..5, [], fn _, acc -> - repo_attrs = mock_attrs(:repo, %{community_id: community.id}) - {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user2) + describe "[publised post comments]" do + @tag :wip2 + test "can get published article comments", ~m(post user)a do + total_count = 10 - acc ++ [repo] + Enum.reduce(1..total_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:post, post.id, "commment", user) + acc ++ [comment] end) - {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) + filter = %{page: 1, size: 20} + {:ok, articles} = Accounts.published_article_comments(user, :post, filter) - assert results |> is_valid_pagination?(:raw) - assert results.total_count == @publish_count * 2 + entries = articles.entries + article = entries |> List.first() - random_repo_id = pub_repos |> Enum.random() |> Map.get(:id) - random_repo_id2 = pub_repos2 |> Enum.random() |> Map.get(:id) - assert results.entries |> Enum.any?(&(&1.id == random_repo_id)) - assert results.entries |> Enum.any?(&(&1.id == random_repo_id2)) + assert article.article.id == post.id + assert article.article.title == post.title end end end diff --git a/test/groupher_server/accounts/published/published_repos_test.exs b/test/groupher_server/accounts/published/published_repos_test.exs index c98b295b8..b311533a8 100644 --- a/test/groupher_server/accounts/published/published_repos_test.exs +++ b/test/groupher_server/accounts/published/published_repos_test.exs @@ -2,20 +2,22 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do use GroupherServer.TestTools alias GroupherServer.{Accounts, CMS} + alias Accounts.User + alias Helper.ORM @publish_count 10 setup do {:ok, user} = db_insert(:user) {:ok, user2} = db_insert(:user) + {:ok, repo} = db_insert(:repo) {:ok, community} = db_insert(:community) {:ok, community2} = db_insert(:community) - {:ok, ~m(user user2 community community2)a} + {:ok, ~m(user user2 repo community community2)a} end describe "[publised repos]" do - @tag :wip2 test "create repo should update user published meta", ~m(community user)a do repo_attrs = mock_attrs(:repo, %{community_id: community.id}) {:ok, _repo} = CMS.create_article(community, :repo, repo_attrs, user) @@ -68,4 +70,25 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do assert results.entries |> Enum.any?(&(&1.id == random_repo_id2)) end end + + describe "[publised repo comments]" do + @tag :wip2 + test "can get published article comments", ~m(repo user)a do + total_count = 10 + + Enum.reduce(1..total_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:repo, repo.id, "commment", user) + acc ++ [comment] + end) + + filter = %{page: 1, size: 20} + {:ok, articles} = Accounts.published_article_comments(user, :repo, filter) + + entries = articles.entries + article = entries |> List.first() + + assert article.article.id == repo.id + assert article.article.title == repo.title + 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 cc602de03..371ebab08 100644 --- a/test/groupher_server_web/mutation/cms/cms_test.exs +++ b/test/groupher_server_web/mutation/cms/cms_test.exs @@ -501,7 +501,7 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do login_conn = simu_conn(:user, user) variables = %{communityId: community.id} - created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") + login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") {:ok, user} = ORM.find(User, user.id) @@ -572,7 +572,7 @@ defmodule GroupherServer.Test.Mutation.CMS.Basic do login_conn = simu_conn(:user, user) variables = %{communityId: community.id} - created = login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") + login_conn |> mutation_result(@subscribe_query, variables, "subscribeCommunity") {:ok, user} = ORM.find(User, user.id) assert user.subscribed_communities_count == 1 diff --git a/test/groupher_server_web/query/accounts/published/published_jobs_test.exs b/test/groupher_server_web/query/accounts/published/published_jobs_test.exs new file mode 100644 index 000000000..7e171155a --- /dev/null +++ b/test/groupher_server_web/query/accounts/published/published_jobs_test.exs @@ -0,0 +1,95 @@ +defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do + use GroupherServer.TestTools + + alias GroupherServer.CMS + + @publish_count 10 + + setup do + {:ok, user} = db_insert(:user) + {:ok, job} = db_insert(:job) + {:ok, community} = db_insert(:community) + + guest_conn = simu_conn(:guest) + user_conn = simu_conn(:user, user) + + {:ok, ~m(guest_conn user_conn community job user)a} + end + + describe "[published jobs]" do + @query """ + query($login: String!, $filter: PagedFilter!) { + publishedJobs(login: $login, filter: $filter) { + entries { + id + title + author { + id + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "can get published jobs", ~m(guest_conn community user)a do + job_attrs = mock_attrs(:job, %{community_id: community.id}) + + {:ok, job} = CMS.create_article(community, :job, job_attrs, user) + {:ok, job2} = CMS.create_article(community, :job, job_attrs, user) + + variables = %{login: user.login, filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedJobs") + + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(job.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(job2.id))) + end + end + + describe "[account published comments on job]" do + @query """ + query($login: String!, $thread: Thread, $filter: PagedFilter!) { + publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + entries { + id + bodyHtml + author { + id + } + article { + id + title + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "user can get paged published comments on job", ~m(guest_conn user job)a do + pub_comments = + Enum.reduce(1..@publish_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:job, job.id, "comment", user) + acc ++ [comment] + end) + + random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string + + variables = %{login: user.login, thread: "JOB", filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + + assert results |> is_valid_pagination? + assert results["totalCount"] == @publish_count + + assert results["entries"] |> Enum.all?(&(&1["article"]["id"] == to_string(job.id))) + assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == random_comment_id)) + end + end +end diff --git a/test/groupher_server_web/query/accounts/published/published_posts_test.exs b/test/groupher_server_web/query/accounts/published/published_posts_test.exs new file mode 100644 index 000000000..b14736549 --- /dev/null +++ b/test/groupher_server_web/query/accounts/published/published_posts_test.exs @@ -0,0 +1,95 @@ +defmodule GroupherServer.Test.Query.Accounts.Published.Posts do + use GroupherServer.TestTools + + alias GroupherServer.CMS + + @publish_count 10 + + setup do + {:ok, user} = db_insert(:user) + {:ok, post} = db_insert(:post) + {:ok, community} = db_insert(:community) + + guest_conn = simu_conn(:guest) + user_conn = simu_conn(:user, user) + + {:ok, ~m(guest_conn user_conn community post user)a} + end + + describe "[published posts]" do + @query """ + query($login: String!, $filter: PagedFilter!) { + publishedPosts(login: $login, filter: $filter) { + entries { + id + title + author { + id + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "can get published posts", ~m(guest_conn community user)a do + post_attrs = mock_attrs(:post, %{community_id: community.id}) + + {:ok, post} = CMS.create_article(community, :post, post_attrs, user) + {:ok, post2} = CMS.create_article(community, :post, post_attrs, user) + + variables = %{login: user.login, filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedPosts") + + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(post.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(post2.id))) + end + end + + describe "[account published comments on post]" do + @query """ + query($login: String!, $thread: Thread, $filter: PagedFilter!) { + publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + entries { + id + bodyHtml + author { + id + } + article { + id + title + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "user can get paged published comments on post", ~m(guest_conn user post)a do + pub_comments = + Enum.reduce(1..@publish_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:post, post.id, "comment", user) + acc ++ [comment] + end) + + random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string + + variables = %{login: user.login, thread: "POST", filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + + assert results |> is_valid_pagination? + assert results["totalCount"] == @publish_count + + assert results["entries"] |> Enum.all?(&(&1["article"]["id"] == to_string(post.id))) + assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == random_comment_id)) + end + end +end diff --git a/test/groupher_server_web/query/accounts/published/published_repos_test.exs b/test/groupher_server_web/query/accounts/published/published_repos_test.exs new file mode 100644 index 000000000..865e9b881 --- /dev/null +++ b/test/groupher_server_web/query/accounts/published/published_repos_test.exs @@ -0,0 +1,95 @@ +defmodule GroupherServer.Test.Query.Accounts.Published.Repos do + use GroupherServer.TestTools + + alias GroupherServer.CMS + + @publish_count 10 + + setup do + {:ok, user} = db_insert(:user) + {:ok, repo} = db_insert(:repo) + {:ok, community} = db_insert(:community) + + guest_conn = simu_conn(:guest) + user_conn = simu_conn(:user, user) + + {:ok, ~m(guest_conn user_conn community repo user)a} + end + + describe "[published repos]" do + @query """ + query($login: String!, $filter: PagedFilter!) { + publishedRepos(login: $login, filter: $filter) { + entries { + id + title + author { + id + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "can get published repos", ~m(guest_conn community user)a do + repo_attrs = mock_attrs(:repo, %{community_id: community.id}) + + {:ok, repo} = CMS.create_article(community, :repo, repo_attrs, user) + {:ok, repo2} = CMS.create_article(community, :repo, repo_attrs, user) + + variables = %{login: user.login, filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedRepos") + + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(repo.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(repo2.id))) + end + end + + describe "[account published comments on repo]" do + @query """ + query($login: String!, $thread: Thread, $filter: PagedFilter!) { + publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + entries { + id + bodyHtml + author { + id + } + article { + id + title + } + } + totalPages + totalCount + pageSize + pageNumber + } + } + """ + @tag :wip2 + test "user can get paged published comments on repo", ~m(guest_conn user repo)a do + pub_comments = + Enum.reduce(1..@publish_count, [], fn _, acc -> + {:ok, comment} = CMS.create_article_comment(:repo, repo.id, "comment", user) + acc ++ [comment] + end) + + random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string + + variables = %{login: user.login, thread: "REPO", filter: %{page: 1, size: 20}} + results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + + assert results |> is_valid_pagination? + assert results["totalCount"] == @publish_count + + assert results["entries"] |> Enum.all?(&(&1["article"]["id"] == to_string(repo.id))) + assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) + assert results["entries"] |> Enum.any?(&(&1["id"] == random_comment_id)) + end + end +end diff --git a/test/groupher_server_web/query/accounts/published_comments_test.exs b/test/groupher_server_web/query/accounts/published_comments_test.exs deleted file mode 100644 index 0fe43c651..000000000 --- a/test/groupher_server_web/query/accounts/published_comments_test.exs +++ /dev/null @@ -1,66 +0,0 @@ -defmodule GroupherServer.Test.Query.Accounts.PublishedComments do - use GroupherServer.TestTools - - alias GroupherServer.CMS - - @publish_count 10 - - setup do - {:ok, user} = db_insert(:user) - {:ok, community} = db_insert(:community) - - guest_conn = simu_conn(:guest) - user_conn = simu_conn(:user, user) - - {:ok, ~m(guest_conn user_conn community user)a} - end - - describe "[account published comments on post]" do - @query """ - query($userId: ID!, $filter: PagedFilter!) { - publishedPostComments(userId: $userId, filter: $filter) { - entries { - id - body - author { - id - } - post { - id - title - } - } - totalPages - totalCount - pageSize - pageNumber - } - } - """ - test "user can get paged published comments on post", ~m(guest_conn user community)a do - {:ok, post} = db_insert(:post) - - pub_comments = - Enum.reduce(1..@publish_count, [], fn _, acc -> - body = "this is a test comment" - - {:ok, comment} = - CMS.create_comment(:post, post.id, %{community: community.raw, body: body}, user) - - acc ++ [comment] - end) - - random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string - - variables = %{userId: user.id, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedPostComments") - - assert results |> is_valid_pagination? - assert results["totalCount"] == @publish_count - - assert results["entries"] |> Enum.all?(&(&1["post"]["id"] == to_string(post.id))) - assert results["entries"] |> Enum.all?(&(&1["author"]["id"] == to_string(user.id))) - assert results["entries"] |> Enum.any?(&(&1["id"] == random_comment_id)) - end - end -end From 9d7bd4aae7f2198181fc5842c14c21933503974d Mon Sep 17 00:00:00 2001 From: mydearxym Date: Sun, 30 May 2021 22:53:16 +0800 Subject: [PATCH 10/10] refactor(user): add paged prefix on api --- lib/groupher_server/accounts/accounts.ex | 6 +++--- .../accounts/delegates/publish.ex | 10 +++++++--- .../resolvers/accounts_resolver.ex | 16 ++++++++-------- lib/groupher_server_web/schema/Helper/queries.ex | 4 ++-- .../schema/account/account_queries.ex | 4 ++-- .../accounts/published/published_jobs_test.exs | 6 +++--- .../accounts/published/published_posts_test.exs | 6 +++--- .../accounts/published/published_repos_test.exs | 6 +++--- .../accounts/published/published_jobs_test.exs | 8 ++++---- .../accounts/published/published_posts_test.exs | 8 ++++---- .../accounts/published/published_repos_test.exs | 8 ++++---- 11 files changed, 43 insertions(+), 39 deletions(-) diff --git a/lib/groupher_server/accounts/accounts.ex b/lib/groupher_server/accounts/accounts.ex index 36184551b..5eb3a35e4 100644 --- a/lib/groupher_server/accounts/accounts.ex +++ b/lib/groupher_server/accounts/accounts.ex @@ -46,10 +46,10 @@ defmodule GroupherServer.Accounts do # defdelegate paged_editable_communities(filter), to: Achievements # publish - defdelegate published_articles(user, thread, filter), to: Publish + defdelegate paged_published_articles(user, thread, filter), to: Publish defdelegate published_comments(user, thread, filter), to: Publish - defdelegate published_article_comments(user, thread, filter), to: Publish - defdelegate published_article_comments(user, thread), to: Publish + defdelegate paged_published_article_comments(user, thread, filter), to: Publish + defdelegate paged_published_article_comments(user, thread), to: Publish defdelegate update_published_states(user, thread), to: Publish # fans diff --git a/lib/groupher_server/accounts/delegates/publish.ex b/lib/groupher_server/accounts/delegates/publish.ex index 4c126819d..bc295c625 100644 --- a/lib/groupher_server/accounts/delegates/publish.ex +++ b/lib/groupher_server/accounts/delegates/publish.ex @@ -19,7 +19,7 @@ defmodule GroupherServer.Accounts.Delegate.Publish do @doc """ get paged published contets of a user """ - def published_articles(%User{id: user_id}, thread, filter) do + def paged_published_articles(%User{id: user_id}, thread, filter) do with {:ok, info} <- match(thread), {:ok, user} <- ORM.find(User, user_id) do do_paged_published_articles(info.model, user, filter) @@ -54,7 +54,7 @@ defmodule GroupherServer.Accounts.Delegate.Publish do |> done() end - def published_article_comments(%User{id: user_id}, %{page: page, size: size} = filter) do + def paged_published_article_comments(%User{id: user_id}, %{page: page, size: size} = filter) do with {:ok, user} <- ORM.find(User, user_id) do ArticleComment |> join(:inner, [comment], author in assoc(comment, :author)) @@ -66,7 +66,11 @@ defmodule GroupherServer.Accounts.Delegate.Publish do end end - def published_article_comments(%User{id: user_id}, thread, %{page: page, size: size} = filter) do + def paged_published_article_comments( + %User{id: user_id}, + thread, + %{page: page, size: size} = filter + ) do with {:ok, user} <- ORM.find(User, user_id) do thread = thread |> to_string |> String.upcase() thread_atom = thread |> String.downcase() |> String.to_atom() diff --git a/lib/groupher_server_web/resolvers/accounts_resolver.ex b/lib/groupher_server_web/resolvers/accounts_resolver.ex index 916eb9f8f..bf92a099e 100644 --- a/lib/groupher_server_web/resolvers/accounts_resolver.ex +++ b/lib/groupher_server_web/resolvers/accounts_resolver.ex @@ -179,29 +179,29 @@ defmodule GroupherServerWeb.Resolvers.Accounts do end # published contents - def published_articles(_root, ~m(login filter thread)a, _info) do + def paged_published_articles(_root, ~m(login filter thread)a, _info) do with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do - Accounts.published_articles(%User{id: user_id}, thread, filter) + Accounts.paged_published_articles(%User{id: user_id}, thread, filter) else _ -> raise_error(:not_exsit, "#{login} not found") end end - def published_articles(_root, ~m(filter thread)a, %{context: %{cur_user: cur_user}}) do - Accounts.published_articles(cur_user, thread, filter) + def paged_published_articles(_root, ~m(filter thread)a, %{context: %{cur_user: cur_user}}) do + Accounts.paged_published_articles(cur_user, thread, filter) end - def published_article_comments(_root, ~m(login filter thread)a, _info) do + def paged_published_article_comments(_root, ~m(login filter thread)a, _info) do with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do - Accounts.published_article_comments(%User{id: user_id}, thread, filter) + Accounts.paged_published_article_comments(%User{id: user_id}, thread, filter) else _ -> raise_error(:not_exsit, "#{login} not found") end end - def published_article_comments(_root, ~m(login filter)a, _info) do + def paged_published_article_comments(_root, ~m(login filter)a, _info) do with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do - Accounts.published_article_comments(%User{id: user_id}, filter) + Accounts.paged_published_article_comments(%User{id: user_id}, filter) else _ -> raise_error(:not_exsit, "#{login} not found") end diff --git a/lib/groupher_server_web/schema/Helper/queries.ex b/lib/groupher_server_web/schema/Helper/queries.ex index 308cd7e5c..65b388e6f 100644 --- a/lib/groupher_server_web/schema/Helper/queries.ex +++ b/lib/groupher_server_web/schema/Helper/queries.ex @@ -15,13 +15,13 @@ defmodule GroupherServerWeb.Schema.Helper.Queries do |> Enum.map(fn thread -> quote do @desc unquote("paged published #{thread}s") - field unquote(:"published_#{thread}s"), unquote(:"paged_#{thread}s") do + field unquote(:"paged_published_#{thread}s"), unquote(:"paged_#{thread}s") do arg(:login, non_null(:string)) arg(:filter, non_null(:paged_filter)) arg(:thread, :thread, default_value: unquote(thread)) middleware(M.PageSizeProof) - resolve(&R.Accounts.published_articles/3) + resolve(&R.Accounts.paged_published_articles/3) end end end) diff --git a/lib/groupher_server_web/schema/account/account_queries.ex b/lib/groupher_server_web/schema/account/account_queries.ex index 95a928950..9d31b9d58 100644 --- a/lib/groupher_server_web/schema/account/account_queries.ex +++ b/lib/groupher_server_web/schema/account/account_queries.ex @@ -122,13 +122,13 @@ defmodule GroupherServerWeb.Schema.Account.Queries do end @desc "get paged published article comments" - field :published_article_comments, :paged_article_comments do + field :paged_published_article_comments, :paged_article_comments do arg(:login, non_null(:string)) arg(:filter, non_null(:paged_filter)) arg(:thread, :thread, default_value: :post) middleware(M.PageSizeProof) - resolve(&R.Accounts.published_article_comments/3) + resolve(&R.Accounts.paged_published_article_comments/3) end published_article_queries() diff --git a/test/groupher_server/accounts/published/published_jobs_test.exs b/test/groupher_server/accounts/published/published_jobs_test.exs index 010d4c969..39be4b13b 100644 --- a/test/groupher_server/accounts/published/published_jobs_test.exs +++ b/test/groupher_server/accounts/published/published_jobs_test.exs @@ -28,7 +28,7 @@ defmodule GroupherServer.Test.Accounts.Published.Job do end test "fresh user get empty paged published jobs", ~m(user)a do - {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :job, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -59,7 +59,7 @@ defmodule GroupherServer.Test.Accounts.Published.Job do acc ++ [job] end) - {:ok, results} = Accounts.published_articles(user, :job, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :job, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Accounts.Published.Job do end) filter = %{page: 1, size: 20} - {:ok, articles} = Accounts.published_article_comments(user, :job, filter) + {:ok, articles} = Accounts.paged_published_article_comments(user, :job, filter) entries = articles.entries article = entries |> List.first() diff --git a/test/groupher_server/accounts/published/published_posts_test.exs b/test/groupher_server/accounts/published/published_posts_test.exs index 56fe8c269..38697221e 100644 --- a/test/groupher_server/accounts/published/published_posts_test.exs +++ b/test/groupher_server/accounts/published/published_posts_test.exs @@ -28,7 +28,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do end test "fresh user get empty paged published posts", ~m(user)a do - {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :post, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -59,7 +59,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do acc ++ [post] end) - {:ok, results} = Accounts.published_articles(user, :post, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :post, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do end) filter = %{page: 1, size: 20} - {:ok, articles} = Accounts.published_article_comments(user, :post, filter) + {:ok, articles} = Accounts.paged_published_article_comments(user, :post, filter) entries = articles.entries article = entries |> List.first() diff --git a/test/groupher_server/accounts/published/published_repos_test.exs b/test/groupher_server/accounts/published/published_repos_test.exs index b311533a8..8032e719a 100644 --- a/test/groupher_server/accounts/published/published_repos_test.exs +++ b/test/groupher_server/accounts/published/published_repos_test.exs @@ -28,7 +28,7 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do end test "fresh user get empty paged published repos", ~m(user)a do - {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :repo, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == 0 @@ -59,7 +59,7 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do acc ++ [repo] end) - {:ok, results} = Accounts.published_articles(user, :repo, %{page: 1, size: 20}) + {:ok, results} = Accounts.paged_published_articles(user, :repo, %{page: 1, size: 20}) assert results |> is_valid_pagination?(:raw) assert results.total_count == @publish_count * 2 @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do end) filter = %{page: 1, size: 20} - {:ok, articles} = Accounts.published_article_comments(user, :repo, filter) + {:ok, articles} = Accounts.paged_published_article_comments(user, :repo, filter) entries = articles.entries article = entries |> List.first() diff --git a/test/groupher_server_web/query/accounts/published/published_jobs_test.exs b/test/groupher_server_web/query/accounts/published/published_jobs_test.exs index 7e171155a..7b01e0a75 100644 --- a/test/groupher_server_web/query/accounts/published/published_jobs_test.exs +++ b/test/groupher_server_web/query/accounts/published/published_jobs_test.exs @@ -19,7 +19,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do describe "[published jobs]" do @query """ query($login: String!, $filter: PagedFilter!) { - publishedJobs(login: $login, filter: $filter) { + pagedPublishedJobs(login: $login, filter: $filter) { entries { id title @@ -42,7 +42,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do {:ok, job2} = CMS.create_article(community, :job, job_attrs, user) variables = %{login: user.login, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedJobs") + results = guest_conn |> query_result(@query, variables, "pagedPublishedJobs") assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(job.id))) assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(job2.id))) @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do describe "[account published comments on job]" do @query """ query($login: String!, $thread: Thread, $filter: PagedFilter!) { - publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) { entries { id bodyHtml @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string variables = %{login: user.login, thread: "JOB", filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments") assert results |> is_valid_pagination? assert results["totalCount"] == @publish_count diff --git a/test/groupher_server_web/query/accounts/published/published_posts_test.exs b/test/groupher_server_web/query/accounts/published/published_posts_test.exs index b14736549..64ffb5a17 100644 --- a/test/groupher_server_web/query/accounts/published/published_posts_test.exs +++ b/test/groupher_server_web/query/accounts/published/published_posts_test.exs @@ -19,7 +19,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do describe "[published posts]" do @query """ query($login: String!, $filter: PagedFilter!) { - publishedPosts(login: $login, filter: $filter) { + pagedPublishedPosts(login: $login, filter: $filter) { entries { id title @@ -42,7 +42,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do {:ok, post2} = CMS.create_article(community, :post, post_attrs, user) variables = %{login: user.login, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedPosts") + results = guest_conn |> query_result(@query, variables, "pagedPublishedPosts") assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(post.id))) assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(post2.id))) @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do describe "[account published comments on post]" do @query """ query($login: String!, $thread: Thread, $filter: PagedFilter!) { - publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) { entries { id bodyHtml @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string variables = %{login: user.login, thread: "POST", filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments") assert results |> is_valid_pagination? assert results["totalCount"] == @publish_count diff --git a/test/groupher_server_web/query/accounts/published/published_repos_test.exs b/test/groupher_server_web/query/accounts/published/published_repos_test.exs index 865e9b881..39265cc8c 100644 --- a/test/groupher_server_web/query/accounts/published/published_repos_test.exs +++ b/test/groupher_server_web/query/accounts/published/published_repos_test.exs @@ -19,7 +19,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do describe "[published repos]" do @query """ query($login: String!, $filter: PagedFilter!) { - publishedRepos(login: $login, filter: $filter) { + pagedPublishedRepos(login: $login, filter: $filter) { entries { id title @@ -42,7 +42,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do {:ok, repo2} = CMS.create_article(community, :repo, repo_attrs, user) variables = %{login: user.login, filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedRepos") + results = guest_conn |> query_result(@query, variables, "pagedPublishedRepos") assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(repo.id))) assert results["entries"] |> Enum.any?(&(&1["id"] == to_string(repo2.id))) @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do describe "[account published comments on repo]" do @query """ query($login: String!, $thread: Thread, $filter: PagedFilter!) { - publishedArticleComments(login: $login, thread: $thread, filter: $filter) { + pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) { entries { id bodyHtml @@ -82,7 +82,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do random_comment_id = pub_comments |> Enum.random() |> Map.get(:id) |> to_string variables = %{login: user.login, thread: "REPO", filter: %{page: 1, size: 20}} - results = guest_conn |> query_result(@query, variables, "publishedArticleComments") + results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments") assert results |> is_valid_pagination? assert results["totalCount"] == @publish_count