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

Commit 2c40202

Browse files
authored
refactor(article): update viewer_user_id calc logic (#337)
1 parent 73cf641 commit 2c40202

File tree

7 files changed

+72
-15
lines changed

7 files changed

+72
-15
lines changed

lib/groupher_server/cms/delegates/article_curd.ex

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -443,25 +443,36 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
443443

444444
defp exec_update_tags(_content, _), do: {:ok, :pass}
445445

446+
# TODO: move to utils
447+
defp strip_struct(struct) do
448+
struct |> Map.from_struct() |> Map.delete(:id)
449+
end
450+
446451
defp update_viewed_user_list(%{meta: nil} = article, user_id) do
447452
new_ids = Enum.uniq([user_id] ++ @default_article_meta.viewed_user_ids)
448-
updated_meta = @default_article_meta |> Map.merge(%{viewed_user_ids: new_ids})
453+
meta = @default_article_meta |> Map.merge(%{viewed_user_ids: new_ids})
449454

450-
article
451-
|> Ecto.Changeset.change()
452-
|> Ecto.Changeset.put_embed(:meta, updated_meta)
453-
|> Repo.update()
455+
do_update_viewed_user_list(article, meta)
454456
end
455457

456458
defp update_viewed_user_list(%{meta: meta} = article, user_id) do
457-
new_ids = Enum.uniq([user_id] ++ meta.viewed_user_ids)
459+
user_not_viewed = not Enum.member?(meta.viewed_user_ids, user_id)
458460

459-
updated_meta =
460-
meta |> Map.merge(%{viewed_user_ids: new_ids}) |> Map.from_struct() |> Map.delete(:id)
461+
case Enum.empty?(meta.viewed_user_ids) or user_not_viewed do
462+
true ->
463+
new_ids = Enum.uniq([user_id] ++ meta.viewed_user_ids)
464+
meta = meta |> Map.merge(%{viewed_user_ids: new_ids}) |> strip_struct
465+
do_update_viewed_user_list(article, meta)
466+
467+
false ->
468+
{:ok, :pass}
469+
end
470+
end
461471

472+
defp do_update_viewed_user_list(article, meta) do
462473
article
463474
|> Ecto.Changeset.change()
464-
|> Ecto.Changeset.put_embed(:meta, updated_meta)
475+
|> Ecto.Changeset.put_embed(:meta, meta)
465476
|> Repo.update()
466477
end
467478

test/groupher_server/cms/article_comment_emotions_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ defmodule GroupherServer.Test.CMS.ArticleCommentEmotions do
2222
end
2323

2424
describe "[emotion in paged article comment]" do
25-
@tag :wip2
25+
@tag :wip3
2626
test "login user should got viewer has emotioned status", ~m(post user)a do
2727
total_count = 0
2828
page_number = 10

test/groupher_server/cms/job_test.exs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ defmodule GroupherServer.Test.Job do
66

77
setup do
88
{:ok, user} = db_insert(:user)
9+
{:ok, user2} = db_insert(:user)
910
{:ok, community} = db_insert(:community)
1011

1112
job_attrs = mock_attrs(:job, %{community_id: community.id})
1213

13-
{:ok, ~m(user community job_attrs)a}
14+
{:ok, ~m(user user2 community job_attrs)a}
1415
end
1516

1617
describe "[cms jobs curd]" do
@@ -24,6 +25,28 @@ defmodule GroupherServer.Test.Job do
2425
assert found.title == job.title
2526
end
2627

28+
@tag :wip2
29+
test "read job should update views and meta viewed_user_list",
30+
~m(job_attrs community user user2)a do
31+
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
32+
{:ok, _} = CMS.read_article(:job, job.id, user)
33+
{:ok, _created} = ORM.find(CMS.Job, job.id)
34+
35+
# same user duplicate case
36+
{:ok, _} = CMS.read_article(:job, job.id, user)
37+
{:ok, created} = ORM.find(CMS.Job, job.id)
38+
39+
assert created.meta.viewed_user_ids |> length == 1
40+
assert user.id in created.meta.viewed_user_ids
41+
42+
{:ok, _} = CMS.read_article(:job, job.id, user2)
43+
{:ok, created} = ORM.find(CMS.Job, job.id)
44+
45+
assert created.meta.viewed_user_ids |> length == 2
46+
assert user.id in created.meta.viewed_user_ids
47+
assert user2.id in created.meta.viewed_user_ids
48+
end
49+
2750
test "created job has origial community info", ~m(user community job_attrs)a do
2851
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
2952
{:ok, found} = ORM.find(CMS.Job, job.id, preload: :origial_community)

test/groupher_server/cms/post_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ defmodule GroupherServer.Test.CMS.Post do
2626
assert post.title == post_attrs.title
2727
end
2828

29-
@tag :wip3
29+
@tag :wip2
3030
test "read post should update views and meta viewed_user_list",
3131
~m(post_attrs community user user2)a do
3232
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)

test/groupher_server/cms/repo_test.exs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ defmodule GroupherServer.Test.Repo do
66

77
setup do
88
{:ok, user} = db_insert(:user)
9+
{:ok, user2} = db_insert(:user)
910
# {:ok, post} = db_insert(:post)
1011
{:ok, community} = db_insert(:community)
1112

1213
repo_attrs = mock_attrs(:repo, %{community_id: community.id})
1314

14-
{:ok, ~m(user community repo_attrs)a}
15+
{:ok, ~m(user user2 community repo_attrs)a}
1516
end
1617

1718
describe "[cms repo curd]" do
@@ -26,6 +27,28 @@ defmodule GroupherServer.Test.Repo do
2627
assert repo.contributors |> length !== 0
2728
end
2829

30+
@tag :wip2
31+
test "read repo should update views and meta viewed_user_list",
32+
~m(repo_attrs community user user2)a do
33+
{:ok, repo} = CMS.create_content(community, :repo, repo_attrs, user)
34+
{:ok, _} = CMS.read_article(:repo, repo.id, user)
35+
{:ok, _created} = ORM.find(CMS.Repo, repo.id)
36+
37+
# same user duplicate case
38+
{:ok, _} = CMS.read_article(:repo, repo.id, user)
39+
{:ok, created} = ORM.find(CMS.Repo, repo.id)
40+
41+
assert created.meta.viewed_user_ids |> length == 1
42+
assert user.id in created.meta.viewed_user_ids
43+
44+
{:ok, _} = CMS.read_article(:repo, repo.id, user2)
45+
{:ok, created} = ORM.find(CMS.Repo, repo.id)
46+
47+
assert created.meta.viewed_user_ids |> length == 2
48+
assert user.id in created.meta.viewed_user_ids
49+
assert user2.id in created.meta.viewed_user_ids
50+
end
51+
2952
test "created repo has origial community info", ~m(user community repo_attrs)a do
3053
{:ok, repo} = CMS.create_content(community, :repo, repo_attrs, user)
3154
{:ok, found} = ORM.find(CMS.Repo, repo.id, preload: :origial_community)

test/groupher_server_web/mutation/accounts/customization_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ defmodule GroupherServer.Test.Mutation.Account.Customization do
7272
}
7373
}
7474
"""
75-
@tag :wip2
75+
@tag :wip3
7676
test "PageSizeProof middleware should lint c11n displayDensity size", ~m(user)a do
7777
user_conn = simu_conn(:user, user)
7878
db_insert_multi(:post, 50)

test/groupher_server_web/query/cms/article_comment_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ defmodule GroupherServer.Test.Query.ArticleComment do
395395
assert the_random_comment |> get_in(["meta", "isArticleAuthorUpvoted"])
396396
end
397397

398-
@tag :wip2
398+
@tag :wip3
399399
test "guest user can get paged comment with emotions info",
400400
~m(guest_conn post user user2)a do
401401
total_count = 2

0 commit comments

Comments
 (0)