My plugin is added to the config, but its middleware is never called
Some plugins are order-dependent.
For example, CanHaveConnectedSteps has a middleware for the instance result method in the Standard config.
middlewares :result do
# ...
use Plugins::Service::CanHaveConnectedSteps::Middleware
# ...
end
If your plugin enhances the instance result method as well, you may be affected by CanHaveConnectedSteps.
How? Let's check its source.
module ConvenientService
module Service
module Plugins
module CanHaveConnectedSteps
class Middleware < Core::MethodChainMiddleware
def next(...)
return chain.next(...) if entity.steps.none?
# ...
entity.steps.result
end
# ...
end
end
end
end
end
It works as a proxy middleware.
When a service has no steps, CanHaveConnectedSteps just calls what is next in the middleware chain, by chain.next(...).
Otherwise, it returns the last completed step result.
Let's place, e.g. HasJSendResultParamsValidations::UsingActiveModelValidations plugin after CanHaveConnectedSteps in your application service config.
module ApplicationService
module Config
include ConvenientService::Concern
included do
include ConvenientService::Standard::Config
# ...
middlewares :result do
use ConvenientService::Plugins::Service::HasJSendResultParamsValidations::UsingActiveModelValidations::Middleware
end
end
end
end
This way HasJSendResultParamsValidations::UsingActiveModelValidations is never called for services with steps.
To fix that, locate it before CanHaveConnectedSteps like so:
module ApplicationService
module Config
include ConvenientService::Concern
included do |service_class|
service_class.class_exec do
include ConvenientService::Standard::Config
# ...
middlewares :result do
insert_before \
ConvenientService::Plugins::Service::CanHaveConnectedSteps::Middleware,
ConvenientService::Plugins::Service::HasJSendResultParamsValidations::UsingActiveModelValidations::Middleware
end
end
end
end
end
Apart from insert_before, insert_after, insert_after_each, insert_before_each, replace, and delete are also available.