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