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

Commit 28e95ce

Browse files
committed
feat(reaction_user_list): upvote / collect is avalidble in article meta
1 parent 3b35013 commit 28e95ce

File tree

7 files changed

+197
-11
lines changed

7 files changed

+197
-11
lines changed

lib/groupher_server/cms/cms.ex

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,8 @@ defmodule GroupherServer.CMS do
7575
defdelegate paged_contents(queryable, filter), to: ArticleCURD
7676
defdelegate create_content(community, thread, attrs, user), to: ArticleCURD
7777
defdelegate update_content(content, attrs), to: ArticleCURD
78-
defdelegate reaction_users(thread, react, id, filters), to: ArticleCURD
7978

8079
# ArticleReaction
81-
defdelegate reaction(thread, react, content_id, user), to: ArticleReaction
82-
defdelegate undo_reaction(thread, react, content_id, user), to: ArticleReaction
83-
8480
defdelegate upvote_article(thread, article_id, user), to: ArticleReaction
8581
defdelegate undo_upvote_article(thread, article_id, user), to: ArticleReaction
8682

lib/groupher_server/cms/delegates/article_reaction.ex

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
22
@moduledoc """
33
reaction[upvote, collect, watch ...] on article [post, job...]
44
"""
5-
import Helper.Utils, only: [done: 1, done: 2]
5+
import Helper.Utils, only: [done: 1]
66

77
import GroupherServer.CMS.Utils.Matcher2
8-
import GroupherServer.CMS.Utils.Matcher, only: [match_action: 2]
98
import Ecto.Query, warn: false
10-
import Helper.ErrorCode
9+
# import Helper.ErrorCode
1110
import ShortMaps
1211

1312
alias Helper.{ORM, QueryBuilder}
@@ -46,6 +45,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
4645
|> Multi.run(:inc_article_collects_count, fn _, _ ->
4746
update_article_upvotes_count(info, article, :collects_count, :inc)
4847
end)
48+
|> Multi.run(:update_article_reaction_user_list, fn _, _ ->
49+
update_article_reaction_user_list(:collect, article, user_id, :add)
50+
end)
4951
|> Multi.run(:create_collect, fn _, _ ->
5052
thread_upcase = thread |> to_string |> String.upcase()
5153
args = Map.put(%{user_id: user_id, thread: thread_upcase}, info.foreign_key, article.id)
@@ -82,6 +84,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
8284
|> Multi.run(:inc_article_collects_count, fn _, _ ->
8385
update_article_upvotes_count(info, article, :collects_count, :dec)
8486
end)
87+
|> Multi.run(:update_article_reaction_user_list, fn _, _ ->
88+
update_article_reaction_user_list(:collect, article, user_id, :remove)
89+
end)
8590
|> Multi.run(:undo_collect, fn _, _ ->
8691
args = Map.put(%{user_id: user_id}, info.foreign_key, article.id)
8792

@@ -142,6 +147,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
142147
|> Multi.run(:inc_article_upvotes_count, fn _, _ ->
143148
update_article_upvotes_count(info, article, :upvotes_count, :inc)
144149
end)
150+
|> Multi.run(:update_article_reaction_user_list, fn _, _ ->
151+
update_article_reaction_user_list(:upvot, article, user_id, :add)
152+
end)
145153
|> Multi.run(:add_achievement, fn _, _ ->
146154
achiever_id = article.author.user_id
147155
Accounts.achieve(%User{id: achiever_id}, :inc, :upvote)
@@ -167,6 +175,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
167175
|> Multi.run(:inc_article_upvotes_count, fn _, _ ->
168176
update_article_upvotes_count(info, article, :upvotes_count, :dec)
169177
end)
178+
|> Multi.run(:update_article_reaction_user_list, fn _, _ ->
179+
update_article_reaction_user_list(:upvot, article, user_id, :remove)
180+
end)
170181
|> Multi.run(:undo_upvote, fn _, _ ->
171182
args = Map.put(%{user_id: user_id}, info.foreign_key, article.id)
172183

@@ -199,6 +210,38 @@ defmodule GroupherServer.CMS.Delegate.ArticleReaction do
199210
end
200211
end
201212

213+
@doc """
214+
add or remove artilce's reaction users is list history
215+
e.g:
216+
add/remove user_id to upvoted_user_ids in article meta
217+
"""
218+
@spec update_article_reaction_user_list(
219+
:upvot | :collect,
220+
T.article_common(),
221+
String.t(),
222+
:add | :remove
223+
) :: T.article_common()
224+
defp update_article_reaction_user_list(action, article, user_id, opt) do
225+
cur_user_ids = get_in(article, [:meta, :"#{action}ed_user_ids"])
226+
227+
updated_user_ids =
228+
case opt do
229+
:add -> [user_id] ++ cur_user_ids
230+
:remove -> cur_user_ids -- [user_id]
231+
end
232+
233+
updated_meta =
234+
article.meta
235+
|> Map.merge(%{"#{action}ed_user_ids": updated_user_ids})
236+
|> Map.from_struct()
237+
|> Map.delete(:id)
238+
239+
article
240+
|> Ecto.Changeset.change()
241+
|> Ecto.Changeset.put_embed(:meta, updated_meta)
242+
|> Repo.update()
243+
end
244+
202245
defp reaction_result({:ok, %{create_upvote: result}}), do: result |> done()
203246
defp reaction_result({:ok, %{undo_upvote: result}}), do: result |> done()
204247

lib/groupher_server/cms/embeds/article_meta.ex

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ defmodule GroupherServer.CMS.Embeds.ArticleMeta do
33
general article meta info for article-like content, like post, job, works ...
44
"""
55
use Ecto.Schema
6+
use Accessible
67
import Ecto.Changeset
78

8-
@optional_fields ~w(is_edited is_comment_locked is_reported)a
9+
@optional_fields ~w(is_edited is_comment_locked is_reported upvoted_user_ids collected_user_ids viewed_user_ids reported_user_ids)a
910

1011
@default_meta %{
1112
is_edited: false,
1213
is_comment_locked: false,
13-
is_reported: false
14+
is_reported: false,
15+
upvoted_user_ids: [],
16+
collected_user_ids: [],
17+
viewed_user_ids: [],
18+
reported_user_ids: []
1419
}
1520

1621
@doc "for test usage"
@@ -20,6 +25,11 @@ defmodule GroupherServer.CMS.Embeds.ArticleMeta do
2025
field(:is_edited, :boolean, default: false)
2126
field(:is_comment_locked, :boolean, default: false)
2227
field(:is_reported, :boolean, default: false)
28+
# reaction history
29+
field(:upvoted_user_ids, {:array, :integer}, default: [])
30+
field(:collected_user_ids, {:array, :integer}, default: [])
31+
field(:viewed_user_ids, {:array, :integer}, default: [])
32+
field(:reported_user_ids, {:array, :integer}, default: [])
2333
end
2434

2535
def changeset(struct, params) do

lib/helper/types.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@ defmodule Helper.Types do
6262
id: Integer.t(),
6363
thread: Atom.t(),
6464
title: String.t(),
65-
upvotes_count: Integer.t()
65+
upvotes_count: Integer.t(),
66+
meta: %{
67+
upvoted_user_ids: [Integer.t()],
68+
collected_user_ids: [Integer.t()],
69+
viewed_user_ids: [Integer.t()],
70+
reported_user_ids: [Integer.t()]
71+
}
6672
}
6773

6874
@type paged_article_common :: %{

test/groupher_server/cms/article_collect_test.exs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
defmodule GroupherServer.Test.ArticleCollect do
2+
@moduledoc false
23
use GroupherServer.TestTools
34

45
alias Helper.ORM
@@ -62,6 +63,42 @@ defmodule GroupherServer.Test.ArticleCollect do
6263
assert user_exist_in?(user, users.entries)
6364
assert user_exist_in?(user2, users.entries)
6465
end
66+
67+
@tag :wip2
68+
test "post meta history should be updated", ~m(user user2 community post_attrs)a do
69+
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
70+
{:ok, _} = CMS.collect_article(:post, post.id, user)
71+
72+
{:ok, article} = ORM.find(Post, post.id)
73+
assert user.id in article.meta.collected_user_ids
74+
75+
{:ok, _} = CMS.collect_article(:post, post.id, user2)
76+
{:ok, article} = ORM.find(Post, post.id)
77+
78+
assert user.id in article.meta.collected_user_ids
79+
assert user2.id in article.meta.collected_user_ids
80+
end
81+
82+
@tag :wip2
83+
test "post meta history should be updated after undo collect",
84+
~m(user user2 community post_attrs)a do
85+
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
86+
{:ok, _} = CMS.collect_article(:post, post.id, user)
87+
{:ok, _} = CMS.collect_article(:post, post.id, user2)
88+
89+
{:ok, article} = ORM.find(Post, post.id)
90+
assert user.id in article.meta.collected_user_ids
91+
assert user2.id in article.meta.collected_user_ids
92+
93+
{:ok, _} = CMS.undo_collect_article(:post, post.id, user2)
94+
{:ok, article} = ORM.find(Post, post.id)
95+
assert user2.id not in article.meta.collected_user_ids
96+
97+
{:ok, _} = CMS.undo_collect_article(:post, post.id, user)
98+
{:ok, article} = ORM.find(Post, post.id)
99+
assert user.id not in article.meta.collected_user_ids
100+
assert user2.id not in article.meta.collected_user_ids
101+
end
65102
end
66103

67104
describe "[cms job collect]" do
@@ -110,5 +147,40 @@ defmodule GroupherServer.Test.ArticleCollect do
110147
assert user_exist_in?(user, users.entries)
111148
assert user_exist_in?(user2, users.entries)
112149
end
150+
151+
@tag :wip2
152+
test "job meta history should be updated", ~m(user user2 community job_attrs)a do
153+
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
154+
{:ok, _} = CMS.collect_article(:job, job.id, user)
155+
156+
{:ok, article} = ORM.find(Job, job.id)
157+
assert user.id in article.meta.collected_user_ids
158+
159+
{:ok, _} = CMS.collect_article(:job, job.id, user2)
160+
{:ok, article} = ORM.find(Job, job.id)
161+
assert user.id in article.meta.collected_user_ids
162+
assert user2.id in article.meta.collected_user_ids
163+
end
164+
165+
@tag :wip2
166+
test "job meta history should be updated after undo collect",
167+
~m(user user2 community job_attrs)a do
168+
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
169+
{:ok, _} = CMS.collect_article(:job, job.id, user)
170+
{:ok, _} = CMS.collect_article(:job, job.id, user2)
171+
172+
{:ok, article} = ORM.find(Job, job.id)
173+
assert user.id in article.meta.collected_user_ids
174+
assert user2.id in article.meta.collected_user_ids
175+
176+
{:ok, _} = CMS.undo_collect_article(:job, job.id, user2)
177+
{:ok, article} = ORM.find(Job, job.id)
178+
assert user2.id not in article.meta.collected_user_ids
179+
180+
{:ok, _} = CMS.undo_collect_article(:job, job.id, user)
181+
{:ok, article} = ORM.find(Job, job.id)
182+
assert user.id not in article.meta.collected_user_ids
183+
assert user2.id not in article.meta.collected_user_ids
184+
end
113185
end
114186
end

test/groupher_server/cms/article_comment_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ defmodule GroupherServer.Test.CMS.ArticleComment do
555555
assert deleted_comment.body_html == @delete_hint
556556
end
557557

558-
@tag :wip2
558+
@tag :wip
559559
test "delete comment still update article's comments_count field", ~m(user post)a do
560560
{:ok, _comment} = CMS.create_article_comment(:post, post.id, "commment", user)
561561
{:ok, _comment} = CMS.create_article_comment(:post, post.id, "commment", user)

test/groupher_server/cms/article_upvote_test.exs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,36 @@ defmodule GroupherServer.Test.ArticleUpvote do
5555
assert user_exist_in?(user, users.entries)
5656
assert user_exist_in?(user2, users.entries)
5757
end
58+
59+
@tag :wip2
60+
test "post meta history should be updated after upvote",
61+
~m(user user2 community post_attrs)a do
62+
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
63+
{:ok, article} = CMS.upvote_article(:post, post.id, user)
64+
assert user.id in article.meta.upvoted_user_ids
65+
66+
{:ok, article} = CMS.upvote_article(:post, post.id, user2)
67+
assert user.id in article.meta.upvoted_user_ids
68+
assert user2.id in article.meta.upvoted_user_ids
69+
end
70+
71+
@tag :wip2
72+
test "post meta history should be updated after undo upvote",
73+
~m(user user2 community post_attrs)a do
74+
{:ok, post} = CMS.create_content(community, :post, post_attrs, user)
75+
76+
{:ok, _article} = CMS.upvote_article(:post, post.id, user)
77+
{:ok, article} = CMS.upvote_article(:post, post.id, user2)
78+
79+
assert user.id in article.meta.upvoted_user_ids
80+
assert user2.id in article.meta.upvoted_user_ids
81+
82+
{:ok, article} = CMS.undo_upvote_article(:post, post.id, user2)
83+
assert user2.id not in article.meta.upvoted_user_ids
84+
85+
{:ok, article} = CMS.undo_upvote_article(:post, post.id, user)
86+
assert user.id not in article.meta.upvoted_user_ids
87+
end
5888
end
5989

6090
describe "[cms job upvote]" do
@@ -97,5 +127,34 @@ defmodule GroupherServer.Test.ArticleUpvote do
97127
assert user_exist_in?(user, users.entries)
98128
assert user_exist_in?(user2, users.entries)
99129
end
130+
131+
@tag :wip2
132+
test "job meta history should be updated", ~m(user user2 community job_attrs)a do
133+
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
134+
{:ok, article} = CMS.upvote_article(:job, job.id, user)
135+
assert user.id in article.meta.upvoted_user_ids
136+
137+
{:ok, article} = CMS.upvote_article(:job, job.id, user2)
138+
assert user.id in article.meta.upvoted_user_ids
139+
assert user2.id in article.meta.upvoted_user_ids
140+
end
141+
142+
@tag :wip2
143+
test "job meta history should be updated after undo upvote",
144+
~m(user user2 community job_attrs)a do
145+
{:ok, job} = CMS.create_content(community, :job, job_attrs, user)
146+
147+
{:ok, _article} = CMS.upvote_article(:job, job.id, user)
148+
{:ok, article} = CMS.upvote_article(:job, job.id, user2)
149+
150+
assert user.id in article.meta.upvoted_user_ids
151+
assert user2.id in article.meta.upvoted_user_ids
152+
153+
{:ok, article} = CMS.undo_upvote_article(:job, job.id, user2)
154+
assert user2.id not in article.meta.upvoted_user_ids
155+
156+
{:ok, article} = CMS.undo_upvote_article(:job, job.id, user)
157+
assert user.id not in article.meta.upvoted_user_ids
158+
end
100159
end
101160
end

0 commit comments

Comments
 (0)