Sha256: ee70dc0892494f37b25d7b1a3172681bb1b2039b67ead19afb68cb07ed299313

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

module Salestation
  module Web
    module Responses
      def self.to_created
        -> (object) { Deterministic::Result::Success(Responses::Created.new(body: object)) }
      end

      def self.to_accepted
        -> (object) { Deterministic::Result::Success(Responses::Accepted.new(body: object)) }
      end

      module Response
        def with_code(code)
          Class.new(self) do
            define_method :initialize do |attrs|
              super(attrs.merge(status: code))
            end
          end
        end
      end

      class Error
        extend Response
        include Virtus.value_object(strict: true)

        values do
          attribute :status, Integer
          attribute :message, String
          attribute :debug_message, String, default: ''
          attribute :context, Hash, default: {}
        end

        def body
          {message: message}
        end
      end

      class Success
        extend Response
        include Virtus.value_object(strict: true)

        values do
          attribute :status, Integer
          attribute :body, Hash
        end
      end

      class UnprocessableEntityFromSchemaErrors
        def self.create(errors:, hints:)
          message = errors
            .map { |field, error_messages| "'#{field}' #{error_messages.join(' and ')}" }
            .join(". ")

          debug_message = hints
            .select {|field, hint_messages| hint_messages.any? }
            .map { |field, hint_messages| "'#{field}' #{hint_messages.join(' and ')}" }
            .join(". ")

          UnprocessableEntity.new(message: message, debug_message: debug_message)
        end
      end

      Created = Success.with_code(201)
      Accepted = Success.with_code(202)

      Unauthorized = Error.with_code(401)
      UnprocessableEntity = Error.with_code(422)

      InternalError = Error.with_code(500)
      ServiceUnavailable = Error.with_code(503)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
salestation-0.0.1 lib/salestation/web/responses.rb