From b1942d1a69c53470e107b94a0f86cfd3555e9c27 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Fri, 7 May 2021 16:43:54 +0800 Subject: [PATCH] refactor(article): update viewer_user_id calc logic --- .../cms/delegates/article_curd.ex | 29 +++++++++++++------ .../cms/article_comment_emotions_test.exs | 2 +- test/groupher_server/cms/job_test.exs | 25 +++++++++++++++- test/groupher_server/cms/post_test.exs | 2 +- test/groupher_server/cms/repo_test.exs | 25 +++++++++++++++- .../mutation/accounts/customization_test.exs | 2 +- .../query/cms/article_comment_test.exs | 2 +- 7 files changed, 72 insertions(+), 15 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 66a618e09..c50821d01 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -443,25 +443,36 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do defp exec_update_tags(_content, _), do: {:ok, :pass} + # TODO: move to utils + defp strip_struct(struct) do + struct |> Map.from_struct() |> Map.delete(:id) + end + defp update_viewed_user_list(%{meta: nil} = article, user_id) do new_ids = Enum.uniq([user_id] ++ @default_article_meta.viewed_user_ids) - updated_meta = @default_article_meta |> Map.merge(%{viewed_user_ids: new_ids}) + meta = @default_article_meta |> Map.merge(%{viewed_user_ids: new_ids}) - article - |> Ecto.Changeset.change() - |> Ecto.Changeset.put_embed(:meta, updated_meta) - |> Repo.update() + do_update_viewed_user_list(article, meta) end defp update_viewed_user_list(%{meta: meta} = article, user_id) do - new_ids = Enum.uniq([user_id] ++ meta.viewed_user_ids) + user_not_viewed = not Enum.member?(meta.viewed_user_ids, user_id) - updated_meta = - meta |> Map.merge(%{viewed_user_ids: new_ids}) |> Map.from_struct() |> Map.delete(:id) + case Enum.empty?(meta.viewed_user_ids) or user_not_viewed do + true -> + new_ids = Enum.uniq([user_id] ++ meta.viewed_user_ids) + meta = meta |> Map.merge(%{viewed_user_ids: new_ids}) |> strip_struct + do_update_viewed_user_list(article, meta) + + false -> + {:ok, :pass} + end + end + defp do_update_viewed_user_list(article, meta) do article |> Ecto.Changeset.change() - |> Ecto.Changeset.put_embed(:meta, updated_meta) + |> Ecto.Changeset.put_embed(:meta, meta) |> Repo.update() end diff --git a/test/groupher_server/cms/article_comment_emotions_test.exs b/test/groupher_server/cms/article_comment_emotions_test.exs index d27508dd7..bbda52c2b 100644 --- a/test/groupher_server/cms/article_comment_emotions_test.exs +++ b/test/groupher_server/cms/article_comment_emotions_test.exs @@ -22,7 +22,7 @@ defmodule GroupherServer.Test.CMS.ArticleCommentEmotions do end describe "[emotion in paged article comment]" do - @tag :wip2 + @tag :wip3 test "login user should got viewer has emotioned status", ~m(post user)a do total_count = 0 page_number = 10 diff --git a/test/groupher_server/cms/job_test.exs b/test/groupher_server/cms/job_test.exs index aa47ac687..297468cd6 100644 --- a/test/groupher_server/cms/job_test.exs +++ b/test/groupher_server/cms/job_test.exs @@ -6,11 +6,12 @@ defmodule GroupherServer.Test.Job do setup do {:ok, user} = db_insert(:user) + {:ok, user2} = db_insert(:user) {:ok, community} = db_insert(:community) job_attrs = mock_attrs(:job, %{community_id: community.id}) - {:ok, ~m(user community job_attrs)a} + {:ok, ~m(user user2 community job_attrs)a} end describe "[cms jobs curd]" do @@ -24,6 +25,28 @@ defmodule GroupherServer.Test.Job do assert found.title == job.title end + @tag :wip2 + test "read job should update views and meta viewed_user_list", + ~m(job_attrs community user user2)a do + {:ok, job} = CMS.create_content(community, :job, job_attrs, user) + {:ok, _} = CMS.read_article(:job, job.id, user) + {:ok, _created} = ORM.find(CMS.Job, job.id) + + # same user duplicate case + {:ok, _} = CMS.read_article(:job, job.id, user) + {:ok, created} = ORM.find(CMS.Job, job.id) + + assert created.meta.viewed_user_ids |> length == 1 + assert user.id in created.meta.viewed_user_ids + + {:ok, _} = CMS.read_article(:job, job.id, user2) + {:ok, created} = ORM.find(CMS.Job, job.id) + + assert created.meta.viewed_user_ids |> length == 2 + assert user.id in created.meta.viewed_user_ids + assert user2.id in created.meta.viewed_user_ids + end + test "created job has origial community info", ~m(user community job_attrs)a do {:ok, job} = CMS.create_content(community, :job, job_attrs, user) {:ok, found} = ORM.find(CMS.Job, job.id, preload: :origial_community) diff --git a/test/groupher_server/cms/post_test.exs b/test/groupher_server/cms/post_test.exs index 4f4743e80..e333d460d 100644 --- a/test/groupher_server/cms/post_test.exs +++ b/test/groupher_server/cms/post_test.exs @@ -26,7 +26,7 @@ defmodule GroupherServer.Test.CMS.Post do assert post.title == post_attrs.title end - @tag :wip3 + @tag :wip2 test "read post should update views and meta viewed_user_list", ~m(post_attrs community user user2)a do {:ok, post} = CMS.create_content(community, :post, post_attrs, user) diff --git a/test/groupher_server/cms/repo_test.exs b/test/groupher_server/cms/repo_test.exs index aec1e565d..e54709755 100644 --- a/test/groupher_server/cms/repo_test.exs +++ b/test/groupher_server/cms/repo_test.exs @@ -6,12 +6,13 @@ defmodule GroupherServer.Test.Repo do setup do {:ok, user} = db_insert(:user) + {:ok, user2} = db_insert(:user) # {:ok, post} = db_insert(:post) {:ok, community} = db_insert(:community) repo_attrs = mock_attrs(:repo, %{community_id: community.id}) - {:ok, ~m(user community repo_attrs)a} + {:ok, ~m(user user2 community repo_attrs)a} end describe "[cms repo curd]" do @@ -26,6 +27,28 @@ defmodule GroupherServer.Test.Repo do assert repo.contributors |> length !== 0 end + @tag :wip2 + test "read repo should update views and meta viewed_user_list", + ~m(repo_attrs community user user2)a do + {:ok, repo} = CMS.create_content(community, :repo, repo_attrs, user) + {:ok, _} = CMS.read_article(:repo, repo.id, user) + {:ok, _created} = ORM.find(CMS.Repo, repo.id) + + # same user duplicate case + {:ok, _} = CMS.read_article(:repo, repo.id, user) + {:ok, created} = ORM.find(CMS.Repo, repo.id) + + assert created.meta.viewed_user_ids |> length == 1 + assert user.id in created.meta.viewed_user_ids + + {:ok, _} = CMS.read_article(:repo, repo.id, user2) + {:ok, created} = ORM.find(CMS.Repo, repo.id) + + assert created.meta.viewed_user_ids |> length == 2 + assert user.id in created.meta.viewed_user_ids + assert user2.id in created.meta.viewed_user_ids + end + test "created repo has origial community info", ~m(user community repo_attrs)a do {:ok, repo} = CMS.create_content(community, :repo, repo_attrs, user) {:ok, found} = ORM.find(CMS.Repo, repo.id, preload: :origial_community) diff --git a/test/groupher_server_web/mutation/accounts/customization_test.exs b/test/groupher_server_web/mutation/accounts/customization_test.exs index de3de03cd..8f42ad231 100644 --- a/test/groupher_server_web/mutation/accounts/customization_test.exs +++ b/test/groupher_server_web/mutation/accounts/customization_test.exs @@ -72,7 +72,7 @@ defmodule GroupherServer.Test.Mutation.Account.Customization do } } """ - @tag :wip2 + @tag :wip3 test "PageSizeProof middleware should lint c11n displayDensity size", ~m(user)a do user_conn = simu_conn(:user, user) db_insert_multi(:post, 50) diff --git a/test/groupher_server_web/query/cms/article_comment_test.exs b/test/groupher_server_web/query/cms/article_comment_test.exs index 81311a64b..964c7dbfb 100644 --- a/test/groupher_server_web/query/cms/article_comment_test.exs +++ b/test/groupher_server_web/query/cms/article_comment_test.exs @@ -395,7 +395,7 @@ defmodule GroupherServer.Test.Query.ArticleComment do assert the_random_comment |> get_in(["meta", "isArticleAuthorUpvoted"]) end - @tag :wip2 + @tag :wip3 test "guest user can get paged comment with emotions info", ~m(guest_conn post user user2)a do total_count = 2