Sha256: 2f253ff51fe46c652a9cdff0c5f24f25cd17cfe117610dbaa6a2a0aba304f0d7

Contents?: true

Size: 2 KB

Versions: 15

Compression:

Stored size: 2 KB

Contents

module Kaui
  class Ability
    include CanCan::Ability

    def initialize(user)
      if Kaui.demo_mode
        # Show the links, the server will enforce permissions
        can :manage, :all
        return
      end

      # user is a Kaui::User object (from Devise)
      user.permissions.each do |permission|
        # permission is something like invoice:item_adjust or payment:refund
        # We rely on a naming convention where the left part refers to a Kaui model
        model, action = permission_to_model_action(permission)
        if model == '*' and action == '*'
          # All permissions!
          can :manage, :all
        elsif model == '*' and action != '*'
          # TODO
        elsif action == '*'
          # TODO Not sure the :all is really working (but we don't use it)
          can :all, ('Kaui::' + model.camelize).constantize rescue nil
        else
          can action.to_sym, ('Kaui::' + model.camelize).constantize rescue nil
        end
      end
    rescue KillBillClient::API::Unauthorized => _
    end

    def permission_to_model_action(permission)
      #
      # Permissions are defined in Kill Kill apis (https://github.com/killbill/killbill-api/blob/master/src/main/java/org/killbill/billing/security/Permission.java)
      # and they look something like 'invoice:item_adjust' or 'payment:refund', where the first part is the Kill Bill module and the second the action.
      #
      # For most of those the Kill Bill module maps to the Kaui model, but for a few, the naming convention breaks, so in order to keep the API clean, we do the fix up
      # in KAUI itself:
      #
      to_be_model, action = permission.split(':')
      # Currently the only actions implemented for overdue and catalog (upload_config) are those implemented at the tenant level:
      if %w(tenant overdue catalog).include?(to_be_model)
        to_be_model = 'admin_tenant'
      end
      if to_be_model == 'entitlement'
        to_be_model = 'subscription'
      end

      [to_be_model, action]
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
kaui-2.1.0 app/models/kaui/ability.rb
kaui-2.0.4 app/models/kaui/ability.rb
kaui-2.0.3 app/models/kaui/ability.rb
kaui-2.0.2 app/models/kaui/ability.rb
kaui-2.0.1 app/models/kaui/ability.rb
kaui-2.0.0 app/models/kaui/ability.rb
kaui-1.4.1 app/models/kaui/ability.rb
kaui-1.4.0 app/models/kaui/ability.rb
kaui-1.3.0 app/models/kaui/ability.rb
kaui-1.2.0 app/models/kaui/ability.rb
kaui-1.1.0 app/models/kaui/ability.rb
kaui-1.0.0 app/models/kaui/ability.rb
kaui-0.16.2 app/models/kaui/ability.rb
kaui-0.16.1 app/models/kaui/ability.rb
kaui-0.16.0 app/models/kaui/ability.rb