55 lines
1.2 KiB
Ruby
55 lines
1.2 KiB
Ruby
class Plan
|
|
PLANS = {
|
|
free_v1: { name: "Free", price: 0, card_limit: 1000, storage_limit: 1.gigabytes },
|
|
monthly_v1: { name: "Unlimited", price: 20, card_limit: Float::INFINITY, storage_limit: 5.gigabytes, stripe_price_id: ENV["STRIPE_MONTHLY_V1_PRICE_ID"] }
|
|
}
|
|
|
|
attr_reader :key, :name, :price, :card_limit, :storage_limit, :stripe_price_id
|
|
|
|
class << self
|
|
def all
|
|
@all ||= PLANS.map { |key, properties| new(key: key, **properties) }
|
|
end
|
|
|
|
def free
|
|
@free ||= find(:free_v1)
|
|
end
|
|
|
|
def paid
|
|
@paid ||= find(:monthly_v1)
|
|
end
|
|
|
|
def find(key)
|
|
@all_by_key ||= all.index_by(&:key).with_indifferent_access
|
|
@all_by_key[key]
|
|
end
|
|
|
|
alias [] find
|
|
end
|
|
|
|
def initialize(key:, name:, price:, card_limit:, storage_limit:, stripe_price_id: nil)
|
|
@key = key
|
|
@name = name
|
|
@price = price
|
|
@card_limit = card_limit
|
|
@storage_limit = storage_limit
|
|
@stripe_price_id = stripe_price_id
|
|
end
|
|
|
|
def free?
|
|
price.zero?
|
|
end
|
|
|
|
def paid?
|
|
!free?
|
|
end
|
|
|
|
def limit_cards?
|
|
card_limit != Float::INFINITY
|
|
end
|
|
|
|
def formatted_storage_limit
|
|
ActionController::Base.helpers.number_to_human_size(storage_limit).delete(" ")
|
|
end
|
|
end
|