push_subscriptions_controller.rb 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # frozen_string_literal: true
  2. class Api::Web::PushSubscriptionsController < Api::Web::BaseController
  3. before_action :require_user!
  4. before_action :set_push_subscription, only: :update
  5. def create
  6. active_session = current_session
  7. unless active_session.web_push_subscription.nil?
  8. active_session.web_push_subscription.destroy!
  9. active_session.update!(web_push_subscription: nil)
  10. end
  11. # Mobile devices do not support regular notifications, so we enable push notifications by default
  12. alerts_enabled = active_session.detection.device.mobile? || active_session.detection.device.tablet?
  13. data = {
  14. policy: 'all',
  15. alerts: Notification::TYPES.index_with { alerts_enabled },
  16. }
  17. data.deep_merge!(data_params) if params[:data]
  18. push_subscription = ::Web::PushSubscription.create!(
  19. endpoint: subscription_params[:endpoint],
  20. key_p256dh: subscription_params[:keys][:p256dh],
  21. key_auth: subscription_params[:keys][:auth],
  22. data: data,
  23. user_id: active_session.user_id,
  24. access_token_id: active_session.access_token_id
  25. )
  26. active_session.update!(web_push_subscription: push_subscription)
  27. render json: push_subscription, serializer: REST::WebPushSubscriptionSerializer
  28. end
  29. def update
  30. @push_subscription.update!(data: data_params)
  31. render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer
  32. end
  33. private
  34. def set_push_subscription
  35. @push_subscription = ::Web::PushSubscription.find(params[:id])
  36. end
  37. def subscription_params
  38. @subscription_params ||= params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh])
  39. end
  40. def data_params
  41. @data_params ||= params.require(:data).permit(:policy, alerts: Notification::TYPES)
  42. end
  43. end