Skip to content

Instantly share code, notes, and snippets.

@bearded-avenger
Created August 26, 2020 00:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bearded-avenger/10da4f2cd2f00917053a3769afce19ba to your computer and use it in GitHub Desktop.
Save bearded-avenger/10da4f2cd2f00917053a3769afce19ba to your computer and use it in GitHub Desktop.
Access Service
module TenantServices
class AccessService
def initialize(params)
@site = params[:site]
@customer = params[:customer]
@user = params[:user]
@record = params[:record]
@feature = params[:feature]
end
def call
if !@record
result = false
elsif free?
if signin_required?
result = @user || @customer
else
result = true
end
else
result = (@user && @user.can_access_site?(@site)) || (@customer && customer_accessible?)
end
OpenStruct.new({success?: result})
end
private
attr_reader :site, :customer, :user, :record, :feature
def free?
record.free? || (defined?(record.course) && record.course && record.course.free?)
end
def signin_required?
record.signin_required? || (defined?(record.course) && record.course.signin_required?)
end
def customer_accessible?
ordered? || (feature ? subscribed_and_feature_supported? : subscribed?)
end
def ordered?
content.product.present? && customer.ordered_items.exists?(product_id: ordered_product_ids)
end
def ordered_product_ids
ids = []
ids << content.product.id
ids << (content.products_bundled_to.pluck(:product_id) if defined?(content.products_bundled_to) && content.products_bundled_to)
ids.flatten
end
def subscribed?
content.product.present? && customer.has_valid_subscription? && customer.subscription.subscription_plan.items.exists?(product_id:content.product.id)
end
def subscribed_and_feature_supported?
subscribed? && customer.can_access_feature?(feature)
end
def content
defined?(record.course) ? record.course : record
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment