Class: TheHelp::Service
- Inherits:
-
Object
- Object
- TheHelp::Service
- Includes:
- ProvidesCallbacks, ServiceCaller
- Defined in:
- lib/the_help/service.rb
Overview
An Abstract Service Class with Authorization and Logging
Define subclasses of Service to build out the service layer of your application.
Constant Summary collapse
- CB_NOT_AUTHORIZED =
The default :not_authorized callback
It will raise a TheHelp::NotAuthorizedError when the context is not authorized to perform the service.
->(service:, context:) { raise TheHelp::NotAuthorizedError, "Not authorized to access #{service.name} as #{context.inspect}." }
Class Method Summary collapse
-
.attr_accessor(*names, make_private: false, private_reader: false, private_writer: false) ⇒ Object
Defines attr_accessors with scoping options.
-
.authorization_policy(allow_all: false, &block) ⇒ Object
Defines the service authorization policy.
-
.call(*args, &block) ⇒ Object
Convenience method to instantiate the service and immediately call it.
-
.inherited(other) ⇒ Object
:nodoc:.
- .input(name, **options) ⇒ Object
-
.main(&block) ⇒ Object
Defines the primary routine of the service.
-
.required_inputs ⇒ Object
:nodoc: instances need access to this, otherwise it would be made private.
Instance Method Summary collapse
- #call ⇒ Object
-
#initialize(context:, logger: Logger.new($stdout), not_authorized: CB_NOT_AUTHORIZED, **inputs) ⇒ Service
constructor
A new instance of Service.
Methods included from ServiceCaller
Methods included from ProvidesCallbacks
Constructor Details
#initialize(context:, logger: Logger.new($stdout), not_authorized: CB_NOT_AUTHORIZED, **inputs) ⇒ Service
Returns a new instance of Service.
186 187 188 189 190 191 192 |
# File 'lib/the_help/service.rb', line 186 def initialize(context:, logger: Logger.new($stdout), not_authorized: CB_NOT_AUTHORIZED, **inputs) self.context = context self.logger = logger self. = self.inputs = inputs end |
Class Method Details
.attr_accessor(*names, make_private: false, private_reader: false, private_writer: false) ⇒ Object
Defines attr_accessors with scoping options
114 115 116 117 118 119 120 121 |
# File 'lib/the_help/service.rb', line 114 def attr_accessor(*names, make_private: false, private_reader: false, private_writer: false) super(*names) names.each do |name| private name if make_private || private_reader private "#{name}=" if make_private || private_writer end end |
.authorization_policy(allow_all: false, &block) ⇒ Object
Defines the service authorization policy
If allow_all is set to true, or if the provided block (executed in the context of the service object) returns true, then the service will be run when called. Otherwise, the not_authorized callback will be invoked.
162 163 164 165 166 167 168 169 170 |
# File 'lib/the_help/service.rb', line 162 def (allow_all: false, &block) if allow_all define_method(:authorized?) { true } else define_method(:authorized?, &block) end private :authorized? self end |
.call(*args, &block) ⇒ Object
Convenience method to instantiate the service and immediately call it
Any arguments are passed to #initialize
126 127 128 129 130 |
# File 'lib/the_help/service.rb', line 126 def call(*args, &block) result = new(*args).call(&block) return result unless result.is_a?(self) self end |
.inherited(other) ⇒ Object
:nodoc:
133 134 135 |
# File 'lib/the_help/service.rb', line 133 def inherited(other) other.instance_variable_set(:@required_inputs, required_inputs.dup) end |
.input(name, **options) ⇒ Object
172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/the_help/service.rb', line 172 def input(name, **) attr_accessor name, make_private: true if .key?(:default) required_inputs.delete(name) define_method(name) do instance_variable_get("@#{name}") || [:default] end else required_inputs << name end self end |
.main(&block) ⇒ Object
Defines the primary routine of the service
The code that will be run when the service is called, assuming it is unauthorized.
147 148 149 150 151 |
# File 'lib/the_help/service.rb', line 147 def main(&block) define_method(:main, &block) private :main self end |
.required_inputs ⇒ Object
:nodoc: instances need access to this, otherwise it would be made private
139 140 141 |
# File 'lib/the_help/service.rb', line 139 def required_inputs @required_inputs ||= Set.new end |
Instance Method Details
#call ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/the_help/service.rb', line 194 def call validate_service_definition catch(:stop) do log_service_call main self.block_result = yield result if block_given? end return block_result if block_given? return result if result_set? self end |