aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/push
diff options
context:
space:
mode:
authorMartin Kühl <martin.kuehl@gmail.com>2018-09-18 11:56:46 +0200
committerMartin Kühl <martin.kuehl@gmail.com>2018-09-22 07:04:01 +0200
commitd94ee5cd50005a947c3c3a734b086fd5cd266c8d (patch)
treed10a745b7d18c00b26fc457f274a61f6385d6ac8 /lib/pleroma/web/push
parentc2d592c9c5db8e0392948d5fc589761f482fc4f7 (diff)
downloadpleroma-d94ee5cd50005a947c3c3a734b086fd5cd266c8d.tar.gz
Mastodon API: Support push subscription CRUD
Diffstat (limited to 'lib/pleroma/web/push')
-rw-r--r--lib/pleroma/web/push/subscription.ex66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/pleroma/web/push/subscription.ex b/lib/pleroma/web/push/subscription.ex
new file mode 100644
index 000000000..dc8fe9f33
--- /dev/null
+++ b/lib/pleroma/web/push/subscription.ex
@@ -0,0 +1,66 @@
+defmodule Pleroma.Web.Push.Subscription do
+ use Ecto.Schema
+ import Ecto.{Changeset, Query}
+ alias Pleroma.{Repo, User}
+ alias Pleroma.Web.OAuth.Token
+ alias Pleroma.Web.Push.Subscription
+
+ schema "push_subscriptions" do
+ belongs_to(:user, User)
+ belongs_to(:token, Token)
+ field(:endpoint, :string)
+ field(:key_p256dh, :string)
+ field(:key_auth, :string)
+ field(:data, :map, default: %{})
+
+ timestamps()
+ end
+
+ @supported_alert_types ~w[follow favourite mention reblog]
+
+ defp alerts(%{"data" => %{"alerts" => alerts}}) do
+ alerts = Map.take(alerts, @supported_alert_types)
+ %{"alerts" => alerts}
+ end
+
+ def create(
+ %User{} = user,
+ %Token{} = token,
+ %{
+ "subscription" => %{
+ "endpoint" => endpoint,
+ "keys" => %{"auth" => key_auth, "p256dh" => key_p256dh}
+ }
+ } = params
+ ) do
+ Repo.insert(%Subscription{
+ user_id: user.id,
+ token_id: token.id,
+ endpoint: endpoint,
+ key_auth: key_auth,
+ key_p256dh: key_p256dh,
+ data: alerts(params)
+ })
+ end
+
+ def get(%User{id: user_id}, %Token{id: token_id}) do
+ Repo.get_by(Subscription, user_id: user_id, token_id: token_id)
+ end
+
+ def update(user, token, params) do
+ get(user, token)
+ |> change(data: alerts(params))
+ |> Repo.update()
+ end
+
+ def delete(user, token) do
+ Repo.delete(get(user, token))
+ end
+
+ def delete_if_exists(user, token) do
+ case get(user, token) do
+ nil -> {:ok, nil}
+ sub -> Repo.delete(sub)
+ end
+ end
+end