lib/vidibus/service/mongoid.rb in vidibus-service-0.2.0 vs lib/vidibus/service/mongoid.rb in vidibus-service-0.3.0

- old
+ new

@@ -2,29 +2,26 @@ module Service module Mongoid extend ActiveSupport::Concern include Vidibus::Secure::Mongoid - class ConfigurationError < Error; end - class ConnectorError < Error; end - included do field :url field :uuid field :function field :realm_uuid - field :this, :type => ::Mongoid::Boolean + field :this, :type => Boolean, :default => false attr_accessor :nonce attr_encrypted :secret validates :url, :uri => {:protocol => [:http, :https], :accessible => false} validates :uuid, :uuid => true, :uniqueness => {:scope => :realm_uuid} validates :realm_uuid, :uuid => {:allow_blank => true} validates :function, :presence => true validates :secret, :presence => true, :unless => :connector? - validates :realm_uuid, :presence => true, :unless => Proc.new {|s| s.connector? or s.this?} + validates :realm_uuid, :presence => true, :if => :realm_required? validate :dont_allow_secret_for_connector, :if => :connector? # Removes trailing slash from given value. def url=(value) @@ -68,10 +65,14 @@ def dont_allow_secret_for_connector if connector? && secret errors.add(:secret, :secret_not_allowed_for_connector) end end + + def realm_required? + !connector? && !this? + end end module ClassMethods # Returns this service, if it has been configured, or raises an ConfigurationError. @@ -87,14 +88,11 @@ end # Returns best service by function or UUID within given realm. # If a service can be found in stored, it will be fetched from Connector. def discover(wanted, realm = nil) - unless service = local(wanted, realm) - service = remote(wanted, realm) - end - service + local(wanted, realm) || remote(wanted, realm) end # Returns stored service by function or UUID within given realm. def local(wanted, realm = nil) key = Vidibus::Uuid.validate(wanted) ? :uuid : :function @@ -104,18 +102,24 @@ # Requests service from Connector and stores it. # Wanted may be a function or an UUID. # This method should not be called directly. Use #discover to avoid unneccessary lookups. def remote(wanted, realm) unless realm - raise ArgumentError.new("Please provide a valid realm to discover an appropriate service.") + fail(ArgumentError, 'Please provide a valid realm to discover an appropriate service.') end - if response = connector.client.get("/services/#{wanted}", :query => {:realm => realm}) - secret = response["secret"] || raise(ConnectorError.new("The Connector did not return a secret for #{wanted}. Response was: #{response.parsed_response.inspect}")) + response = connector.client. + get("/services/#{wanted}", :query => {:realm => realm}) + if response + secret = response["secret"] + unless secret + fail(ConnectorError, "The Connector did not return a secret for #{wanted}. Response was: #{response.parsed_response.inspect}") + end secret = Vidibus::Secure.decrypt(secret, this.secret) - attributes = response.only(%w[uuid function url]).merge(:realm_uuid => realm, :secret => secret) + attributes = response.only(%w[uuid function url]). + merge(:realm_uuid => realm, :secret => secret) create!(attributes) else - raise "no service found" + fail('no service found') end end end end end