Sha256: 99025225df98953f9dd0657ff566f52515d34146ba4b3a889a25773836d7e2a8

Contents?: true

Size: 1.91 KB

Versions: 4

Compression:

Stored size: 1.91 KB

Contents

# This module is responsible for taking SolidusSubscriptions::LineItem
# objects and creating SolidusSubscriptions::Subscription Objects
module SolidusSubscriptions
  module SubscriptionGenerator
    extend self

    SubscriptionConfiguration = Struct.new(:interval_length, :interval_units, :end_date)

    # Create and persist a subscription for a collection of subscription
    #   line items
    #
    # @param subscription_line_items [Array<SolidusSubscriptions::LineItem>] The
    #   subscription_line_items to be activated
    #
    # @return [SolidusSubscriptions::Subscription]
    def activate(subscription_line_items)
      return if subscription_line_items.empty?

      order = subscription_line_items.first.order
      configuration = subscription_configuration(subscription_line_items.first)

      subscription_attributes = {
        user: order.user,
        line_items: subscription_line_items,
        store: order.store,
        shipping_address: order.ship_address,
        **configuration.to_h
      }

      Subscription.create!(subscription_attributes) do |sub|
        sub.actionable_date = sub.next_actionable_date
      end
    end

    # Group a collection of line items by common subscription configuration
    # options. Grouped subscription_line_items can belong to a single
    # subscription.
    #
    # @param subscription_line_items [Array<SolidusSubscriptions::LineItem>] The
    #   subscription_line_items to be grouped.
    #
    # @return [Array<Array<SolidusSubscriptions::LineItem>>]
    def group(subscription_line_items)
      subscription_line_items.group_by do |li|
        subscription_configuration(li)
      end.
      values
    end

    private

    def subscription_configuration(subscription_line_item)
      SubscriptionConfiguration.new(
        subscription_line_item.interval_length,
        subscription_line_item.interval_units,
        subscription_line_item.end_date
      )
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
solidus_subscriptions-alpha-0.0.5 app/models/solidus_subscriptions/subscription_generator.rb
solidus_subscriptions-alpha-0.0.3 app/models/solidus_subscriptions/subscription_generator.rb
solidus_subscriptions-alpha-0.0.2 app/models/solidus_subscriptions/subscription_generator.rb
solidus_subscriptions-alpha-0.0.1 app/models/solidus_subscriptions/subscription_generator.rb