Add Push notifications backend support

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-05-06 12:27:04 +02:00
parent 4f6e203ced
commit 9f5e3a39ec
14 changed files with 321 additions and 26 deletions

View File

@@ -13,7 +13,7 @@ defmodule Mobilizon.Users do
alias Mobilizon.{Crypto, Events}
alias Mobilizon.Events.FeedToken
alias Mobilizon.Storage.{Page, Repo}
alias Mobilizon.Users.{Setting, User}
alias Mobilizon.Users.{PushSubscription, Setting, User}
defenum(UserRole, :user_role, [:administrator, :moderator, :user])
@@ -405,6 +405,80 @@ defmodule Mobilizon.Users do
Setting.changeset(setting, %{})
end
@doc """
Get a paginated list of all of a user's subscriptions
"""
@spec list_user_push_subscriptions(String.t() | integer(), integer() | nil, integer() | nil) ::
Page.t()
def list_user_push_subscriptions(user_id, page \\ nil, limit \\ nil) do
PushSubscription
|> where([p], p.user_id == ^user_id)
|> preload([:user])
|> Page.build_page(page, limit)
end
@doc """
Get a push subscription by their ID
"""
@spec get_push_subscription(String.t() | integer()) :: PushSubscription.t() | nil
def get_push_subscription(push_subscription_id) do
PushSubscription
|> Repo.get(push_subscription_id)
|> Repo.preload([:user])
end
@doc """
Creates a push subscription.
## Examples
iex> create_push_subscription(%{field: value})
{:ok, %PushSubscription{}}
iex> create_push_subscription(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_push_subscription(attrs \\ %{}) do
%PushSubscription{}
|> PushSubscription.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a push subscription.
## Examples
iex> update_push_subscription(push_subscription, %{field: new_value})
{:ok, %PushSubscription{}}
iex> update_push_subscription(push_subscription, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_push_subscription(%PushSubscription{} = push_subscription, attrs) do
push_subscription
|> PushSubscription.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a push subscription.
## Examples
iex> delete_push_subscription(push_subscription)
{:ok, %PushSubscription{}}
iex> delete_push_subscription(push_subscription)
{:error, %Ecto.Changeset{}}
"""
def delete_push_subscription(%PushSubscription{} = push_subscription) do
Repo.delete(push_subscription)
end
@spec user_by_email_query(String.t(), boolean | nil, boolean()) :: Ecto.Query.t()
defp user_by_email_query(email, activated, unconfirmed) do
User