Sha256: a72b6371301d38bf2097016361b65cc7d5a6148c813bb9b57cd0c93773e52e39

Contents?: true

Size: 1.83 KB

Versions: 3

Compression:

Stored size: 1.83 KB

Contents

class Trailblazer::Operation
  def self.Model(model_class, action=nil)
    # step = Pipetree::Step.new(step, "model.class" => model_class, "model.action" => action)

    task = Trailblazer::Activity::TaskBuilder::Binary.( Model.new )

    extension = Trailblazer::Activity::TaskWrap::Merge.new(
      Wrap::Inject::Defaults(
        "model.class"  => model_class,
        "model.action" => action
      )
    )

    { task: task, id: "model.build", extension: [extension] }
  end

  class Model
    def call(options, params:,  **)
      builder = Model::Builder.new

      options[:model] = model = builder.(options, params)

      options["result.model"] = result = Result.new(!model.nil?, {})

      result.success?
    end

    class Builder
      def call(options, params)
        deprecate_update!(options)
        action      = options["model.action"] || :new
        model_class = options["model.class"]

        action = :pass_through unless [:new, :find_by, :find].include?(action)

        send("#{action}!", model_class, params, options["model.action"])
      end

      def new!(model_class, params, *)
        model_class.new
      end

      def find!(model_class, params, *)
        model_class.find(params[:id])
      end

      # Doesn't throw an exception and will return false to divert to Left.
      def find_by!(model_class, params, *)
        model_class.find_by(id: params[:id])
      end

      # Call any method on the model class and pass :id.
      def pass_through!(model_class, params, action)
        model_class.send(action, params[:id])
      end

    private
      def deprecate_update!(options) # TODO: remove in 2.1.
        return unless options["model.action"] == :update
        options["model.action"] = :find
        warn "[Trailblazer] Model( .., :update ) is deprecated, please use :find or :find_by."
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
trailblazer-2.1.0.beta4 lib/trailblazer/operation/model.rb
trailblazer-2.1.0.beta3 lib/trailblazer/operation/model.rb
trailblazer-2.1.0.beta2 lib/trailblazer/operation/model.rb