Skip to content

Расширения Начиная с 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