Add webpush front-end support

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-05-06 18:39:59 +02:00
parent 8c6b0003bc
commit 938f698b7a
99 changed files with 2594 additions and 1536 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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