Add Push notifications backend support
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
49
lib/graphql/resolvers/push_subscription.ex
Normal file
49
lib/graphql/resolvers/push_subscription.ex
Normal file
@@ -0,0 +1,49 @@
|
||||
defmodule Mobilizon.GraphQL.Resolvers.PushSubscription do
|
||||
@moduledoc """
|
||||
Handles the push subscriptions-related GraphQL calls.
|
||||
"""
|
||||
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Users.{PushSubscription, User}
|
||||
|
||||
@doc """
|
||||
List all of an user's registered push subscriptions
|
||||
"""
|
||||
def list_user_push_subscriptions(_parent, %{page: page, limit: limit}, %{
|
||||
context: %{current_user: %User{id: user_id}}
|
||||
}) do
|
||||
%Page{} = page = Users.list_user_push_subscriptions(user_id, page, limit)
|
||||
{:ok, page}
|
||||
end
|
||||
|
||||
def list_user_push_subscriptions(_parent, _args, _resolution), do: {:error, :unauthenticated}
|
||||
|
||||
@doc """
|
||||
Register a push subscription
|
||||
"""
|
||||
def register_push_subscription(_parent, args, %{
|
||||
context: %{current_user: %User{id: user_id}}
|
||||
}) do
|
||||
Users.create_push_subscription(Map.put(args, :user_id, user_id))
|
||||
end
|
||||
|
||||
@spec unregister_push_subscription(map(), map(), map()) ::
|
||||
{:ok, PushSubscription.t()} | {:error, :unauthorized} | {:error, :not_found}
|
||||
def unregister_push_subscription(_parent, %{id: push_subscription_id}, %{
|
||||
context: %{current_user: %User{id: user_id}}
|
||||
}) do
|
||||
with %PushSubscription{user: %User{id: push_subscription_user_id}} = push_subscription <-
|
||||
Users.get_push_subscription(push_subscription_id),
|
||||
{:user_owns_push_subscription, true} <-
|
||||
{:user_owns_push_subscription, push_subscription_user_id == user_id} do
|
||||
Users.delete_push_subscription(push_subscription)
|
||||
else
|
||||
{:user_owns_push_subscription, false} ->
|
||||
{:error, :unauthorized}
|
||||
|
||||
nil ->
|
||||
{:error, :not_found}
|
||||
end
|
||||
end
|
||||
end
|
||||
34
lib/graphql/schema/users/push_subscription.ex
Normal file
34
lib/graphql/schema/users/push_subscription.ex
Normal file
@@ -0,0 +1,34 @@
|
||||
defmodule Mobilizon.GraphQL.Schema.Users.PushSubscription do
|
||||
@moduledoc """
|
||||
Schema representation for PushSubscription
|
||||
"""
|
||||
use Absinthe.Schema.Notation
|
||||
alias Mobilizon.GraphQL.Resolvers.PushSubscription
|
||||
|
||||
@desc """
|
||||
An object representing the keys for a push subscription
|
||||
"""
|
||||
input_object :push_subscription_keys do
|
||||
field(:p256dh, non_null(:string))
|
||||
field(:auth, non_null(:string))
|
||||
end
|
||||
|
||||
object :push_queries do
|
||||
field :list_push_subscriptions, :paginated_push_subscription_list do
|
||||
resolve(&PushSubscription.list_user_push_subscriptions/3)
|
||||
end
|
||||
end
|
||||
|
||||
object :push_mutations do
|
||||
field :register_push_mutation, :string do
|
||||
arg(:endpoint, non_null(:string))
|
||||
arg(:keys, non_null(:push_subscription_keys))
|
||||
resolve(&PushSubscription.register_push_subscription/3)
|
||||
end
|
||||
|
||||
field :unregister_push_mutation, :string do
|
||||
arg(:id, non_null(:id))
|
||||
resolve(&PushSubscription.unregister_push_subscription/3)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user