Расширения Начиная с 2.0.0
Вы можете расширить базовый функционал, дополнив его собственными расширениями.
Рекомендуется создавать расширения в директории app/services/application_service/extensions
. Также в качестве рекомендации создавайте расширения в собственной директории.
Пример реализации
Подключение
Добавить расширения можно при помощи метода with_extensions
.
ruby
require_relative "extensions/status_active/dsl"
module ApplicationService
class Base
include Servactory::DSL.with_extensions(
ApplicationService::Extensions::StatusActive::DSL
)
end
end
Код расширения
ruby
module ApplicationService
module Extensions
module StatusActive
module DSL
def self.included(base)
base.extend(ClassMethods)
base.include(InstanceMethods)
end
module ClassMethods
private
attr_accessor :status_active_model_name
def status_active!(model_name)
self.status_active_model_name = model_name
end
end
module InstanceMethods
private
def call!(**)
super
status_active_model_name = self.class.send(:status_active_model_name)
return if status_active_model_name.nil?
is_active = inputs.send(status_active_model_name).active?
return if is_active
fail_input!(
status_active_model_name,
message: "#{status_active_model_name.to_s.camelize.singularize} is not active"
)
end
end
end
end
end
end
Использование
ruby
module PostsService
class Create < ApplicationService::Base
input :user, type: User
status_active! :user
make :something
private
def something
# ...
end
end
end