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

Commit aa80d1a

Browse files
committed
refactor(notify): refactor account mailbox tests
1 parent 43d3315 commit aa80d1a

File tree

24 files changed

+259
-912
lines changed

24 files changed

+259
-912
lines changed

lib/groupher_server/accounts/accounts.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ defmodule GroupherServer.Accounts do
6262
# upvoted articles
6363
defdelegate paged_upvoted_articles(user_id, filter), to: UpvotedArticles
6464

65+
defdelegate mailbox_status(user), to: Mailbox
6566
defdelegate update_mailbox_status(user_id), to: Mailbox
6667

6768
# customization

lib/groupher_server/accounts/delegates/mailbox.ex

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
defmodule GroupherServer.Accounts.Delegate.Mailbox do
22
import Ecto.Query, warn: false
33

4+
import Helper.Utils, only: [done: 1]
5+
46
alias GroupherServer.{Accounts, Delivery}
5-
alias Accounts.Model.User
7+
8+
alias Accounts.Model.{Embeds, User}
69
alias Helper.ORM
710

11+
@default_mailbox_status Embeds.UserMailbox.default_status()
12+
13+
def mailbox_status(%User{mailbox: nil}), do: @default_mailbox_status |> done
14+
def mailbox_status(%User{mailbox: mailbox}), do: mailbox |> done
15+
16+
@doc "update messages count in mailbox"
817
def update_mailbox_status(user_id) do
918
with {:ok, user} <- ORM.find(User, user_id),
1019
{:ok, unread_mentions_count} <- Delivery.unread_count(:mention, user_id),

lib/groupher_server/accounts/models/embeds/user_mailbox.ex

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,19 @@ defmodule GroupherServer.Accounts.Model.Embeds.UserMailbox do
77

88
import Ecto.Changeset
99

10-
@optional_fields ~w(reported_count)a
10+
@optional_fields ~w(is_empty unread_total_count unread_mentions_count unread_notifications_count)a
11+
12+
def default_status() do
13+
%{
14+
is_empty: true,
15+
unread_total_count: 0,
16+
unread_mentions_count: 0,
17+
unread_notifications_count: 0
18+
}
19+
end
1120

1221
embedded_schema do
13-
field(:is_empty, :boolean, default: false)
22+
field(:is_empty, :boolean, default: true)
1423
field(:unread_total_count, :integer, default: 0)
1524
field(:unread_mentions_count, :integer, default: 0)
1625
field(:unread_notifications_count, :integer, default: 0)

lib/groupher_server/delivery/delegates/mention.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
3737
false -> {:error, "insert mentions error"}
3838
end
3939
end)
40+
|> Multi.run(:update_user_mailbox_status, fn _, _ ->
41+
Enum.each(mentions, &Accounts.update_mailbox_status(&1.to_user_id)) |> done
42+
end)
4043
|> Repo.transaction()
4144
|> result()
4245
end
@@ -58,6 +61,9 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
5861
false -> {:error, "insert mentions error"}
5962
end
6063
end)
64+
|> Multi.run(:update_user_mailbox_status, fn _, _ ->
65+
Enum.each(mentions, &Accounts.update_mailbox_status(&1.to_user_id)) |> done
66+
end)
6167
|> Repo.transaction()
6268
|> result()
6369
end

lib/groupher_server/delivery/delegates/notification.ex

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ defmodule GroupherServer.Delivery.Delegate.Notification do
1212
alias GroupherServer.{Accounts, Delivery, Repo}
1313
alias Delivery.Model.Notification
1414
alias Accounts.Model.User
15+
1516
alias Helper.ORM
17+
alias Ecto.Multi
1618

1719
@notify_actions get_config(:general, :nofity_actions)
1820
@notify_group_interval_hour get_config(:general, :notify_group_interval_hour)
@@ -21,12 +23,23 @@ defmodule GroupherServer.Delivery.Delegate.Notification do
2123
with true <- action in @notify_actions,
2224
true <- is_valid?(attrs),
2325
true <- user_id !== from_user.id do
24-
from_user = from_user |> Map.take([:login, :nickname]) |> Map.put(:user_id, from_user.id)
25-
26-
case find_exist_notify(attrs, :latest_peroid) do
27-
{:ok, notify} -> merge_notification(notify, from_user)
28-
{:error, _} -> create_notification(attrs, from_user)
29-
end
26+
Multi.new()
27+
|> Multi.run(:upsert_notifications, fn _, _ ->
28+
from_user =
29+
from_user
30+
|> Map.take([:login, :nickname])
31+
|> Map.put(:user_id, from_user.id)
32+
33+
case find_exist_notify(attrs, :latest_peroid) do
34+
{:ok, notify} -> merge_notification(notify, from_user)
35+
{:error, _} -> create_notification(attrs, from_user)
36+
end
37+
end)
38+
|> Multi.run(:update_user_mailbox_status, fn _, %{upsert_notifications: nofity} ->
39+
Accounts.update_mailbox_status(nofity.user_id)
40+
end)
41+
|> Repo.transaction()
42+
|> result()
3043
else
3144
false -> {:error, "invalid args for notification"}
3245
error -> error
@@ -38,19 +51,27 @@ defmodule GroupherServer.Delivery.Delegate.Notification do
3851
attrs = attrs |> Map.put(:from_user, from_user)
3952

4053
with {:ok, notifications} <- find_exist_notify(attrs, :all) do
41-
Enum.each(notifications, fn notify ->
42-
case length(notify.from_users) == 1 do
43-
# 只有一就删除记录
44-
true ->
45-
ORM.delete(notify)
46-
47-
# 如果是多人集合就在 from_users 中删除该用户
48-
false ->
49-
from_users = Enum.reject(notify.from_users, &(&1.login == from_user.login))
50-
notify |> ORM.update_embed(:from_users, from_users)
51-
end
54+
Multi.new()
55+
|> Multi.run(:revoke_notifications, fn _, _ ->
56+
Enum.each(notifications, fn notify ->
57+
case length(notify.from_users) == 1 do
58+
# 只有一就删除记录
59+
true ->
60+
ORM.delete(notify)
61+
62+
# 如果是多人集合就在 from_users 中删除该用户
63+
false ->
64+
from_users = Enum.reject(notify.from_users, &(&1.login == from_user.login))
65+
notify |> ORM.update_embed(:from_users, from_users)
66+
end
67+
end)
68+
|> done
5269
end)
53-
|> done
70+
|> Multi.run(:update_user_mailbox_status, fn _, _ ->
71+
Enum.each(notifications, &Accounts.update_mailbox_status(&1.to_user_id)) |> done
72+
end)
73+
|> Repo.transaction()
74+
|> result()
5475
else
5576
false -> {:ok, :pass}
5677
{:error, _} -> {:ok, :pass}
@@ -191,4 +212,8 @@ defmodule GroupherServer.Delivery.Delegate.Notification do
191212
defp interval_threshold_time() do
192213
Timex.shift(Timex.now(), hours: -@notify_group_interval_hour)
193214
end
215+
216+
defp result({:ok, %{upsert_notifications: result}}), do: {:ok, result}
217+
defp result({:ok, %{revoke_notifications: result}}), do: {:ok, result}
218+
defp result({:error, _, result, _steps}), do: {:error, result}
194219
end

lib/groupher_server_web/resolvers/accounts_resolver.ex

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ defmodule GroupherServerWeb.Resolvers.Accounts do
220220
Accounts.paged_editable_communities(cur_user, filter)
221221
end
222222

223-
# TODO: refactor
224-
def get_mail_box_status(_root, _args, %{context: %{cur_user: cur_user}}) do
223+
def mailbox_status(_root, _args, %{context: %{cur_user: cur_user}}) do
225224
Accounts.mailbox_status(cur_user)
226225
end
227226

@@ -243,10 +242,6 @@ defmodule GroupherServerWeb.Resolvers.Accounts do
243242
Accounts.fetch_notifications(cur_user, filter)
244243
end
245244

246-
def fetch_sys_notifications(_root, %{filter: filter}, %{context: %{cur_user: cur_user}}) do
247-
Accounts.fetch_sys_notifications(cur_user, filter)
248-
end
249-
250245
def mark_notification_read(_root, %{id: id}, %{context: %{cur_user: cur_user}}) do
251246
Accounts.mark_mail_read(%NotificationMail{id: id}, cur_user)
252247
end

lib/groupher_server_web/resolvers/delivery_resolver.ex

Lines changed: 0 additions & 18 deletions
This file was deleted.

lib/groupher_server_web/schema.ex

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ defmodule GroupherServerWeb.Schema do
77
import GroupherServerWeb.Schema.Helper.Imports
88

99
alias GroupherServerWeb.Middleware, as: M
10-
alias GroupherServerWeb.Schema.{Account, Billing, CMS, Delivery, Statistics, Helper}
10+
alias GroupherServerWeb.Schema.{Account, Billing, CMS, Statistics, Helper}
1111

1212
import_types(Absinthe.Type.Custom)
1313

@@ -29,11 +29,6 @@ defmodule GroupherServerWeb.Schema do
2929
import_types(Statistics.Queries)
3030
import_types(Statistics.Mutations)
3131

32-
# delivery
33-
import_types(Delivery.Types)
34-
import_types(Delivery.Queries)
35-
import_types(Delivery.Mutations)
36-
3732
# cms
3833
import_types(CMS.Types)
3934
import_types(CMS.Queries)
@@ -48,7 +43,6 @@ defmodule GroupherServerWeb.Schema do
4843
import_fields(:account_queries)
4944
import_fields(:billing_queries)
5045
import_fields(:statistics_queries)
51-
import_fields(:delivery_queries)
5246
import_fields(:cms_queries)
5347
end
5448

@@ -59,8 +53,6 @@ defmodule GroupherServerWeb.Schema do
5953
import_fields(:billing_mutations)
6054
# statistics
6155
import_fields(:statistics_mutations)
62-
# delivery
63-
import_fields(:delivery_mutations)
6456
# cms
6557
import_fields(:cms_mutation_community)
6658
import_fields(:cms_opertion_mutations)

lib/groupher_server_web/schema/account/account_queries.ex

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ defmodule GroupherServerWeb.Schema.Account.Queries do
3535
resolve(&R.Accounts.subscribed_communities/3)
3636
end
3737

38-
@desc "get user's mentions"
39-
field :mentions, :paged_mentions do
40-
arg(:filter, :messages_filter)
41-
42-
middleware(M.Authorize, :login)
43-
middleware(M.PageSizeProof)
44-
resolve(&R.Accounts.fetch_mentions/3)
45-
end
38+
# @desc "get user's mentions"
39+
# field :mentions, :paged_mentions do
40+
# arg(:filter, :messages_filter)
41+
42+
# middleware(M.Authorize, :login)
43+
# middleware(M.PageSizeProof)
44+
# resolve(&R.Accounts.fetch_mentions/3)
45+
# end
4646

4747
@desc "get user's follower"
4848
field :paged_followers, :paged_users do

lib/groupher_server_web/schema/account/account_types.ex

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,38 +82,21 @@ defmodule GroupherServerWeb.Schema.Account.Types do
8282
# 3. has_notifications ?
8383
# 4. has_watches ?
8484

85-
field :mail_box, :mail_box_status do
85+
field :mailbox, :mailbox_status do
8686
middleware(M.Authorize, :login)
87-
resolve(&R.Accounts.get_mail_box_status/3)
88-
end
89-
90-
field :mentions, :paged_mentions do
91-
arg(:filter, :messages_filter)
92-
93-
middleware(M.Authorize, :login)
94-
middleware(M.PageSizeProof)
95-
resolve(&R.Accounts.fetch_mentions/3)
96-
end
97-
98-
field :notifications, :paged_notifications do
99-
arg(:filter, :messages_filter)
100-
101-
middleware(M.Authorize, :login)
102-
middleware(M.PageSizeProof)
103-
resolve(&R.Accounts.fetch_notifications/3)
104-
end
105-
106-
field :sys_notifications, :paged_sys_notifications do
107-
arg(:filter, :messages_filter)
108-
109-
middleware(M.Authorize, :login)
110-
middleware(M.PageSizeProof)
111-
resolve(&R.Accounts.fetch_sys_notifications/3)
87+
resolve(&R.Accounts.mailbox_status/3)
11288
end
11389

11490
timestamp_fields()
11591
end
11692

93+
object :mailbox_status do
94+
field(:is_empty, :boolean)
95+
field(:unread_total_count, :integer)
96+
field(:unread_mentions_count, :integer)
97+
field(:unread_notifications_count, :integer)
98+
end
99+
117100
# field(:sidebar_layout, :map)
118101
object :customization do
119102
field(:theme, :string)

0 commit comments

Comments
 (0)