forked from AkkomaGang/akkoma
Add Notification.for_user_since/2
This commit is contained in:
parent
2f0203a4a1
commit
aeafa0b2ef
3 changed files with 67 additions and 0 deletions
|
@ -467,6 +467,7 @@
|
||||||
config :pleroma, :email_notifications,
|
config :pleroma, :email_notifications,
|
||||||
digest: %{
|
digest: %{
|
||||||
# When to send digest email, in crontab format (https://en.wikipedia.org/wiki/Cron)
|
# When to send digest email, in crontab format (https://en.wikipedia.org/wiki/Cron)
|
||||||
|
# 0 0 * * 0 - once a week at midnight on Sunday morning
|
||||||
schedule: "0 0 * * 0",
|
schedule: "0 0 * * 0",
|
||||||
# Minimum interval between digest emails to one user
|
# Minimum interval between digest emails to one user
|
||||||
interval: 7,
|
interval: 7,
|
||||||
|
|
|
@ -17,6 +17,8 @@ defmodule Pleroma.Notification do
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
|
|
||||||
|
@type t :: %__MODULE__{}
|
||||||
|
|
||||||
schema "notifications" do
|
schema "notifications" do
|
||||||
field(:seen, :boolean, default: false)
|
field(:seen, :boolean, default: false)
|
||||||
belongs_to(:user, User, type: Pleroma.FlakeId)
|
belongs_to(:user, User, type: Pleroma.FlakeId)
|
||||||
|
@ -51,6 +53,25 @@ def for_user(user, opts \\ %{}) do
|
||||||
|> Pagination.fetch_paginated(opts)
|
|> Pagination.fetch_paginated(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns notifications for user received since given date.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> Pleroma.Notification.for_user_since(%Pleroma.User{}, ~N[2019-04-13 11:22:33])
|
||||||
|
[%Pleroma.Notification{}, %Pleroma.Notification{}]
|
||||||
|
|
||||||
|
iex> Pleroma.Notification.for_user_since(%Pleroma.User{}, ~N[2019-04-15 11:22:33])
|
||||||
|
[]
|
||||||
|
"""
|
||||||
|
@spec for_user_since(Pleroma.User.t(), NaiveDateTime.t()) :: [t()]
|
||||||
|
def for_user_since(user, date) do
|
||||||
|
from(n in for_user_query(user),
|
||||||
|
where: n.updated_at > ^date
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
def set_read_up_to(%{id: user_id} = _user, id) do
|
def set_read_up_to(%{id: user_id} = _user, id) do
|
||||||
query =
|
query =
|
||||||
from(
|
from(
|
||||||
|
|
|
@ -331,6 +331,51 @@ test "Updates `updated_at` field" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "for_user_since/2" do
|
||||||
|
defp days_ago(days) do
|
||||||
|
NaiveDateTime.add(
|
||||||
|
NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second),
|
||||||
|
-days * 60 * 60 * 24,
|
||||||
|
:second
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "Returns recent notifications" do
|
||||||
|
user1 = insert(:user)
|
||||||
|
user2 = insert(:user)
|
||||||
|
|
||||||
|
Enum.each(0..10, fn i ->
|
||||||
|
{:ok, _activity} =
|
||||||
|
CommonAPI.post(user1, %{
|
||||||
|
"status" => "hey ##{i} @#{user2.nickname}!"
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
{old, new} = Enum.split(Notification.for_user(user2), 5)
|
||||||
|
|
||||||
|
Enum.each(old, fn notification ->
|
||||||
|
notification
|
||||||
|
|> cast(%{updated_at: days_ago(10)}, [:updated_at])
|
||||||
|
|> Pleroma.Repo.update!()
|
||||||
|
end)
|
||||||
|
|
||||||
|
recent_notifications_ids =
|
||||||
|
user2
|
||||||
|
|> Notification.for_user_since(
|
||||||
|
NaiveDateTime.add(NaiveDateTime.utc_now(), -5 * 86400, :second)
|
||||||
|
)
|
||||||
|
|> Enum.map(& &1.id)
|
||||||
|
|
||||||
|
Enum.each(old, fn %{id: id} ->
|
||||||
|
refute id in recent_notifications_ids
|
||||||
|
end)
|
||||||
|
|
||||||
|
Enum.each(new, fn %{id: id} ->
|
||||||
|
assert id in recent_notifications_ids
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "notification target determination" do
|
describe "notification target determination" do
|
||||||
test "it sends notifications to addressed users in new messages" do
|
test "it sends notifications to addressed users in new messages" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue