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

Commit 3b35013

Browse files
authored
refactor(article-reactions): use common module to handle it (#333)
* refactor(article-upvote): wip * refactor(article-upvote): wip * refactor(article-upvote): undo upvotes * refactor(article-upvote): wip * refactor(article-upvote): wip * refactor(article-upvote): wip * refactor(article-upvote): collect done * refactor(article-collect): gq workflow && test && re-org * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): collect-folder wip * refactor(user-reaction): collect-folder wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): wip * refactor(user-reaction): folder meta wip * refactor(user-reaction): folder meta with fragment wip * refactor(user-reaction): folder meta threads flag wip * refactor(user-reaction): folder meta threads flag wip * refactor(user-reaction): create_collect ifneed * refactor(user-reaction): remove_collect ifneed * refactor(user-reaction): thread_count wip * refactor(user-reaction): update meta wip * refactor(user-reaction): update meta wip * refactor(user-reaction): use macros for folder meta * refactor(user-reaction): wip * refactor(user-reaction): delete empty folder done * refactor(user-reaction): wip * refactor(user-reaction): remove old favorite/star wip * refactor(user-reaction): remove old favorite/star wip * refactor(user-reaction): gq workflow wip * refactor(user-reaction): gq workflow wip * refactor(user-reaction): cache system re-org * refactor(user-reaction): re-org wip * refactor(user-reaction): re-org wip * refactor(user-reaction): re-org wip * refactor(user-reaction): re-org wip * refactor(user-reaction): re-org wip * refactor(user-reaction): function args adjust wip * refactor(user-reaction): mutaion of collect folder wip * refactor(user-reaction): mutaion of collect folder wip * fix(reaction-replate): test errors * fix(reaction): clean up favorite, comment like etc
1 parent d38603f commit 3b35013

File tree

104 files changed

+2672
-3424
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+2672
-3424
lines changed

config/config.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ config :groupher_server, :general,
4343
# membership
4444
senior_amount_threshold: 51.2,
4545
# user achievements
46-
user_achieve_star_weight: 1,
46+
user_achieve_upvote_weight: 1,
4747
user_achieve_watch_weight: 1,
48-
user_achieve_favorite_weight: 2,
48+
user_achieve_collect_weight: 2,
4949
user_achieve_follow_weight: 3
5050

5151
config :groupher_server, :customization,

lib/groupher_server/accounts/accounts.ex

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ defmodule GroupherServer.Accounts do
55
Achievements,
66
Customization,
77
Fans,
8-
FavoriteCategory,
8+
CollectFolder,
99
Publish,
1010
Mails,
1111
Profile,
12-
ReactedContents,
13-
Search
12+
UpvotedArticles,
13+
Search,
14+
Utils
1415
}
1516

1617
# profile
@@ -20,13 +21,17 @@ defmodule GroupherServer.Accounts do
2021
defdelegate default_subscribed_communities(filter), to: Profile
2122
defdelegate subscribed_communities(user, filter), to: Profile
2223

23-
# favorite category
24-
defdelegate list_favorite_categories(user, opt, filter), to: FavoriteCategory
25-
defdelegate create_favorite_category(user, attrs), to: FavoriteCategory
26-
defdelegate update_favorite_category(user, attrs), to: FavoriteCategory
27-
defdelegate delete_favorite_category(user, id), to: FavoriteCategory
28-
defdelegate set_favorites(user, thread, content_id, category_id), to: FavoriteCategory
29-
defdelegate unset_favorites(user, thread, content_id, category_id), to: FavoriteCategory
24+
# collect folder
25+
defdelegate list_collect_folders(user_id, filter), to: CollectFolder
26+
defdelegate list_collect_folders(user_id, filter, owner), to: CollectFolder
27+
defdelegate list_collect_folder_articles(folder_id, filter, user), to: CollectFolder
28+
defdelegate list_collect_folder_articles(folder_id, filter), to: CollectFolder
29+
30+
defdelegate create_collect_folder(attrs, user), to: CollectFolder
31+
defdelegate update_collect_folder(id, attrs), to: CollectFolder
32+
defdelegate delete_collect_folder(id), to: CollectFolder
33+
defdelegate add_to_collect(thread, article_id, folder_id, user), to: CollectFolder
34+
defdelegate remove_from_collect(thread, article_id, folder_id, user), to: CollectFolder
3035

3136
# achievement
3237
defdelegate achieve(user, operation, key), to: Achievements
@@ -44,9 +49,8 @@ defmodule GroupherServer.Accounts do
4449
defdelegate fetch_followers(user, filter), to: Fans
4550
defdelegate fetch_followings(user, filter), to: Fans
4651

47-
# reacted contents
48-
defdelegate reacted_contents(thread, react, filter, user), to: ReactedContents
49-
defdelegate reacted_contents(thread, react, category_id, filter, user), to: ReactedContents
52+
# upvoted articles
53+
defdelegate list_upvoted_articles(user_id, filter), to: UpvotedArticles
5054

5155
# mentions
5256
defdelegate fetch_mentions(user, filter), to: Mails
@@ -67,4 +71,6 @@ defmodule GroupherServer.Accounts do
6771
defdelegate upgrade_by_plan(user, plan), to: Customization
6872

6973
defdelegate search_users(args), to: Search
74+
75+
defdelegate get_userid_and_cache(login), to: Utils
7076
end

lib/groupher_server/accounts/achievement.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ defmodule GroupherServer.Accounts.Achievement do
88
alias GroupherServer.Accounts.{User, SourceContribute}
99

1010
@required_fields ~w(user_id)a
11-
@optional_fields ~w(contents_stared_count contents_favorited_count contents_watched_count followers_count reputation donate_member senior_member sponsor_member)a
11+
@optional_fields ~w(articles_upvotes_count articles_collects_count contents_watched_count followers_count reputation donate_member senior_member sponsor_member)a
1212

1313
@type t :: %Achievement{}
1414
schema "user_achievements" do
1515
belongs_to(:user, User)
1616

17-
field(:contents_stared_count, :integer, default: 0)
18-
field(:contents_favorited_count, :integer, default: 0)
17+
field(:articles_upvotes_count, :integer, default: 0)
18+
field(:articles_collects_count, :integer, default: 0)
1919
field(:contents_watched_count, :integer, default: 0)
2020
field(:followers_count, :integer, default: 0)
2121
field(:reputation, :integer, default: 0)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
defmodule GroupherServer.Accounts.CollectFolder do
2+
@moduledoc false
3+
alias __MODULE__
4+
5+
use Ecto.Schema
6+
import Ecto.Changeset
7+
8+
alias GroupherServer.{Accounts, CMS}
9+
alias Accounts.{User, Embeds}
10+
alias CMS.ArticleCollect
11+
12+
@required_fields ~w(user_id title)a
13+
@optional_fields ~w(index total_count private desc last_updated)a
14+
15+
@supported_threads [:post, :job, :repo]
16+
17+
def supported_threads, do: @supported_threads
18+
19+
@type t :: %CollectFolder{}
20+
schema "collect_folders" do
21+
belongs_to(:user, User, foreign_key: :user_id)
22+
# has_many(:posts, ...)
23+
24+
field(:title, :string)
25+
field(:desc, :string)
26+
field(:index, :integer)
27+
field(:total_count, :integer, default: 0)
28+
field(:private, :boolean, default: false)
29+
# last time when add/delete items in category
30+
field(:last_updated, :utc_datetime)
31+
32+
# 可以参照 fragment 查询语法啊
33+
# 2. article truple [{:post, 1}, [:job, 2]] ... 便于在计算 "成就" 的时候对比
34+
embeds_one(:meta, Embeds.CollectFolderMeta, on_replace: :delete)
35+
embeds_many(:collects, ArticleCollect, on_replace: :delete)
36+
37+
timestamps(type: :utc_datetime)
38+
end
39+
40+
@doc false
41+
def changeset(%CollectFolder{} = collect_folder, attrs) do
42+
collect_folder
43+
|> cast(attrs, @optional_fields ++ @required_fields)
44+
|> validate_required(@required_fields)
45+
|> cast_embed(:meta, required: true, with: &Embeds.CollectFolderMeta.changeset/2)
46+
|> validate_length(:title, min: 1)
47+
|> foreign_key_constraint(:user_id)
48+
end
49+
50+
@doc false
51+
def update_changeset(%CollectFolder{} = collect_folder, attrs) do
52+
collect_folder
53+
|> cast(attrs, @optional_fields ++ @required_fields)
54+
|> cast_embed(:collects, with: &ArticleCollect.changeset/2)
55+
|> cast_embed(:meta, with: &Embeds.CollectFolderMeta.changeset/2)
56+
|> validate_length(:title, min: 1)
57+
|> foreign_key_constraint(:user_id)
58+
end
59+
end

lib/groupher_server/accounts/delegates/achievements.ex

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
22
@moduledoc """
33
user achievements related
44
acheiveements formula:
5-
1. create content been stared by other user + 1
5+
1. create content been upvoteed by other user + 1
66
2. create content been watched by other user + 1
7-
3. create content been favorited by other user + 2
7+
3. create content been colleced by other user + 2
88
4. followed by other user + 3
99
"""
1010
import Ecto.Query, warn: false
@@ -14,16 +14,16 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
1414
alias Helper.{ORM, SpecType}
1515
alias GroupherServer.Accounts.{Achievement, User}
1616

17-
@favorite_weight get_config(:general, :user_achieve_favorite_weight)
18-
@star_weight get_config(:general, :user_achieve_star_weight)
17+
@collect_weight get_config(:general, :user_achieve_collect_weight)
18+
@upvote_weight get_config(:general, :user_achieve_upvote_weight)
1919
# @watch_weight get_config(:general, :user_achieve_watch_weight)
2020
@follow_weight get_config(:general, :user_achieve_follow_weight)
2121

2222
@doc """
23-
add user's achievement by add followers_count of favorite_weight
23+
inc user's achievement by inc followers_count of collect_weight
2424
"""
2525
@spec achieve(User.t(), atom, atom) :: SpecType.done()
26-
def achieve(%User{id: user_id}, :add, :follow) do
26+
def achieve(%User{id: user_id}, :inc, :follow) do
2727
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
2828
followers_count = achievement.followers_count + 1
2929
reputation = achievement.reputation + @follow_weight
@@ -34,9 +34,9 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
3434
end
3535

3636
@doc """
37-
minus user's achievement by add followers_count of favorite_weight
37+
dec user's achievement by inc followers_count of collect_weight
3838
"""
39-
def achieve(%User{id: user_id}, :minus, :follow) do
39+
def achieve(%User{id: user_id}, :dec, :follow) do
4040
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
4141
followers_count = max(achievement.followers_count - 1, 0)
4242
reputation = max(achievement.reputation - @follow_weight, 0)
@@ -47,55 +47,55 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
4747
end
4848

4949
@doc """
50-
add user's achievement by contents_stared_count of star_weight
50+
inc user's achievement by articles_upvotes_count of upvote_weight
5151
"""
52-
def achieve(%User{id: user_id} = _user, :add, :star) do
52+
def achieve(%User{id: user_id} = _user, :inc, :upvote) do
5353
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
54-
contents_stared_count = achievement.contents_stared_count + 1
55-
reputation = achievement.reputation + @star_weight
54+
articles_upvotes_count = achievement.articles_upvotes_count + 1
55+
reputation = achievement.reputation + @upvote_weight
5656

5757
achievement
58-
|> ORM.update(~m(contents_stared_count reputation)a)
58+
|> ORM.update(~m(articles_upvotes_count reputation)a)
5959
end
6060
end
6161

6262
@doc """
63-
minus user's achievement by contents_stared_count of star_weight
63+
dec user's achievement by articles_upvotes_count of upvote_weight
6464
"""
65-
def achieve(%User{id: user_id} = _user, :minus, :star) do
65+
def achieve(%User{id: user_id} = _user, :dec, :upvote) do
6666
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
67-
contents_stared_count = max(achievement.contents_stared_count - 1, 0)
68-
reputation = max(achievement.reputation - @star_weight, 0)
67+
articles_upvotes_count = max(achievement.articles_upvotes_count - 1, 0)
68+
reputation = max(achievement.reputation - @upvote_weight, 0)
6969

7070
achievement
71-
|> ORM.update(~m(contents_stared_count reputation)a)
71+
|> ORM.update(~m(articles_upvotes_count reputation)a)
7272
end
7373
end
7474

7575
@doc """
76-
minus user's achievement by contents_favorited_count of favorite_weight
76+
dec user's achievement by articles_collects_count of collect_weight
7777
"""
78-
def achieve(%User{id: user_id} = _user, :add, :favorite) do
78+
def achieve(%User{id: user_id} = _user, :inc, :collect) do
7979
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
80-
contents_favorited_count = achievement.contents_favorited_count + 1
81-
reputation = achievement.reputation + @favorite_weight
80+
articles_collects_count = achievement.articles_collects_count + 1
81+
reputation = achievement.reputation + @collect_weight
8282

8383
achievement
84-
|> ORM.update(~m(contents_favorited_count reputation)a)
84+
|> ORM.update(~m(articles_collects_count reputation)a)
8585
end
8686
end
8787

8888
@doc """
89-
add user's achievement by contents_favorited_count of favorite_weight
89+
inc user's achievement by articles_collects_count of collect_weight
9090
"""
91-
def achieve(%User{id: user_id} = _user, :minus, :favorite) do
91+
def achieve(%User{id: user_id} = _user, :dec, :collect) do
9292
with {:ok, achievement} <- ORM.findby_or_insert(Achievement, ~m(user_id)a, ~m(user_id)a) do
93-
contents_favorited_count = max(achievement.contents_favorited_count - 1, 0)
93+
articles_collects_count = max(achievement.articles_collects_count - 1, 0)
9494

95-
reputation = max(achievement.reputation - @favorite_weight, 0)
95+
reputation = max(achievement.reputation - @collect_weight, 0)
9696

9797
achievement
98-
|> ORM.update(~m(contents_favorited_count reputation)a)
98+
|> ORM.update(~m(articles_collects_count reputation)a)
9999
end
100100
end
101101

@@ -113,27 +113,15 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
113113
@doc """
114114
only used for user delete the farorited category, other case is auto
115115
"""
116-
def downgrade_achievement(%User{id: user_id}, :favorite, count) do
116+
def downgrade_achievement(%User{id: user_id}, :collect, count) do
117117
with {:ok, achievement} <- ORM.find_by(Achievement, user_id: user_id) do
118-
contents_favorited_count = max(achievement.contents_favorited_count - count, 0)
119-
reputation = max(achievement.reputation - count * @favorite_weight, 0)
118+
articles_collects_count = max(achievement.articles_collects_count - count, 0)
119+
reputation = max(achievement.reputation - count * @collect_weight, 0)
120120

121-
achievement
122-
|> ORM.update(~m(contents_favorited_count reputation)a)
121+
achievement |> ORM.update(~m(articles_collects_count reputation)a)
123122
end
124123
end
125124

126-
# @spec safe_minus(non_neg_integer(), non_neg_integer()) :: non_neg_integer()
127-
# defp safe_minus(count, unit) when is_integer(count) and is_integer(unit) and unit > 0 do
128-
# case count <= 0 do
129-
# true ->
130-
# 0
131-
132-
# false ->
133-
# count - unit
134-
# end
135-
# end
136-
137125
@doc """
138126
list communities which the user is editor in it
139127
"""

0 commit comments

Comments
 (0)