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

Commit dfba75e

Browse files
committed
refactor(notify): wip
1 parent 7e99c6c commit dfba75e

File tree

16 files changed

+287
-38
lines changed

16 files changed

+287
-38
lines changed

lib/groupher_server/accounts/accounts.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule GroupherServer.Accounts do
88
CollectFolder,
99
Publish,
1010
Mails,
11+
Mailbox,
1112
Profile,
1213
UpvotedArticles,
1314
Search,
@@ -74,6 +75,8 @@ defmodule GroupherServer.Accounts do
7475
defdelegate mark_mail_read_all(user, opt), to: Mails
7576
defdelegate mark_mail_read(mail, user), to: Mails
7677

78+
defdelegate update_mailbox_status(user_id), to: Mailbox
79+
7780
# customization
7881
defdelegate get_customization(user), to: Customization
7982
defdelegate set_customization(user, key, value), to: Customization
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
defmodule GroupherServer.Accounts.Delegate.Mailbox do
2+
import Ecto.Query, warn: false
3+
4+
alias GroupherServer.{Accounts, Delivery}
5+
alias Accounts.Model.User
6+
alias Helper.ORM
7+
8+
def update_mailbox_status(user_id) do
9+
with {:ok, user} <- ORM.find(User, user_id),
10+
{:ok, unread_mentions_count} <- Delivery.unread_count(:mention, user_id),
11+
{:ok, unread_notifications_count} <- Delivery.unread_count(:notification, user_id) do
12+
unread_total_count = unread_mentions_count + unread_notifications_count
13+
is_empty = unread_total_count < 1
14+
15+
mailbox = %{
16+
unread_mentions_count: unread_mentions_count,
17+
unread_notifications_count: unread_notifications_count,
18+
unread_total_count: unread_total_count,
19+
is_empty: is_empty
20+
}
21+
22+
user |> ORM.update_embed(:mailbox, mailbox)
23+
end
24+
end
25+
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule GroupherServer.Accounts.Model.Embeds.UserMailbox do
2+
@moduledoc """
3+
general article meta info for articles
4+
"""
5+
use Ecto.Schema
6+
use Accessible
7+
8+
import Ecto.Changeset
9+
10+
@optional_fields ~w(reported_count)a
11+
12+
embedded_schema do
13+
field(:is_empty, :boolean, default: false)
14+
field(:unread_total_count, :integer, default: 0)
15+
field(:unread_mentions_count, :integer, default: 0)
16+
field(:unread_notifications_count, :integer, default: 0)
17+
end
18+
19+
def changeset(struct, params) do
20+
struct |> cast(params, @optional_fields)
21+
end
22+
end

lib/groupher_server/accounts/models/user.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ defmodule GroupherServer.Accounts.Model.User do
7474

7575
embeds_one(:meta, Embeds.UserMeta, on_replace: :update)
7676
embeds_one(:contributes, Embeds.UserContribute, on_replace: :update)
77+
embeds_one(:mailbox, Embeds.UserMailbox, on_replace: :update)
7778

7879
has_one(:customization, Customization)
7980
has_one(:purchase, Purchase)
@@ -97,6 +98,7 @@ defmodule GroupherServer.Accounts.Model.User do
9798
|> cast_embed(:education_backgrounds, with: &EducationBackground.changeset/2)
9899
|> cast_embed(:work_backgrounds, with: &WorkBackground.changeset/2)
99100
|> cast_embed(:meta, required: false, with: &Embeds.UserMeta.changeset/2)
101+
|> cast_embed(:mailbox, required: false, with: &Embeds.UserMailbox.changeset/2)
100102
|> validate_length(:nickname, min: 3, max: 30)
101103
|> validate_length(:bio, min: 3, max: 100)
102104
|> validate_inclusion(:sex, ["dude", "girl"])

lib/groupher_server/delivery/delegates/mention.ex

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,13 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
4747
batch_delete_mentions(article, from_user)
4848
end)
4949
|> Multi.run(:batch_insert_mentions, fn _, _ ->
50-
mentions = Enum.map(mentions, &atom_values_to_upcase(&1))
50+
mentions =
51+
mentions
52+
|> Enum.map(&atom_values_to_upcase(&1))
53+
# ignore mention myself
54+
|> Enum.reject(&(&1.to_user_id == from_user.id))
5155

52-
case {0, nil} !== Repo.insert_all(Mention, mentions) do
56+
case Enum.empty?(mentions) or {0, nil} !== Repo.insert_all(Mention, mentions) do
5357
true -> {:ok, :pass}
5458
false -> {:error, "insert mentions error"}
5559
end
@@ -58,6 +62,7 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
5862
|> result()
5963
end
6064

65+
@doc "paged mentions"
6166
def paged_mentions(%User{} = user, %{page: page, size: size} = filter) do
6267
read = Map.get(filter, :read, false)
6368

@@ -69,6 +74,25 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
6974
|> done()
7075
end
7176

77+
@doc "get unread mentions count"
78+
def unread_count(user_id) do
79+
Mention
80+
|> where([m], m.to_user_id == ^user_id and m.read == false)
81+
|> Repo.aggregate(:count)
82+
|> done
83+
end
84+
85+
def mark_read(ids, %User{} = user) when is_list(ids) do
86+
query = Mention |> where([m], m.id in ^ids and m.to_user_id == ^user.id and m.read == false)
87+
88+
result = Repo.update_all(query, set: [read: true])
89+
90+
case result do
91+
{0, nil} -> {:error, "no such mentions found"}
92+
_ -> {:ok, :done}
93+
end
94+
end
95+
7296
defp batch_delete_mentions(%Comment{} = comment, %User{} = from_user) do
7397
from(m in Mention,
7498
where: m.comment_id == ^comment.id,
@@ -100,6 +124,7 @@ defmodule GroupherServer.Delivery.Delegate.Mention do
100124

101125
mention
102126
|> Map.take([
127+
:id,
103128
:thread,
104129
:article_id,
105130
:comment_id,

lib/groupher_server/delivery/delegates/notification.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,15 @@ defmodule GroupherServer.Delivery.Delegate.Notification do
6464
|> where([n], n.user_id == ^user_id)
6565
|> where([n], n.read == ^read)
6666
|> ORM.paginater(~m(page size)a)
67-
|> done()
67+
|> done
68+
end
69+
70+
# 注意这里并不是准确的 count, 因为可能有短时间内 merge 到一起的通知
71+
def unread_count(user_id) do
72+
Notification
73+
|> where([n], n.user_id == ^user_id and n.read == false)
74+
|> Repo.aggregate(:count)
75+
|> done
6876
end
6977

7078
# 如果在临近时间段内有类似操作,直接将这次的操作人添加到 from_users 中即可

lib/groupher_server/delivery/delegates/postman.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ defmodule GroupherServer.Delivery.Delegate.Postman do
1414
def fetch(:mention, user, filter), do: Mention.paged_mentions(user, filter)
1515
def fetch(:notification, user, filter), do: Notification.paged_notifications(user, filter)
1616

17+
def unread_count(:mention, user_id), do: Mention.unread_count(user_id)
18+
def unread_count(:notification, user_id), do: Notification.unread_count(user_id)
19+
20+
def mark_read(:mention, ids, user), do: Mention.mark_read(ids, user)
21+
# def mark_read(:mention, ids, user), do: false
22+
# def mark_read_all(:mention, id, user), do: false
23+
1724
# def send(_, _, _), do: {:error, "delivery, not such service"}
1825
# def send(_, _, _, _), do: {:error, "delivery, not such service"}
1926
end

lib/groupher_server/delivery/delivery.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ defmodule GroupherServer.Delivery do
1212
defdelegate send(service, attrs, from_user), to: Postman
1313
defdelegate revoke(service, attrs, from_user), to: Postman
1414
defdelegate fetch(service, user, filter), to: Postman
15+
defdelegate unread_count(service, user), to: Postman
1516

17+
defdelegate mark_read(service, ids, user), to: Postman
1618
# system_notifications
1719
defdelegate publish_system_notification(info), to: Notifications
1820
defdelegate fetch_sys_notifications(user, filter), to: Notifications

lib/groupher_server/delivery/models/mention.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ defmodule GroupherServer.Delivery.Model.Mention do
3434
|> foreign_key_constraint(:from_user_id)
3535
|> foreign_key_constraint(:to_user_id)
3636
end
37+
38+
def update_changeset(%Mention{} = mention, attrs) do
39+
mention |> cast(attrs, @optional_fields ++ @required_fields)
40+
end
3741
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule GroupherServer.Repo.Migrations.AddMailboxToUser do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:users) do
6+
add(:mailbox, :map)
7+
end
8+
end
9+
end

0 commit comments

Comments
 (0)