Sha256: 30ed453d7a3624e014a660dd3bccbecafc1496b703d6aac8ab2446a8394ca9b9

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

module Pushcart
  module Requestable
    extend ActiveSupport::Concern

    def request_subscription
      request(:subscription)
    end

    def request_renewal
      update_columns(
        renewal_requested_at: nil,
        renewal_request_responded_at: nil,
        renewal_request_response_code: nil,
        renewal_request_response_error: nil,
        renewal_denied_at: nil,
        renewal_denial_reason: nil,
        renewal_challenged_at: nil,
        renewal_verified_at: nil,
      )

      request(:renewal)
    end

    def request_unsubscription
      request(:unsubscription)
    end

    def request(type)
      modes = {
        subscription:     "subscribe",
        renewal:          "subscribe",
        unsubscription:   "unsubscribe"
      }

      mode = mode[type]
      prefix = types.to_s

      # Subscriber Sends Subscription Request

      update_attribute(:"#{prefix}_requested_at", Time.now)
      response = connection(mode: mode).post(hub)

      # Subscription Response Details

      update_attribute(:"#{prefix}_request_responded_at", Time.now)
      update_attribute(:"#{prefix}_request_response_code", response.status)

      (response.status == 202) ? _accepted(response) : _rejected(response)
    end

    # If the request was accepted, trigger the +receive+ event on the state
    # machine (which will transition to different states depending on whether
    # this is a subscribe, renew, or unsubscribe request).
    def _accepted(response)
      receive!
    end

    # If the request was not accepted for any reason (rejected by the hub, or
    # the response returned any status other than 202), trigger the +reject+
    # event. This will move the subscription to a `rejected` state regardless
    # of what kind of request was made.
    # TODO Make sure unsub. rejections are being handled correctly.
    def _rejected(response)
      update_attribute(:"#{prefix}_request_response_error", request_response.body)
      reject!
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pushcart-0.0.1.proto1 lib/pushcart/requestable.rb