aboutsummaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-05-11 11:49:12 +0200
committerGitHub <noreply@github.com>2018-05-11 11:49:12 +0200
commitb4fb766b23f4b50b51a366f55b451770ece3153a (patch)
treef3089da3ee1d3d937525a227136a739a451caad9 /app/models
parent9a794067f77d936783736574640b1238bb8e6b18 (diff)
downloadmastodon-b4fb766b23f4b50b51a366f55b451770ece3153a.tar
mastodon-b4fb766b23f4b50b51a366f55b451770ece3153a.tar.gz
mastodon-b4fb766b23f4b50b51a366f55b451770ece3153a.tar.bz2
mastodon-b4fb766b23f4b50b51a366f55b451770ece3153a.zip
Add REST API for Web Push Notifications subscriptions (#7445)
- POST /api/v1/push/subscription - PUT /api/v1/push/subscription - DELETE /api/v1/push/subscription - New OAuth scope: "push" (required for the above methods)
Diffstat (limited to 'app/models')
-rw-r--r--app/models/user.rb2
-rw-r--r--app/models/web/push_subscription.rb47
2 files changed, 31 insertions, 18 deletions
diff --git a/app/models/user.rb b/app/models/user.rb
index f5f542f07..21c217e77 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -245,7 +245,7 @@ class User < ApplicationRecord
end
def web_push_subscription(session)
- session.web_push_subscription.nil? ? nil : session.web_push_subscription.as_payload
+ session.web_push_subscription.nil? ? nil : session.web_push_subscription
end
def invite_code=(code)
diff --git a/app/models/web/push_subscription.rb b/app/models/web/push_subscription.rb
index 1736106f7..df549c6d3 100644
--- a/app/models/web/push_subscription.rb
+++ b/app/models/web/push_subscription.rb
@@ -3,38 +3,51 @@
#
# Table name: web_push_subscriptions
#
-# id :bigint(8) not null, primary key
-# endpoint :string not null
-# key_p256dh :string not null
-# key_auth :string not null
-# data :json
-# created_at :datetime not null
-# updated_at :datetime not null
+# id :bigint(8) not null, primary key
+# endpoint :string not null
+# key_p256dh :string not null
+# key_auth :string not null
+# data :json
+# created_at :datetime not null
+# updated_at :datetime not null
+# access_token_id :bigint(8)
+# user_id :bigint(8)
#
-require 'webpush'
-
class Web::PushSubscription < ApplicationRecord
+ belongs_to :user, optional: true
+ belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', optional: true
+
has_one :session_activation
def push(notification)
- I18n.with_locale(session_activation.user.locale || I18n.default_locale) do
+ I18n.with_locale(associated_user.locale || I18n.default_locale) do
push_payload(message_from(notification), 48.hours.seconds)
end
end
def pushable?(notification)
- data&.key?('alerts') && data['alerts'][notification.type.to_s]
+ data&.key?('alerts') && ActiveModel::Type::Boolean.new.cast(data['alerts'][notification.type.to_s])
end
- def as_payload
- payload = { id: id, endpoint: endpoint }
- payload[:alerts] = data['alerts'] if data&.key?('alerts')
- payload
+ def associated_user
+ return @associated_user if defined?(@associated_user)
+
+ @associated_user = if user_id.nil?
+ session_activation.user
+ else
+ user
+ end
end
- def access_token
- find_or_create_access_token.token
+ def associated_access_token
+ return @associated_access_token if defined?(@associated_access_token)
+
+ @associated_access_token = if access_token_id.nil?
+ find_or_create_access_token.token
+ else
+ access_token
+ end
end
private