Merge branch 'fix/credo-issues' into 'develop'
[akkoma] / lib / pleroma / web / push / push.ex
index d9c3410fef82b0b242782d23de51cd5f5e0179e4..ddd4fe0376fdf3a1584be21f6f5994c1a6b8066f 100644 (file)
@@ -1,7 +1,12 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Web.Push do
   use GenServer
 
-  alias Pleroma.{Repo, User}
+  alias Pleroma.Repo
+  alias Pleroma.User
   alias Pleroma.Web.Push.Subscription
 
   require Logger
@@ -9,32 +14,44 @@ defmodule Pleroma.Web.Push do
 
   @types ["Create", "Follow", "Announce", "Like"]
 
-  @gcm_api_key nil
-
   def start_link() do
     GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
   end
 
-  def init(:ok) do
-    case Application.get_env(:web_push_encryption, :vapid_details) do
-      nil ->
-        Logger.warn(
-          "VAPID key pair is not found. Please, add VAPID configuration to config. Run `mix web_push.gen.keypair` mix task to create a key pair"
-        )
-
-        :ignore
+  def vapid_config() do
+    Application.get_env(:web_push_encryption, :vapid_details, [])
+  end
 
-      _ ->
-        {:ok, %{}}
+  def enabled() do
+    case vapid_config() do
+      [] -> false
+      list when is_list(list) -> true
+      _ -> false
     end
   end
 
   def send(notification) do
-    if Application.get_env(:web_push_encryption, :vapid_details) do
+    if enabled() do
       GenServer.cast(Pleroma.Web.Push, {:send, notification})
     end
   end
 
+  def init(:ok) do
+    if !enabled() do
+      Logger.warn("""
+      VAPID key pair is not found. If you wish to enabled web push, please run
+
+          mix web_push.gen.keypair
+
+      and add the resulting output to your configuration file.
+      """)
+
+      :ignore
+    else
+      {:ok, nil}
+    end
+  end
+
   def handle_cast(
         {:send, %{activity: %{data: %{"type" => type}}, user_id: user_id} = notification},
         state
@@ -42,7 +59,7 @@ defmodule Pleroma.Web.Push do
       when type in @types do
     actor = User.get_cached_by_ap_id(notification.activity.data["actor"])
 
-    type = format_type(notification)
+    type = Pleroma.Activity.mastodon_notification_type(notification.activity)
 
     Subscription
     |> where(user_id: ^user_id)
@@ -71,7 +88,11 @@ defmodule Pleroma.Web.Push do
           preferred_locale: "en"
         })
 
-      case WebPushEncryption.send_web_push(body, sub) do
+      case WebPushEncryption.send_web_push(
+             body,
+             sub,
+             Application.get_env(:web_push_encryption, :gcm_api_key)
+           ) do
         {:ok, %{status_code: code}} when 400 <= code and code < 500 ->
           Logger.debug("Removing subscription record")
           Repo.delete!(subscription)
@@ -98,16 +119,6 @@ defmodule Pleroma.Web.Push do
     {:noreply, state}
   end
 
-  # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19
-  defp format_type(%{activity: %{data: %{"type" => type}}}) do
-    case type do
-      "Create" -> "mention"
-      "Follow" -> "follow"
-      "Announce" -> "reblog"
-      "Favorite" -> "favourite"
-    end
-  end
-
   defp format_title(%{activity: %{data: %{"type" => type}}}) do
     case type do
       "Create" -> "New Mention"
@@ -119,7 +130,7 @@ defmodule Pleroma.Web.Push do
 
   defp format_body(%{activity: %{data: %{"type" => type}}}, actor) do
     case type do
-      "Create" -> "@#{actor.nickname} has mentiond you"
+      "Create" -> "@#{actor.nickname} has mentioned you"
       "Follow" -> "@#{actor.nickname} has followed you"
       "Announce" -> "@#{actor.nickname} has repeated your post"
       "Like" -> "@#{actor.nickname} has favorited your post"