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

Commit 4c8ebc3

Browse files
committed
refactor(viewer-solution): wip
1 parent 67e1c6b commit 4c8ebc3

File tree

14 files changed

+153
-88
lines changed

14 files changed

+153
-88
lines changed

lib/groupher_server/cms/cms.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ defmodule GroupherServer.CMS do
7272
# ArticleCURD
7373
defdelegate read_article(thread, id), to: ArticleCURD
7474
defdelegate read_article(thread, id, user), to: ArticleCURD
75+
76+
defdelegate paged_articles(queryable, filter), to: ArticleCURD
77+
defdelegate paged_articles(queryable, filter, user), to: ArticleCURD
78+
7579
defdelegate paged_contents(queryable, filter, user), to: ArticleCURD
7680
defdelegate paged_contents(queryable, filter), to: ArticleCURD
7781
defdelegate create_content(community, thread, attrs, user), to: ArticleCURD

lib/groupher_server/cms/delegates/article_curd.ex

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,47 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
4848
end
4949
end
5050

51+
def paged_articles(thread, filter) do
52+
with {:ok, info} <- match(thread) do
53+
info.model
54+
|> domain_filter_query(filter)
55+
|> community_with_flag_query(filter)
56+
|> ORM.find_all(filter)
57+
|> add_pin_contents_ifneed(info.model, filter)
58+
end
59+
end
60+
61+
def paged_articles(thread, filter, %User{} = user) do
62+
with {:ok, info} <- match(thread) do
63+
info.model
64+
|> domain_filter_query(filter)
65+
|> community_with_flag_query(filter)
66+
|> ORM.find_all(filter)
67+
|> add_pin_contents_ifneed(info.model, filter)
68+
|> mark_viewer_has_states(user)
69+
end
70+
end
71+
72+
defp mark_viewer_has_states({:ok, %{entries: []} = contents}, _), do: {:ok, contents}
73+
74+
defp mark_viewer_has_states({:ok, %{entries: entries} = contents}, user) do
75+
entries = Enum.map(entries, &Map.merge(&1, do_mark_viewer_has_states(&1.meta, user)))
76+
{:ok, Map.merge(contents, %{entries: entries})}
77+
end
78+
79+
defp mark_viewer_has_states({:error, reason}, _), do: {:error, reason}
80+
81+
defp do_mark_viewer_has_states(meta, %User{id: user_id}) do
82+
# TODO: 根据是否付费进一步判断
83+
# user_is_member = true
84+
%{
85+
viewer_has_collected: Enum.member?(meta.collected_user_ids, user_id),
86+
viewer_has_upvoted: Enum.member?(meta.upvoted_user_ids, user_id),
87+
viewer_has_viewed: Enum.member?(meta.viewed_user_ids, user_id),
88+
viewer_has_reported: Enum.member?(meta.reported_user_ids, user_id)
89+
}
90+
end
91+
5192
@doc """
5293
get paged post / job ...
5394
"""

lib/groupher_server/cms/post.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ defmodule GroupherServer.CMS.Post do
4040
field(:length, :integer)
4141
field(:views, :integer, default: 0)
4242

43+
belongs_to(:author, Author)
4344
embeds_one(:meta, Embeds.ArticleMeta, on_replace: :update)
4445

4546
has_many(:community_flags, {"posts_communities_flags", PostCommunityFlag})
@@ -49,7 +50,10 @@ defmodule GroupherServer.CMS.Post do
4950
field(:is_pinned, :boolean, default: false, virtual: true)
5051
field(:trash, :boolean, default_value: false, virtual: true)
5152

52-
belongs_to(:author, Author)
53+
field(:viewer_has_viewed, :boolean, default: false, virtual: true)
54+
field(:viewer_has_upvoted, :boolean, default: false, virtual: true)
55+
field(:viewer_has_collected, :boolean, default: false, virtual: true)
56+
field(:viewer_has_reported, :boolean, default: false, virtual: true)
5357

5458
# TODO
5559
# 相关文章

lib/groupher_server_web/resolvers/cms_resolver.ex

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ defmodule GroupherServerWeb.Resolvers.CMS do
88
alias GroupherServer.{Accounts, CMS}
99

1010
alias Accounts.User
11-
alias CMS.{Post, Repo, Job, Community, Category, Tag, Thread}
11+
alias CMS.{Community, Category, Tag, Thread}
1212

1313
alias Helper.ORM
1414

@@ -54,26 +54,16 @@ defmodule GroupherServerWeb.Resolvers.CMS do
5454
CMS.read_article(thread, id)
5555
end
5656

57-
def wiki(_root, ~m(community)a, _info), do: CMS.get_wiki(%Community{raw: community})
58-
def cheatsheet(_root, ~m(community)a, _info), do: CMS.get_cheatsheet(%Community{raw: community})
59-
60-
def paged_posts(_root, ~m(filter)a, %{context: %{cur_user: user}}) do
61-
Post |> CMS.paged_contents(filter, user)
57+
def paged_articles(_root, ~m(thread filter)a, %{context: %{cur_user: user}}) do
58+
CMS.paged_articles(thread, filter, user)
6259
end
6360

64-
def paged_posts(_root, ~m(filter)a, _info), do: Post |> CMS.paged_contents(filter)
65-
66-
def paged_repos(_root, ~m(filter)a, %{context: %{cur_user: user}}) do
67-
Repo |> CMS.paged_contents(filter, user)
61+
def paged_articles(_root, ~m(thread filter)a, _info) do
62+
CMS.paged_articles(thread, filter)
6863
end
6964

70-
def paged_repos(_root, ~m(filter)a, _info), do: Repo |> CMS.paged_contents(filter)
71-
72-
def paged_jobs(_root, ~m(filter)a, %{context: %{cur_user: user}}) do
73-
Job |> CMS.paged_contents(filter, user)
74-
end
75-
76-
def paged_jobs(_root, ~m(filter)a, _info), do: Job |> CMS.paged_contents(filter)
65+
def wiki(_root, ~m(community)a, _info), do: CMS.get_wiki(%Community{raw: community})
66+
def cheatsheet(_root, ~m(community)a, _info), do: CMS.get_cheatsheet(%Community{raw: community})
7767

7868
def create_content(_root, ~m(community_id thread)a = args, %{context: %{cur_user: user}}) do
7969
CMS.create_content(%Community{id: community_id}, thread, args, user)

lib/groupher_server_web/schema/cms/cms_misc.ex

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,6 @@ defmodule GroupherServerWeb.Schema.CMS.Misc do
138138
value(:least_words)
139139
end
140140

141-
enum :read_enum do
142-
value(:all)
143-
# value(false)
144-
value(true)
145-
end
146-
147141
enum :rainbow_color_enum do
148142
value(:red)
149143
value(:orange)
@@ -203,7 +197,6 @@ defmodule GroupherServerWeb.Schema.CMS.Misc do
203197
field(:when, :when_enum)
204198
field(:sort, :sort_enum)
205199
field(:length, :length_enum)
206-
field(:read, :read_enum, default_value: :all)
207200
# @desc "Matching a tag"
208201
# @desc "Added to the menu after this date"
209202
# field(:added_after, :datetime)

lib/groupher_server_web/schema/cms/cms_queries.ex

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,42 +75,45 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
7575

7676
@desc "get paged posts"
7777
field :paged_posts, :paged_posts do
78+
arg(:thread, :post_thread, default_value: :post)
7879
arg(:filter, non_null(:paged_posts_filter))
7980

8081
middleware(M.PageSizeProof)
81-
resolve(&R.CMS.paged_posts/3)
82+
resolve(&R.CMS.paged_articles/3)
8283
end
8384

84-
@desc "get repo by id"
85-
field :repo, non_null(:repo) do
85+
@desc "get job by id"
86+
field :job, non_null(:job) do
8687
arg(:id, non_null(:id))
87-
arg(:thread, :repo_thread, default_value: :repo)
88+
arg(:thread, :job_thread, default_value: :job)
8889

8990
resolve(&R.CMS.read_article/3)
9091
end
9192

92-
@desc "get paged repos"
93-
field :paged_repos, :paged_repos do
94-
arg(:filter, non_null(:paged_repos_filter))
93+
@desc "get paged jobs"
94+
field :paged_jobs, :paged_jobs do
95+
arg(:thread, :job_thread, default_value: :job)
96+
arg(:filter, non_null(:paged_jobs_filter))
9597

9698
middleware(M.PageSizeProof)
97-
resolve(&R.CMS.paged_repos/3)
99+
resolve(&R.CMS.paged_articles/3)
98100
end
99101

100-
@desc "get job by id"
101-
field :job, non_null(:job) do
102+
@desc "get repo by id"
103+
field :repo, non_null(:repo) do
102104
arg(:id, non_null(:id))
103-
arg(:thread, :job_thread, default_value: :job)
105+
arg(:thread, :repo_thread, default_value: :repo)
104106

105107
resolve(&R.CMS.read_article/3)
106108
end
107109

108-
@desc "get paged jobs"
109-
field :paged_jobs, :paged_jobs do
110-
arg(:filter, non_null(:paged_jobs_filter))
110+
@desc "get paged repos"
111+
field :paged_repos, :paged_repos do
112+
arg(:thread, :repo_thread, default_value: :repo)
113+
arg(:filter, non_null(:paged_repos_filter))
111114

112115
middleware(M.PageSizeProof)
113-
resolve(&R.CMS.paged_jobs/3)
116+
resolve(&R.CMS.paged_articles/3)
114117
end
115118

116119
@desc "get wiki by community raw name"

lib/groupher_server_web/schema/cms/cms_types.ex

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
6969
end)
7070
end
7171

72-
has_viewed_field()
73-
# viewer_has_upvoted
74-
# viewer_has_collected
72+
viewer_has_state_fields()
7573
# upvoted_count
7674
# collected_count
7775

@@ -112,7 +110,7 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
112110
# comments_participators
113111
comments_counter_fields(:job)
114112

115-
has_viewed_field()
113+
viewer_has_state_fields()
116114
timestamp_fields()
117115
end
118116

@@ -153,7 +151,7 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
153151
field(:origial_community, :community, resolve: dataloader(CMS, :origial_community))
154152
field(:communities, list_of(:community), resolve: dataloader(CMS, :communities))
155153

156-
has_viewed_field()
154+
viewer_has_state_fields()
157155
# comments_count
158156
# comments_participators
159157
comments_counter_fields(:repo)

lib/groupher_server_web/schema/utils/helper.ex

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ defmodule GroupherServerWeb.Schema.Utils.Helper do
3939
quote do
4040
field(:when, :when_enum)
4141
field(:length, :length_enum)
42-
field(:read, :read_enum, default_value: :all)
4342
field(:tag, :string, default_value: :all)
4443
field(:community, :string)
4544
end
@@ -89,16 +88,12 @@ defmodule GroupherServerWeb.Schema.Utils.Helper do
8988
end
9089
end
9190

92-
defmacro has_viewed_field do
91+
defmacro viewer_has_state_fields do
9392
quote do
94-
# @desc "if user has viewed this content"
95-
field :viewer_has_viewed, :boolean do
96-
middleware(M.Authorize, :login)
97-
middleware(M.PutCurrentUser)
98-
99-
resolve(dataloader(CMS, :viewers))
100-
middleware(M.ViewerDidConvert)
101-
end
93+
field(:viewer_has_collected, :boolean)
94+
field(:viewer_has_upvoted, :boolean)
95+
field(:viewer_has_viewed, :boolean)
96+
field(:viewer_has_reported, :boolean)
10297
end
10398
end
10499

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 :wip2
29+
@tag :wip3
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_web/query/cms/job_test.exs

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

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

0 commit comments

Comments
 (0)