Sha256: 32f4a4a436a5b6e911e0df23a688d6ba80351707635d26abe791b5055d211754

Contents?: true

Size: 1.58 KB

Versions: 3

Compression:

Stored size: 1.58 KB

Contents

module ClickSession
  class StatusReporter

    MAX_WEBHOOK_ATTEMPTS = 5

    def initialize(webhook)
      @webhook = webhook
    end

    delegate :serializer_class, :notifier_class, to: :clicksession_configuration

    def report(click_session)
      @click_session = click_session

      begin
        webhook.call(
          serialized_webhook_message
        )

        @click_session.reported_back!
        notifier.session_reported(@click_session)
      rescue StandardError => e
        notifier.rescued_error(e)
        handle_webhook_failure
      end
    end

    private

    attr_reader :webhook

    def serialized_webhook_message
      if @click_session.processed?
        serialize_success_message
      else
        serialize_error_message
      end
    end

    def serialize_success_message
      {
        id: @click_session.id,
        status: {
          success: true
        },
        data: serializer.serialize(@click_session.model)
      }
    end

    def serialize_error_message
      {
        id: @click_session.id,
        status: {
          success: false,
          message: "See error logs"
        }
      }
    end

    def handle_webhook_failure
      @click_session.webhook_attempt_failed
      @click_session.save!

      if @click_session.webhook_attempts >= MAX_WEBHOOK_ATTEMPTS
        notifier.session_failed_to_report(@click_session)
      end
    end

    def notifier
      @notifier ||= notifier_class.new
    end

    def serializer
      @serializer ||= serializer_class.new
    end

    def clicksession_configuration
      ClickSession.configuration
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
click_session-0.1.1 lib/click_session/status_reporter.rb
click_session-0.1.0 lib/click_session/status_reporter.rb
click_session-0.0.1 lib/click_session/status_reporter.rb