Add webpush front-end support
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -5,9 +5,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
|
||||
import Mobilizon.Users.Guards
|
||||
alias Mobilizon.{Activities, Actors, Users}
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Service.Activity, as: ActivityService
|
||||
alias Mobilizon.Service.Activity.Utils
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@@ -27,12 +26,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
limit
|
||||
)
|
||||
|
||||
elements =
|
||||
Enum.map(elements, fn %Activity{} = activity ->
|
||||
activity
|
||||
|> Map.update(:subject_params, %{}, &transform_params/1)
|
||||
|> Map.put(:object, ActivityService.object(activity))
|
||||
end)
|
||||
elements = Enum.map(elements, &Utils.transform_activity/1)
|
||||
|
||||
{:ok, %Page{total: total, elements: elements}}
|
||||
else
|
||||
@@ -44,15 +38,4 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
def group_activity(_, _, _) do
|
||||
{:error, :unauthenticated}
|
||||
end
|
||||
|
||||
@spec transform_params(map()) :: list()
|
||||
defp transform_params(params) do
|
||||
Enum.map(params, fn {key, value} -> %{key: key, value: transform_value(value)} end)
|
||||
end
|
||||
|
||||
defp transform_value(value) when is_list(value) do
|
||||
Enum.join(value, ",")
|
||||
end
|
||||
|
||||
defp transform_value(value), do: value
|
||||
end
|
||||
|
||||
@@ -143,6 +143,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do
|
||||
},
|
||||
instance_feeds: %{
|
||||
enabled: Config.get([:instance, :enable_instance_feeds])
|
||||
},
|
||||
web_push: %{
|
||||
enabled: !is_nil(Application.get_env(:web_push_encryption, :vapid_details)),
|
||||
public_key:
|
||||
get_in(Application.get_env(:web_push_encryption, :vapid_details), [:public_key])
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
@@ -25,25 +25,39 @@ defmodule Mobilizon.GraphQL.Resolvers.PushSubscription do
|
||||
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))
|
||||
case Users.create_push_subscription(Map.put(args, :user_id, user_id)) do
|
||||
{:ok, %PushSubscription{}} ->
|
||||
{:ok, "OK"}
|
||||
|
||||
{:error, err} ->
|
||||
require Logger
|
||||
Logger.error(inspect(err))
|
||||
{:error, "Something went wrong"}
|
||||
end
|
||||
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}, %{
|
||||
def unregister_push_subscription(_parent, %{endpoint: push_subscription_endpoint}, %{
|
||||
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),
|
||||
Users.get_push_subscription_by_endpoint(push_subscription_endpoint),
|
||||
{:user_owns_push_subscription, true} <-
|
||||
{:user_owns_push_subscription, push_subscription_user_id == user_id} do
|
||||
Users.delete_push_subscription(push_subscription)
|
||||
{:user_owns_push_subscription, push_subscription_user_id == user_id},
|
||||
{:ok, %PushSubscription{}} <- Users.delete_push_subscription(push_subscription) do
|
||||
{:ok, "OK"}
|
||||
else
|
||||
{:user_owns_push_subscription, false} ->
|
||||
{:error, :unauthorized}
|
||||
|
||||
nil ->
|
||||
{:error, :not_found}
|
||||
|
||||
{:error, err} ->
|
||||
require Logger
|
||||
Logger.error(inspect(err))
|
||||
{:error, "Something went wrong"}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -47,6 +47,7 @@ defmodule Mobilizon.GraphQL.Schema do
|
||||
import_types(Schema.ReportType)
|
||||
import_types(Schema.AdminType)
|
||||
import_types(Schema.StatisticsType)
|
||||
import_types(Schema.Users.PushSubscription)
|
||||
|
||||
@desc "A struct containing the id of the deleted object"
|
||||
object :deleted_object do
|
||||
@@ -155,6 +156,7 @@ defmodule Mobilizon.GraphQL.Schema do
|
||||
import_fields(:resource_queries)
|
||||
import_fields(:post_queries)
|
||||
import_fields(:statistics_queries)
|
||||
# import_fields(:push_queries)
|
||||
end
|
||||
|
||||
@desc """
|
||||
@@ -179,6 +181,7 @@ defmodule Mobilizon.GraphQL.Schema do
|
||||
import_fields(:post_mutations)
|
||||
import_fields(:actor_mutations)
|
||||
import_fields(:follower_mutations)
|
||||
import_fields(:push_mutations)
|
||||
end
|
||||
|
||||
@desc """
|
||||
|
||||
@@ -64,6 +64,7 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do
|
||||
|
||||
field(:auth, :auth, description: "The instance auth methods")
|
||||
field(:instance_feeds, :instance_feeds, description: "The instance's feed settings")
|
||||
field(:web_push, :web_push, description: "Web Push settings for the instance")
|
||||
end
|
||||
|
||||
@desc """
|
||||
@@ -301,6 +302,11 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do
|
||||
field(:enabled, :boolean, description: "Whether the instance-wide feeds are enabled")
|
||||
end
|
||||
|
||||
object :web_push do
|
||||
field(:enabled, :boolean, description: "Whether the WebPush feature is enabled")
|
||||
field(:public_key, :string, description: "The server's public WebPush VAPID key")
|
||||
end
|
||||
|
||||
object :config_queries do
|
||||
@desc "Get the instance config"
|
||||
field :config, :config do
|
||||
|
||||
@@ -5,29 +5,32 @@ defmodule Mobilizon.GraphQL.Schema.Users.PushSubscription do
|
||||
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_subscription do
|
||||
# field(:id, :id)
|
||||
# end
|
||||
|
||||
object :push_queries do
|
||||
field :list_push_subscriptions, :paginated_push_subscription_list do
|
||||
resolve(&PushSubscription.list_user_push_subscriptions/3)
|
||||
end
|
||||
end
|
||||
# @desc "A paginated list of subscriptions"
|
||||
# object :paginated_push_subscription_list do
|
||||
# field(:elements, list_of(:push_subscription), description: "A list of push subscriptions")
|
||||
# field(:total, :integer, description: "The total number of push subscriptions in the list")
|
||||
# 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
|
||||
field :register_push, :string do
|
||||
arg(:endpoint, non_null(:string))
|
||||
arg(:keys, non_null(:push_subscription_keys))
|
||||
arg(:auth, non_null(:string))
|
||||
arg(:p256dh, non_null(:string))
|
||||
resolve(&PushSubscription.register_push_subscription/3)
|
||||
end
|
||||
|
||||
field :unregister_push_mutation, :string do
|
||||
arg(:id, non_null(:id))
|
||||
field :unregister_push, :string do
|
||||
arg(:endpoint, non_null(:string))
|
||||
resolve(&PushSubscription.unregister_push_subscription/3)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user