Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
ea514e2
refactor(article-upvote): wip
mydearxym Apr 30, 2021
0e355df
refactor(article-upvote): wip
mydearxym Apr 30, 2021
be959fe
refactor(article-upvote): undo upvotes
mydearxym Apr 30, 2021
ec7edc3
refactor(article-upvote): wip
mydearxym Apr 30, 2021
9c06b93
refactor(article-upvote): wip
mydearxym Apr 30, 2021
5892d2b
refactor(article-upvote): wip
mydearxym Apr 30, 2021
d8c8439
refactor(article-upvote): collect done
mydearxym Apr 30, 2021
9e8bdad
refactor(article-collect): gq workflow && test && re-org
mydearxym Apr 30, 2021
75f1f26
refactor(user-reaction): wip
mydearxym May 1, 2021
7cde7b7
refactor(user-reaction): wip
mydearxym May 1, 2021
ce7747c
refactor(user-reaction): wip
mydearxym May 1, 2021
8fe7dac
refactor(user-reaction): wip
mydearxym May 1, 2021
748a0b0
refactor(user-reaction): collect-folder wip
mydearxym May 2, 2021
cea738c
refactor(user-reaction): collect-folder wip
mydearxym May 2, 2021
557d6dd
refactor(user-reaction): wip
mydearxym May 2, 2021
bfa6a1f
refactor(user-reaction): wip
mydearxym May 2, 2021
8e9700c
refactor(user-reaction): wip
mydearxym May 2, 2021
ebfdcc1
refactor(user-reaction): wip
mydearxym May 2, 2021
7a80396
refactor(user-reaction): wip
mydearxym May 2, 2021
d9f7b8a
refactor(user-reaction): wip
mydearxym May 2, 2021
92f220f
refactor(user-reaction): wip
mydearxym May 2, 2021
046c2ed
refactor(user-reaction): folder meta wip
mydearxym May 2, 2021
173c332
refactor(user-reaction): folder meta with fragment wip
mydearxym May 2, 2021
ab124ec
refactor(user-reaction): folder meta threads flag wip
mydearxym May 3, 2021
117cf58
refactor(user-reaction): folder meta threads flag wip
mydearxym May 3, 2021
f396046
refactor(user-reaction): create_collect ifneed
mydearxym May 3, 2021
5a0d8e5
refactor(user-reaction): remove_collect ifneed
mydearxym May 3, 2021
49f385a
refactor(user-reaction): thread_count wip
mydearxym May 3, 2021
9853be2
refactor(user-reaction): update meta wip
mydearxym May 3, 2021
aa56d39
refactor(user-reaction): update meta wip
mydearxym May 3, 2021
8425d87
refactor(user-reaction): use macros for folder meta
mydearxym May 4, 2021
1101308
refactor(user-reaction): wip
mydearxym May 4, 2021
706d563
refactor(user-reaction): delete empty folder done
mydearxym May 4, 2021
2a4323b
refactor(user-reaction): wip
mydearxym May 4, 2021
71bb444
refactor(user-reaction): remove old favorite/star wip
mydearxym May 4, 2021
6456fa0
refactor(user-reaction): remove old favorite/star wip
mydearxym May 4, 2021
281db13
refactor(user-reaction): gq workflow wip
mydearxym May 4, 2021
3f4d90c
refactor(user-reaction): gq workflow wip
mydearxym May 4, 2021
c2c5922
refactor(user-reaction): cache system re-org
mydearxym May 4, 2021
dcded4c
refactor(user-reaction): re-org wip
mydearxym May 4, 2021
bc85919
refactor(user-reaction): re-org wip
mydearxym May 4, 2021
9b8e03a
refactor(user-reaction): re-org wip
mydearxym May 4, 2021
0cbdb8e
refactor(user-reaction): re-org wip
mydearxym May 4, 2021
1fa3004
refactor(user-reaction): re-org wip
mydearxym May 4, 2021
6710cae
refactor(user-reaction): function args adjust wip
mydearxym May 4, 2021
1bde043
refactor(user-reaction): mutaion of collect folder wip
mydearxym May 5, 2021
abe5a30
refactor(user-reaction): mutaion of collect folder wip
mydearxym May 5, 2021
6818e50
fix(reaction-replate): test errors
mydearxym May 5, 2021
38e8480
fix(reaction): clean up favorite, comment like etc
mydearxym May 5, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ config :groupher_server, :general,
# membership
senior_amount_threshold: 51.2,
# user achievements
user_achieve_star_weight: 1,
user_achieve_upvote_weight: 1,
user_achieve_watch_weight: 1,
user_achieve_favorite_weight: 2,
user_achieve_collect_weight: 2,
user_achieve_follow_weight: 3

config :groupher_server, :customization,
Expand Down
32 changes: 19 additions & 13 deletions lib/groupher_server/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ defmodule GroupherServer.Accounts do
Achievements,
Customization,
Fans,
FavoriteCategory,
CollectFolder,
Publish,
Mails,
Profile,
ReactedContents,
Search
UpvotedArticles,
Search,
Utils
}

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

# favorite category
defdelegate list_favorite_categories(user, opt, filter), to: FavoriteCategory
defdelegate create_favorite_category(user, attrs), to: FavoriteCategory
defdelegate update_favorite_category(user, attrs), to: FavoriteCategory
defdelegate delete_favorite_category(user, id), to: FavoriteCategory
defdelegate set_favorites(user, thread, content_id, category_id), to: FavoriteCategory
defdelegate unset_favorites(user, thread, content_id, category_id), to: FavoriteCategory
# collect folder
defdelegate list_collect_folders(user_id, filter), to: CollectFolder
defdelegate list_collect_folders(user_id, filter, owner), to: CollectFolder
defdelegate list_collect_folder_articles(folder_id, filter, user), to: CollectFolder
defdelegate list_collect_folder_articles(folder_id, filter), to: CollectFolder

defdelegate create_collect_folder(attrs, user), to: CollectFolder
defdelegate update_collect_folder(id, attrs), to: CollectFolder
defdelegate delete_collect_folder(id), to: CollectFolder
defdelegate add_to_collect(thread, article_id, folder_id, user), to: CollectFolder
defdelegate remove_from_collect(thread, article_id, folder_id, user), to: CollectFolder

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

# reacted contents
defdelegate reacted_contents(thread, react, filter, user), to: ReactedContents
defdelegate reacted_contents(thread, react, category_id, filter, user), to: ReactedContents
# upvoted articles
defdelegate list_upvoted_articles(user_id, filter), to: UpvotedArticles

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

defdelegate search_users(args), to: Search

defdelegate get_userid_and_cache(login), to: Utils
end
6 changes: 3 additions & 3 deletions lib/groupher_server/accounts/achievement.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ defmodule GroupherServer.Accounts.Achievement do
alias GroupherServer.Accounts.{User, SourceContribute}

@required_fields ~w(user_id)a
@optional_fields ~w(contents_stared_count contents_favorited_count contents_watched_count followers_count reputation donate_member senior_member sponsor_member)a
@optional_fields ~w(articles_upvotes_count articles_collects_count contents_watched_count followers_count reputation donate_member senior_member sponsor_member)a

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

field(:contents_stared_count, :integer, default: 0)
field(:contents_favorited_count, :integer, default: 0)
field(:articles_upvotes_count, :integer, default: 0)
field(:articles_collects_count, :integer, default: 0)
field(:contents_watched_count, :integer, default: 0)
field(:followers_count, :integer, default: 0)
field(:reputation, :integer, default: 0)
Expand Down
59 changes: 59 additions & 0 deletions lib/groupher_server/accounts/collect_folder.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
defmodule GroupherServer.Accounts.CollectFolder do
@moduledoc false
alias __MODULE__

use Ecto.Schema
import Ecto.Changeset

alias GroupherServer.{Accounts, CMS}
alias Accounts.{User, Embeds}
alias CMS.ArticleCollect

@required_fields ~w(user_id title)a
@optional_fields ~w(index total_count private desc last_updated)a

@supported_threads [:post, :job, :repo]

def supported_threads, do: @supported_threads

@type t :: %CollectFolder{}
schema "collect_folders" do
belongs_to(:user, User, foreign_key: :user_id)
# has_many(:posts, ...)

field(:title, :string)
field(:desc, :string)
field(:index, :integer)
field(:total_count, :integer, default: 0)
field(:private, :boolean, default: false)
# last time when add/delete items in category
field(:last_updated, :utc_datetime)

# 可以参照 fragment 查询语法啊
# 2. article truple [{:post, 1}, [:job, 2]] ... 便于在计算 "成就" 的时候对比
embeds_one(:meta, Embeds.CollectFolderMeta, on_replace: :delete)
embeds_many(:collects, ArticleCollect, on_replace: :delete)

timestamps(type: :utc_datetime)
end

@doc false
def changeset(%CollectFolder{} = collect_folder, attrs) do
collect_folder
|> cast(attrs, @optional_fields ++ @required_fields)
|> validate_required(@required_fields)
|> cast_embed(:meta, required: true, with: &Embeds.CollectFolderMeta.changeset/2)
|> validate_length(:title, min: 1)
|> foreign_key_constraint(:user_id)
end

@doc false
def update_changeset(%CollectFolder{} = collect_folder, attrs) do
collect_folder
|> cast(attrs, @optional_fields ++ @required_fields)
|> cast_embed(:collects, with: &ArticleCollect.changeset/2)
|> cast_embed(:meta, with: &Embeds.CollectFolderMeta.changeset/2)
|> validate_length(:title, min: 1)
|> foreign_key_constraint(:user_id)
end
end
76 changes: 32 additions & 44 deletions lib/groupher_server/accounts/delegates/achievements.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
@moduledoc """
user achievements related
acheiveements formula:
1. create content been stared by other user + 1
1. create content been upvoteed by other user + 1
2. create content been watched by other user + 1
3. create content been favorited by other user + 2
3. create content been colleced by other user + 2
4. followed by other user + 3
"""
import Ecto.Query, warn: false
Expand All @@ -14,16 +14,16 @@ defmodule GroupherServer.Accounts.Delegate.Achievements do
alias Helper.{ORM, SpecType}
alias GroupherServer.Accounts.{Achievement, User}

@favorite_weight get_config(:general, :user_achieve_favorite_weight)
@star_weight get_config(:general, :user_achieve_star_weight)
@collect_weight get_config(:general, :user_achieve_collect_weight)
@upvote_weight get_config(:general, :user_achieve_upvote_weight)
# @watch_weight get_config(:general, :user_achieve_watch_weight)
@follow_weight get_config(:general, :user_achieve_follow_weight)

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

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

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

achievement
|> ORM.update(~m(contents_stared_count reputation)a)
|> ORM.update(~m(articles_upvotes_count reputation)a)
end
end

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

achievement
|> ORM.update(~m(contents_stared_count reputation)a)
|> ORM.update(~m(articles_upvotes_count reputation)a)
end
end

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

achievement
|> ORM.update(~m(contents_favorited_count reputation)a)
|> ORM.update(~m(articles_collects_count reputation)a)
end
end

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

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

achievement
|> ORM.update(~m(contents_favorited_count reputation)a)
|> ORM.update(~m(articles_collects_count reputation)a)
end
end

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

achievement
|> ORM.update(~m(contents_favorited_count reputation)a)
achievement |> ORM.update(~m(articles_collects_count reputation)a)
end
end

# @spec safe_minus(non_neg_integer(), non_neg_integer()) :: non_neg_integer()
# defp safe_minus(count, unit) when is_integer(count) and is_integer(unit) and unit > 0 do
# case count <= 0 do
# true ->
# 0

# false ->
# count - unit
# end
# end

@doc """
list communities which the user is editor in it
"""
Expand Down
Loading