aboutsummaryrefslogtreecommitdiff
path: root/app/services
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/services
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/services')
-rw-r--r--app/services/notify_service.rb21
1 files changed, 12 insertions, 9 deletions
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index ba086449c..6490d2735 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -9,6 +9,7 @@ class NotifyService < BaseService
return if recipient.user.nil? || blocked?
create_notification
+ push_notification if @notification.browserable?
send_email if email_enabled?
rescue ActiveRecord::RecordInvalid
return
@@ -101,25 +102,27 @@ class NotifyService < BaseService
def create_notification
@notification.save!
- return unless @notification.browserable?
+ end
+
+ def push_notification
+ return if @notification.activity.nil?
+
Redis.current.publish("timeline:#{@recipient.id}", Oj.dump(event: :notification, payload: InlineRenderer.render(@notification, @recipient, :notification)))
send_push_notifications
end
def send_push_notifications
- # HACK: Can be caused by quickly unfavouriting a status, since creating
- # a favourite and creating a notification are not wrapped in a transaction.
- return if @notification.activity.nil?
-
- sessions_with_subscriptions = @recipient.user.session_activations.where.not(web_push_subscription: nil)
- sessions_with_subscriptions_ids = sessions_with_subscriptions.select { |session| session.web_push_subscription.pushable? @notification }.map(&:id)
+ subscriptions_ids = ::Web::PushSubscription.where(user_id: @recipient.user.id)
+ .select { |subscription| subscription.pushable?(@notification) }
+ .map(&:id)
- WebPushNotificationWorker.push_bulk(sessions_with_subscriptions_ids) do |session_activation_id|
- [session_activation_id, @notification.id]
+ ::Web::PushNotificationWorker.push_bulk(subscriptions_ids) do |subscription_id|
+ [subscription_id, @notification.id]
end
end
def send_email
+ return if @notification.activity.nil?
NotificationMailer.public_send(@notification.type, @recipient, @notification).deliver_later
end