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

Commit b3fb5bd

Browse files
committed
refactor(viewer-solution): wip
1 parent 0518832 commit b3fb5bd

File tree

12 files changed

+68
-49
lines changed

12 files changed

+68
-49
lines changed

lib/groupher_server/cms/delegates/article_reaction.ex

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
1313
alias GroupherServer.{Accounts, CMS, Repo}
1414

1515
alias Accounts.User
16-
alias CMS.{ArticleUpvote, ArticleCollect}
16+
alias CMS.{ArticleUpvote, ArticleCollect, Embeds}
1717

1818
alias Ecto.Multi
1919

20+
@default_article_meta Embeds.ArticleMeta.default_meta()
21+
2022
def upvoted_users(thread, article_id, filter) do
2123
load_reaction_users(ArticleUpvote, thread, article_id, filter)
2224
end
@@ -221,6 +223,20 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
221223
String.t(),
222224
:add | :remove
223225
) :: T.article_common()
226+
defp update_article_reaction_user_list(action, %{meta: nil} = article, user_id, opt) do
227+
cur_user_ids = []
228+
229+
updated_user_ids =
230+
case opt do
231+
:add -> [user_id] ++ cur_user_ids
232+
:remove -> cur_user_ids -- [user_id]
233+
end
234+
235+
updated_meta = @default_article_meta |> Map.merge(%{"#{action}ed_user_ids": updated_user_ids})
236+
237+
do_update_article_meta(article, updated_meta)
238+
end
239+
224240
defp update_article_reaction_user_list(action, article, user_id, opt) do
225241
cur_user_ids = get_in(article, [:meta, :"#{action}ed_user_ids"])
226242

@@ -230,15 +246,19 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
230246
:remove -> cur_user_ids -- [user_id]
231247
end
232248

233-
updated_meta =
249+
meta =
234250
article.meta
235251
|> Map.merge(%{"#{action}ed_user_ids": updated_user_ids})
236252
|> Map.from_struct()
237253
|> Map.delete(:id)
238254

255+
do_update_article_meta(article, meta)
256+
end
257+
258+
defp do_update_article_meta(article, meta) do
239259
article
240260
|> Ecto.Changeset.change()
241-
|> Ecto.Changeset.put_embed(:meta, updated_meta)
261+
|> Ecto.Changeset.put_embed(:meta, meta)
242262
|> Repo.update()
243263
end
244264

lib/groupher_server/cms/post.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ defmodule GroupherServer.CMS.Post do
5555
field(:viewer_has_collected, :boolean, default: false, virtual: true)
5656
field(:viewer_has_reported, :boolean, default: false, virtual: true)
5757

58+
has_many(:upvotes, {"article_upvotes", ArticleUpvote})
59+
field(:upvotes_count, :integer, default: 0)
60+
61+
has_many(:collects, {"article_collects", ArticleCollect})
62+
field(:collects_count, :integer, default: 0)
63+
5864
# TODO
5965
# 相关文章
6066
# has_may(:related_post, ...)
@@ -67,12 +73,6 @@ defmodule GroupherServer.CMS.Post do
6773
# 评论参与者,只保留最近 5 个
6874
embeds_many(:article_comments_participators, Accounts.User, on_replace: :delete)
6975

70-
has_many(:upvotes, {"article_upvotes", ArticleUpvote})
71-
field(:upvotes_count, :integer, default: 0)
72-
73-
has_many(:collects, {"article_collects", ArticleCollect})
74-
field(:collects_count, :integer, default: 0)
75-
7676
has_many(:viewers, {"posts_viewers", PostViewer})
7777
# The keys are inflected from the schema names!
7878
# see https://hexdocs.pm/ecto/Ecto.Schema.html

lib/groupher_server_web/schema/cms/cms_queries.ex

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,6 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
6767
resolve(&R.CMS.paged_threads/3)
6868
end
6969

70-
article_queries(:post)
71-
article_queries(:job)
72-
article_queries(:repo)
73-
7470
@desc "get wiki by community raw name"
7571
field :wiki, non_null(:wiki) do
7672
arg(:community, :string)
@@ -83,25 +79,12 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
8379
resolve(&R.CMS.cheatsheet/3)
8480
end
8581

86-
@desc "get paged upvoted users of an article"
87-
field :upvoted_users, :paged_users do
88-
arg(:id, non_null(:id))
89-
arg(:thread, :cms_thread, default_value: :post)
90-
arg(:filter, non_null(:paged_filter))
91-
92-
middleware(M.PageSizeProof)
93-
resolve(&R.CMS.upvoted_users/3)
94-
end
95-
96-
@desc "get paged upvoted users of an article"
97-
field :collected_users, :paged_users do
98-
arg(:id, non_null(:id))
99-
arg(:thread, :cms_thread, default_value: :post)
100-
arg(:filter, non_null(:paged_filter))
82+
article_queries(:post)
83+
article_queries(:job)
84+
article_queries(:repo)
10185

102-
middleware(M.PageSizeProof)
103-
resolve(&R.CMS.collected_users/3)
104-
end
86+
article_reacted_users_query(:upvot, &R.CMS.upvoted_users/3)
87+
article_reacted_users_query(:collect, &R.CMS.collected_users/3)
10588

10689
# get all tags
10790
@desc "get paged tags"

lib/groupher_server_web/schema/utils/helper.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ defmodule GroupherServerWeb.Schema.Utils.Helper do
123123
end
124124
end
125125

126+
defmacro article_reacted_users_query(action, resolver) do
127+
quote do
128+
@desc unquote("get paged #{action}ed users of an article")
129+
field unquote(:"#{action}ed_users"), :paged_users do
130+
arg(:id, non_null(:id))
131+
arg(:thread, :cms_thread, default_value: :post)
132+
arg(:filter, non_null(:paged_filter))
133+
134+
middleware(M.PageSizeProof)
135+
resolve(unquote(resolver))
136+
end
137+
end
138+
end
139+
126140
defmacro comments_fields do
127141
quote do
128142
field(:id, :id)

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/article_reaction_users_test.exs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ defmodule GroupherServer.Test.Query.ArticleReactionUsers do
3636
}
3737
}
3838
"""
39-
@tag :wip
40-
test "guest can get favroted user list after upvote to a post",
39+
@tag :wip2
40+
test "guest can get upvoted users list after upvote to a post",
4141
~m(guest_conn post user user2)a do
4242
{:ok, _} = CMS.upvote_article(:post, post.id, user)
4343
{:ok, _} = CMS.upvote_article(:post, post.id, user2)
@@ -52,8 +52,8 @@ defmodule GroupherServer.Test.Query.ArticleReactionUsers do
5252
assert user_exist_in?(user2, results["entries"], :string_key)
5353
end
5454

55-
@tag :wip
56-
test "guest can get favroted user list after upvote to a job",
55+
@tag :wip3
56+
test "guest can get upvoted users list after upvote to a job",
5757
~m(guest_conn job user user2)a do
5858
{:ok, _} = CMS.upvote_article(:job, job.id, user)
5959
{:ok, _} = CMS.upvote_article(:job, job.id, user2)
@@ -89,8 +89,9 @@ defmodule GroupherServer.Test.Query.ArticleReactionUsers do
8989
}
9090
}
9191
"""
92-
@tag :wip
93-
test "guest can get stared user list after collect a post", ~m(guest_conn post user user2)a do
92+
@tag :wip3
93+
test "guest can get collected users list after collect a post",
94+
~m(guest_conn post user user2)a do
9495
{:ok, _} = CMS.collect_article(:post, post.id, user)
9596
{:ok, _} = CMS.collect_article(:post, post.id, user2)
9697

@@ -104,8 +105,9 @@ defmodule GroupherServer.Test.Query.ArticleReactionUsers do
104105
assert user_exist_in?(user2, results["entries"], :string_key)
105106
end
106107

107-
@tag :wip
108-
test "guest can get stared user list after collect a job", ~m(guest_conn job user user2)a do
108+
@tag :wip3
109+
test "guest can get collected users list after collect a job",
110+
~m(guest_conn job user user2)a do
109111
{:ok, _} = CMS.collect_article(:job, job.id, user)
110112
{:ok, _} = CMS.collect_article(:job, job.id, user2)
111113

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")

test/groupher_server_web/query/cms/paged_jobs_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ defmodule GroupherServer.Test.Query.PagedJobs do
9797
}
9898
}
9999
"""
100-
@tag :wip2
100+
@tag :wip3
101101
test "has_xxx state should work", ~m(user)a do
102102
user_conn = simu_conn(:user, user)
103103
{:ok, community} = db_insert(:community)

test/groupher_server_web/query/cms/paged_posts_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ defmodule GroupherServer.Test.Query.PagedPosts do
170170
}
171171
}
172172
"""
173-
@tag :wip2
173+
@tag :wip3
174174
test "has_xxx state should work", ~m(user)a do
175175
user_conn = simu_conn(:user, user)
176176
{:ok, community} = db_insert(:community)

test/groupher_server_web/query/cms/paged_repos_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ defmodule GroupherServer.Test.Query.PagedRepos do
9393
}
9494
}
9595
"""
96-
@tag :wip2
96+
@tag :wip3
9797
test "has_xxx state should work", ~m(user)a do
9898
user_conn = simu_conn(:user, user)
9999
{:ok, community} = db_insert(:community)

0 commit comments

Comments
 (0)