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

Commit 67e1c6b

Browse files
committed
refactor(viewer-solution): read-content -> read-article
1 parent 28e95ce commit 67e1c6b

File tree

10 files changed

+108
-61
lines changed

10 files changed

+108
-61
lines changed

lib/groupher_server/cms/cms.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ defmodule GroupherServer.CMS do
7070
defdelegate subscribe_default_community_ifnot(user), to: CommunityOperation
7171

7272
# ArticleCURD
73-
defdelegate read_content(thread, id, user), to: ArticleCURD
73+
defdelegate read_article(thread, id), to: ArticleCURD
74+
defdelegate read_article(thread, id, user), to: ArticleCURD
7475
defdelegate paged_contents(queryable, filter, user), to: ArticleCURD
7576
defdelegate paged_contents(queryable, filter), to: ArticleCURD
7677
defdelegate create_content(community, thread, attrs, user), to: ArticleCURD

lib/groupher_server/cms/delegates/article_curd.ex

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,46 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
55
import Ecto.Query, warn: false
66

77
import GroupherServer.CMS.Utils.Matcher2
8+
import GroupherServer.CMS.Utils.Matcher, only: [match_action: 2]
89

9-
import GroupherServer.CMS.Utils.Matcher, only: [match_action: 2, dynamic_where: 2]
1010
import Helper.Utils, only: [done: 1, pick_by: 2, integerfy: 1]
1111
import Helper.ErrorCode
12-
import ShortMaps
1312

13+
alias Helper.{Later, ORM}
1414
alias GroupherServer.{Accounts, CMS, Delivery, Email, Repo, Statistics}
1515

1616
alias Accounts.User
1717
alias CMS.{Author, Community, PinnedArticle, Embeds, Delegate, Tag}
1818

1919
alias Delegate.ArticleOperation
20-
alias Helper.{Later, ORM, QueryBuilder}
2120

2221
alias Ecto.Multi
2322

2423
@default_article_meta Embeds.ArticleMeta.default_meta()
2524

2625
@doc """
27-
login user read cms content by add views count and viewer record
26+
read articles for un-logined user
2827
"""
29-
def read_content(thread, id, %User{id: user_id}) do
30-
condition = %{user_id: user_id} |> Map.merge(content_id(thread, id))
28+
def read_article(thread, id) do
29+
with {:ok, info} <- match(thread) do
30+
ORM.read(info.model, id, inc: :views)
31+
end
32+
end
3133

32-
with {:ok, action} <- match_action(thread, :self),
33-
{:ok, _viewer} <- action.viewer |> ORM.findby_or_insert(condition, condition) do
34-
action.target |> ORM.read(id, inc: :views)
34+
@doc """
35+
read articles for logined user
36+
"""
37+
def read_article(thread, id, %User{id: user_id}) do
38+
with {:ok, info} <- match(thread) do
39+
Multi.new()
40+
|> Multi.run(:inc_views, fn _, _ ->
41+
ORM.read(info.model, id, inc: :views)
42+
end)
43+
|> Multi.run(:add_viewed_user, fn _, %{inc_views: article} ->
44+
update_viewed_user_list(article, user_id)
45+
end)
46+
|> Repo.transaction()
47+
|> read_result()
3548
end
3649
end
3750

@@ -417,4 +430,32 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
417430
end
418431

419432
defp exec_update_tags(_content, _), do: {:ok, :pass}
433+
434+
defp update_viewed_user_list(%{meta: nil} = article, user_id) do
435+
new_ids = Enum.uniq([user_id] ++ @default_article_meta.viewed_user_ids)
436+
updated_meta = @default_article_meta |> Map.merge(%{viewed_user_ids: new_ids})
437+
438+
article
439+
|> Ecto.Changeset.change()
440+
|> Ecto.Changeset.put_embed(:meta, updated_meta)
441+
|> Repo.update()
442+
end
443+
444+
defp update_viewed_user_list(%{meta: meta} = article, user_id) do
445+
new_ids = Enum.uniq([user_id] ++ meta.viewed_user_ids)
446+
447+
updated_meta =
448+
meta |> Map.merge(%{viewed_user_ids: new_ids}) |> Map.from_struct() |> Map.delete(:id)
449+
450+
article
451+
|> Ecto.Changeset.change()
452+
|> Ecto.Changeset.put_embed(:meta, updated_meta)
453+
|> Repo.update()
454+
end
455+
456+
defp read_result({:ok, %{inc_views: result}}), do: result |> done()
457+
458+
defp read_result({:error, _, result, _steps}) do
459+
{:error, result}
460+
end
420461
end

lib/groupher_server_web/resolvers/cms_resolver.ex

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,14 @@ defmodule GroupherServerWeb.Resolvers.CMS do
4646
# #######################
4747
# community thread (post, job), login user should be logged
4848
# #######################
49-
def post(_root, %{id: id}, %{context: %{cur_user: user}}) do
50-
CMS.read_content(:post, id, user)
49+
def read_article(_root, %{thread: thread, id: id}, %{context: %{cur_user: user}}) do
50+
CMS.read_article(thread, id, user)
5151
end
5252

53-
def post(_root, %{id: id}, _info),
54-
do: Post |> ORM.read(id, inc: :views)
55-
56-
def job(_root, %{id: id}, %{context: %{cur_user: user}}) do
57-
CMS.read_content(:job, id, user)
53+
def read_article(_root, %{thread: thread, id: id}, _info) do
54+
CMS.read_article(thread, id)
5855
end
5956

60-
def job(_root, %{id: id}, _info), do: Job |> ORM.read(id, inc: :views)
61-
62-
def repo(_root, %{id: id}, %{context: %{cur_user: user}}) do
63-
CMS.read_content(:repo, id, user)
64-
end
65-
66-
def repo(_root, %{id: id}, _info), do: Repo |> ORM.read(id, inc: :views)
67-
6857
def wiki(_root, ~m(community)a, _info), do: CMS.get_wiki(%Community{raw: community})
6958
def cheatsheet(_root, ~m(community)a, _info), do: CMS.get_cheatsheet(%Community{raw: community})
7059

lib/groupher_server_web/schema/cms/cms_queries.ex

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
6868
@desc "get post by id"
6969
field :post, non_null(:post) do
7070
arg(:id, non_null(:id))
71-
resolve(&R.CMS.post/3)
71+
arg(:thread, :post_thread, default_value: :post)
72+
73+
resolve(&R.CMS.read_article/3)
7274
end
7375

7476
@desc "get paged posts"
@@ -82,7 +84,9 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
8284
@desc "get repo by id"
8385
field :repo, non_null(:repo) do
8486
arg(:id, non_null(:id))
85-
resolve(&R.CMS.repo/3)
87+
arg(:thread, :repo_thread, default_value: :repo)
88+
89+
resolve(&R.CMS.read_article/3)
8690
end
8791

8892
@desc "get paged repos"
@@ -93,22 +97,12 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
9397
resolve(&R.CMS.paged_repos/3)
9498
end
9599

96-
@desc "get wiki by community raw name"
97-
field :wiki, non_null(:wiki) do
98-
arg(:community, :string)
99-
resolve(&R.CMS.wiki/3)
100-
end
101-
102-
@desc "get cheatsheet by community raw name"
103-
field :cheatsheet, non_null(:cheatsheet) do
104-
arg(:community, :string)
105-
resolve(&R.CMS.cheatsheet/3)
106-
end
107-
108100
@desc "get job by id"
109101
field :job, non_null(:job) do
110102
arg(:id, non_null(:id))
111-
resolve(&R.CMS.job/3)
103+
arg(:thread, :job_thread, default_value: :job)
104+
105+
resolve(&R.CMS.read_article/3)
112106
end
113107

114108
@desc "get paged jobs"
@@ -119,6 +113,18 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
119113
resolve(&R.CMS.paged_jobs/3)
120114
end
121115

116+
@desc "get wiki by community raw name"
117+
field :wiki, non_null(:wiki) do
118+
arg(:community, :string)
119+
resolve(&R.CMS.wiki/3)
120+
end
121+
122+
@desc "get cheatsheet by community raw name"
123+
field :cheatsheet, non_null(:cheatsheet) do
124+
arg(:community, :string)
125+
resolve(&R.CMS.cheatsheet/3)
126+
end
127+
122128
@desc "get paged upvoted users of an article"
123129
field :upvoted_users, :paged_users do
124130
arg(:id, non_null(:id))
@@ -139,17 +145,6 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
139145
resolve(&R.CMS.collected_users/3)
140146
end
141147

142-
@desc "get paged users of a reaction related to cms content"
143-
field :reaction_users, :paged_users do
144-
arg(:id, non_null(:id))
145-
arg(:thread, :react_thread, default_value: :post)
146-
arg(:action, non_null(:react_action))
147-
arg(:filter, non_null(:paged_filter))
148-
149-
middleware(M.PageSizeProof)
150-
resolve(&R.CMS.reaction_users/3)
151-
end
152-
153148
# get all tags
154149
@desc "get paged tags"
155150
field :paged_tags, :paged_tags do

test/groupher_server/cms/article_collect_test.exs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ defmodule GroupherServer.Test.ArticleCollect do
6464
assert user_exist_in?(user2, users.entries)
6565
end
6666

67-
@tag :wip2
6867
test "post meta history should be updated", ~m(user user2 community post_attrs)a do
6968
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
7069
{:ok, _} = CMS.collect_article(:post, post.id, user)
@@ -79,7 +78,6 @@ defmodule GroupherServer.Test.ArticleCollect do
7978
assert user2.id in article.meta.collected_user_ids
8079
end
8180

82-
@tag :wip2
8381
test "post meta history should be updated after undo collect",
8482
~m(user user2 community post_attrs)a do
8583
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
@@ -148,7 +146,6 @@ defmodule GroupherServer.Test.ArticleCollect do
148146
assert user_exist_in?(user2, users.entries)
149147
end
150148

151-
@tag :wip2
152149
test "job meta history should be updated", ~m(user user2 community job_attrs)a do
153150
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
154151
{:ok, _} = CMS.collect_article(:job, job.id, user)
@@ -162,7 +159,6 @@ defmodule GroupherServer.Test.ArticleCollect do
162159
assert user2.id in article.meta.collected_user_ids
163160
end
164161

165-
@tag :wip2
166162
test "job meta history should be updated after undo collect",
167163
~m(user user2 community job_attrs)a do
168164
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)

test/groupher_server/cms/article_upvote_test.exs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ defmodule GroupherServer.Test.ArticleUpvote do
5656
assert user_exist_in?(user2, users.entries)
5757
end
5858

59-
@tag :wip2
6059
test "post meta history should be updated after upvote",
6160
~m(user user2 community post_attrs)a do
6261
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
@@ -68,7 +67,6 @@ defmodule GroupherServer.Test.ArticleUpvote do
6867
assert user2.id in article.meta.upvoted_user_ids
6968
end
7069

71-
@tag :wip2
7270
test "post meta history should be updated after undo upvote",
7371
~m(user user2 community post_attrs)a do
7472
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
@@ -128,7 +126,6 @@ defmodule GroupherServer.Test.ArticleUpvote do
128126
assert user_exist_in?(user2, users.entries)
129127
end
130128

131-
@tag :wip2
132129
test "job meta history should be updated", ~m(user user2 community job_attrs)a do
133130
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
134131
{:ok, article} = CMS.upvote_article(:job, job.id, user)
@@ -139,7 +136,6 @@ defmodule GroupherServer.Test.ArticleUpvote do
139136
assert user2.id in article.meta.upvoted_user_ids
140137
end
141138

142-
@tag :wip2
143139
test "job meta history should be updated after undo upvote",
144140
~m(user user2 community job_attrs)a do
145141
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)

test/groupher_server/cms/post_test.exs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ defmodule GroupherServer.Test.CMS.Post do
66

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

1213
post_attrs = mock_attrs(:post, %{community_id: community.id})
1314

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

1718
describe "[cms post curd]" do
@@ -25,6 +26,28 @@ defmodule GroupherServer.Test.CMS.Post do
2526
assert post.title == post_attrs.title
2627
end
2728

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

test/groupher_server_web/query/cms/job_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ defmodule GroupherServer.Test.Query.Job do
1919
}
2020
}
2121
"""
22+
@tag :wip2
2223
test "basic graphql query on job with logined user", ~m(user_conn job)a do
2324
variables = %{id: job.id}
2425
results = user_conn |> query_result(@query, variables, "job")
@@ -29,6 +30,7 @@ defmodule GroupherServer.Test.Query.Job do
2930
assert length(Map.keys(results)) == 3
3031
end
3132

33+
@tag :wip2
3234
test "basic graphql query on job with stranger(unloged user)", ~m(guest_conn job)a do
3335
variables = %{id: job.id}
3436
results = guest_conn |> query_result(@query, variables, "job")

test/groupher_server_web/query/cms/post_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ defmodule GroupherServer.Test.Query.Post do
2828
}
2929
}
3030
"""
31+
@tag :wip2
3132
test "basic graphql query on post with logined user",
3233
~m(user_conn community user post_attrs)a do
3334
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
@@ -42,6 +43,7 @@ defmodule GroupherServer.Test.Query.Post do
4243
assert length(Map.keys(results)) == 4
4344
end
4445

46+
@tag :wip2
4547
test "basic graphql query on post with stranger(unloged user)", ~m(guest_conn post)a do
4648
variables = %{id: post.id}
4749
results = guest_conn |> query_result(@query, variables, "post")

test/groupher_server_web/query/cms/repo_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ defmodule GroupherServer.Test.Query.Repo do
1919
}
2020
}
2121
"""
22+
@tag :wip2
2223
test "basic graphql query on repo with logined user", ~m(user_conn repo)a do
2324
variables = %{id: repo.id}
2425
results = user_conn |> query_result(@query, variables, "repo")
@@ -29,6 +30,7 @@ defmodule GroupherServer.Test.Query.Repo do
2930
assert length(Map.keys(results)) == 3
3031
end
3132

33+
@tag :wip2
3234
test "basic graphql query on repo with stranger(unloged user)", ~m(guest_conn repo)a do
3335
variables = %{id: repo.id}
3436
results = guest_conn |> query_result(@query, variables, "repo")

0 commit comments

Comments
 (0)