service.rb 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. class Service < ActiveRecord::Base
  2. attr_accessible :provider, :name, :token, :secret, :refresh_token, :expires_at, :global, :options
  3. serialize :options, Hash
  4. belongs_to :user
  5. has_many :agents
  6. validates_presence_of :user_id, :provider, :name, :token
  7. before_destroy :disable_agents
  8. def disable_agents
  9. self.agents.each do |agent|
  10. agent.service_id = nil
  11. agent.disabled = true
  12. agent.save!(validate: false)
  13. end
  14. end
  15. def toggle_availability!
  16. self.global = !self.global
  17. self.save!
  18. end
  19. def prepare_request
  20. if self.expires_at && Time.now > self.expires_at
  21. self.refresh_token!
  22. end
  23. end
  24. def refresh_token!
  25. response = HTTParty.post(endpoint, query: {
  26. type: 'refresh',
  27. client_id: ENV["#{self.provider.upcase}_OAUTH_KEY"],
  28. client_secret: ENV["#{self.provider.upcase}_OAUTH_SECRET"],
  29. refresh_token: self.refresh_token
  30. })
  31. data = JSON.parse(response.body)
  32. self.update(expires_at: Time.now + data['expires_in'], token: data['access_token'], refresh_token: data['refresh_token'].presence || self.refresh_token)
  33. end
  34. def self.initialize_or_update_via_omniauth(omniauth)
  35. case omniauth['provider']
  36. when 'twitter'
  37. find_or_initialize_by(provider: omniauth['provider'], name: omniauth['info']['nickname']).tap do |service|
  38. service.assign_attributes(token: omniauth['credentials']['token'], secret: omniauth['credentials']['secret'])
  39. end
  40. when 'github'
  41. find_or_initialize_by(provider: omniauth['provider'], name: omniauth['info']['nickname']).tap do |service|
  42. service.assign_attributes(token: omniauth['credentials']['token'])
  43. end
  44. when '37signals'
  45. find_or_initialize_by(provider: omniauth['provider'], name: omniauth['info']['name']).tap do |service|
  46. service.assign_attributes(token: omniauth['credentials']['token'],
  47. refresh_token: omniauth['credentials']['refresh_token'],
  48. expires_at: Time.at(omniauth['credentials']['expires_at']),
  49. options: {user_id: omniauth['extra']['accounts'][0]['id']})
  50. end
  51. else
  52. false
  53. end
  54. end
  55. private
  56. def endpoint
  57. client_options = "OmniAuth::Strategies::#{OmniAuth::Utils.camelize(self.provider)}".constantize.default_options['client_options']
  58. URI.join(client_options['site'], client_options['token_url'])
  59. end
  60. end