Module: CanDo

Defined in:
lib/cando.rb,
lib/models/role.rb,
lib/models/user.rb,
lib/models/capability.rb

Defined Under Namespace

Classes: Capability, ConfigCannotBlockError, ConfigMysqlConnectionError, ConfigMysqlDBError, DBNotConnected, Role, UndefinedRole, User

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.cannot_block(&block) ⇒ Object

will be executed if ‘can(user_urn, :capability) { }` will not be executed due to missing capabilities



37
38
39
40
41
42
43
44
45
46
# File 'lib/cando.rb', line 37

def self.cannot_block(&block)
  if !block
    raise ConfigCannotBlockError.new("CanDo#cannot_block expects block")
  end
  if block.arity != 2
    raise ConfigCannotBlockError.new("CanDo#cannot_block expects block expecting two arguments |user_urn, capability|")
  end

  @@cannot_block_proc = block
end

.connect(connection) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/cando.rb', line 48

def self.connect(connection)
  if connection =~ /sqlite/
    raise ConfigMysqlDBError.new("sqlite is not supported as it misses certain constraints")
  end

  begin
    @db = Sequel.connect(connection)
    @db.test_connection
    @db
  rescue => e
    raise ConfigMysqlConnectionError.new(<<-EOF
Error connecting to database. Be sure to pass in a databse config like 'mysql://user:passwd@host/database':
#{e.message}
EOF
    )
  end
end

.dbObject



14
15
16
# File 'lib/cando.rb', line 14

def self.db
  @db or raise DBNotConnected.new("CanDo is not connected to a database")
end

.init(&block) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/cando.rb', line 18

def self.init(&block)
  CanDo.instance_eval &block

  begin
    Sequel::Model.db.test_connection
  rescue ::Sequel::Error => e
    raise DBNotConnected.new("No database connection established. Have you called 'connect' within the 'CanDo.init' block? Sequel error message is:\n#{e.message}")
  end

  Dir.glob(File.expand_path("#{__FILE__}/../models/*.rb")).each do |model|
    require_relative model
  end

  Sequel::Model.db
end

Instance Method Details

#assign_roles(user, roles) ⇒ Object



85
86
87
# File 'lib/cando.rb', line 85

def assign_roles(user, roles)
  CanDo::User.find_or_create(:id => user).assign_roles(roles)
end

#can(user_urn, capability) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/cando.rb', line 66

def can(user_urn, capability)
  user = CanDo::User.find(:id => user_urn)
  has_permission = user && user.can(capability)
  if block_given?
    if has_permission
     return yield
    end
    if @@cannot_block_proc
      self.instance_exec user_urn, capability, &@@cannot_block_proc
    end
  end

  has_permission
end

#capabilities(user) ⇒ Object



96
97
98
99
100
101
# File 'lib/cando.rb', line 96

def capabilities(user)
  user = CanDo::User.first(:id => user)
  return [] unless user

  user.capabilities.map{|x| x.to_sym }
end

#define_role(role, capabilities) ⇒ Object



81
82
83
# File 'lib/cando.rb', line 81

def define_role(role, capabilities)
  CanDo::Role.define_role(role, capabilities)
end

#roles(user) ⇒ Object



89
90
91
92
93
94
# File 'lib/cando.rb', line 89

def roles(user)
  user = CanDo::User.first(:id => user)
  return [] unless user

  user.roles.map(&:id)
end