session_activation.rb 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # frozen_string_literal: true
  2. # == Schema Information
  3. #
  4. # Table name: session_activations
  5. #
  6. # id :bigint(8) not null, primary key
  7. # session_id :string not null
  8. # created_at :datetime not null
  9. # updated_at :datetime not null
  10. # user_agent :string default(""), not null
  11. # ip :inet
  12. # access_token_id :bigint(8)
  13. # user_id :bigint(8) not null
  14. # web_push_subscription_id :bigint(8)
  15. #
  16. class SessionActivation < ApplicationRecord
  17. include BrowserDetection
  18. belongs_to :user, inverse_of: :session_activations
  19. belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy, optional: true
  20. belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy, optional: true
  21. delegate :token,
  22. to: :access_token,
  23. allow_nil: true
  24. before_create :assign_access_token
  25. DEFAULT_SCOPES = %w(read write follow).freeze
  26. scope :latest, -> { order(id: :desc) }
  27. class << self
  28. def active?(id)
  29. id && exists?(session_id: id)
  30. end
  31. def activate(**)
  32. activation = create!(**)
  33. purge_old
  34. activation
  35. end
  36. def deactivate(id)
  37. return unless id
  38. where(session_id: id).destroy_all
  39. end
  40. def purge_old
  41. latest.offset(Rails.configuration.x.max_session_activations).destroy_all
  42. end
  43. def exclusive(id)
  44. where.not(session_id: id).destroy_all
  45. end
  46. end
  47. private
  48. def assign_access_token
  49. self.access_token = Doorkeeper::AccessToken.create!(access_token_attributes)
  50. end
  51. def access_token_attributes
  52. {
  53. application_id: Doorkeeper::Application.find_by(superapp: true)&.id,
  54. resource_owner_id: user_id,
  55. scopes: DEFAULT_SCOPES.join(' '),
  56. expires_in: Doorkeeper.configuration.access_token_expires_in,
  57. use_refresh_token: Doorkeeper.configuration.refresh_token_enabled?,
  58. }
  59. end
  60. end