session_timeout_job.rb 964 B

1234567891011121314151617181920212223242526272829303132333435
  1. class SessionTimeoutJob < ApplicationJob
  2. def perform
  3. sessions.each do |session|
  4. perform_session(session)
  5. end
  6. end
  7. def perform_session(session)
  8. # user is optional because it can be deleted already
  9. if session.user?
  10. return if session.active?
  11. # if the user has no active sessions then we
  12. # make sure to definitely log him out if there
  13. # is any frontends opened
  14. if !active_session(session.user)
  15. session.frontend_timeout
  16. end
  17. end
  18. session.destroy
  19. end
  20. def active_session(user)
  21. @active_session ||= {}
  22. return @active_session[user.id] if @active_session[user.id].present?
  23. @active_session[user.id] = sessions.detect { |session| session.active? && session.user? && session.user.id == user.id }
  24. end
  25. def sessions
  26. @sessions ||= ActiveRecord::SessionStore::Session.order(updated_at: :desc).limit(10_000).map { |session| SessionTimeoutJob::Session.new(session) }
  27. end
  28. end