core_models 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +34 -0
- data/lib/core_models.rb +4 -0
- data/lib/core_models/models/concerns/group_concerns.rb +31 -0
- data/lib/core_models/models/concerns/role_concerns.rb +31 -0
- data/lib/core_models/models/concerns/user_concerns.rb +102 -0
- data/lib/core_models/models/group.rb +25 -0
- data/lib/core_models/models/group_membership.rb +16 -0
- data/lib/core_models/models/groups_role.rb +15 -0
- data/lib/core_models/models/permission.rb +24 -0
- data/lib/core_models/models/role.rb +33 -0
- data/lib/core_models/models/roles_permission.rb +15 -0
- data/lib/core_models/models/user.rb +63 -0
- data/lib/core_models/version.rb +3 -0
- data/lib/generators/core_models_setup_generator.rb +19 -0
- data/lib/tasks/core_models_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +23 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/friendly_id.rb +88 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20150220064247_create_friendly_id_slugs.rb +15 -0
- data/spec/dummy/db/schema.rb +93 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +256 -0
- data/spec/dummy/log/test.log +21878 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/test.sqlite3 +0 -0
- data/spec/models/group_spec.rb +94 -0
- data/spec/models/permission_spec.rb +49 -0
- data/spec/models/role_spec.rb +113 -0
- data/spec/models/user_spec.rb +139 -0
- data/spec/rails_helper.rb +57 -0
- data/spec/schema.rb +103 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/factories.rb +54 -0
- data/spec/support/model_classes.rb +36 -0
- data/spec/support/setup.rb +48 -0
- data/spec/test.sqlite3 +0 -0
- metadata +294 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf3f58b587e3777e45aec16369a533180e2b42a0
|
4
|
+
data.tar.gz: 763caf91792393472bbe867505f4a8aa35707cb2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0d85d1815a6cb0cd28248ad40e6edf877193507e328d751b84d1fca783e5588a315d238c7b876c5add4df3b88efee573086b32c109096a27b9986b5a732d99a1
|
7
|
+
data.tar.gz: b72f6ed31f012c38fbfa3e89acb9128811b0aa6846115faf879f4123232835354c8cc7314b9eb3f67c4f5a3eab2670b686f8921ebd61319303bce47514d4a85f
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2015 Adam Balan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'CoreModels'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
Bundler::GemHelper.install_tasks
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
27
|
+
t.libs << 'lib'
|
28
|
+
t.libs << 'test'
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
30
|
+
t.verbose = false
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
task default: :test
|
data/lib/core_models.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module CoreModels
|
2
|
+
module Models
|
3
|
+
module Concerns
|
4
|
+
module GroupConcerns
|
5
|
+
def has_role?(name)
|
6
|
+
self.roles.where(role_name: name).any?
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_role(name)
|
10
|
+
self.roles.find(name.parameterize)
|
11
|
+
end
|
12
|
+
|
13
|
+
def role_names
|
14
|
+
self.roles.pluck(:role_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_role=(name)
|
18
|
+
self.roles << self.roles.klass.find_by(role_name: name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def change_roles=(names)
|
22
|
+
self.roles =self.roles.klass.where(role_name: names)
|
23
|
+
end
|
24
|
+
|
25
|
+
def remove_role=(name)
|
26
|
+
self.roles.delete(self.roles.klass.find_by(role_name: name))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CoreModels
|
2
|
+
module Models
|
3
|
+
module Concerns
|
4
|
+
module RoleConcerns
|
5
|
+
def has_permission?(name)
|
6
|
+
self.permissions.where(permission_name: name).any?
|
7
|
+
end
|
8
|
+
|
9
|
+
def has_group?(name)
|
10
|
+
self.groups.where(group_name: name).any?
|
11
|
+
end
|
12
|
+
|
13
|
+
def permission_names
|
14
|
+
self.permissions.pluck(:permission_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_permission=(name)
|
18
|
+
self.permissions << self.permissions.klass.find_by(permission_name: name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def change_permissions=(names)
|
22
|
+
self.permissions = self.permissions.klass.where(permission_name: names)
|
23
|
+
end
|
24
|
+
|
25
|
+
def remove_permission=(name)
|
26
|
+
self.permissions.delete(self.permissions.klass.find_by(permission_name: name))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module CoreModels
|
2
|
+
module Models
|
3
|
+
module Concerns
|
4
|
+
module UserConcerns
|
5
|
+
def has_group?(name)
|
6
|
+
self.groups.each do |g|
|
7
|
+
if g.group_name == name
|
8
|
+
return true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def has_role?(name)
|
16
|
+
self.roles.each do |r|
|
17
|
+
if r.role_name == name
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_role_for_group?(name, group_name)
|
26
|
+
if self.groups.where(group_name: group_name).any?
|
27
|
+
if self.groups.find(group_name.parameterize).roles.where(role_name: name).any?
|
28
|
+
self.has_role?(name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_group_membership(group, role)
|
34
|
+
self.group_memberships.create!(group_id: group.id, role_id: role.id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_role_from_group_membership(group_id)
|
38
|
+
self.group_memberships.find_by!(group_id: group_id).role
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove_group_membership(group_name)
|
42
|
+
group = self.groups.klass.find_by!(group_name: group_name)
|
43
|
+
self.group_memberships.where(group_id: group.id).delete_all
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_group=(group_name)
|
47
|
+
self.groups << self.groups.klass.find_by(group_name: group_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def role
|
51
|
+
self.roles.first.try(:role_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def group
|
55
|
+
self.groups.first.try(:group_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def group_names
|
59
|
+
associated_groups = Array.new
|
60
|
+
self.groups.each do |group|
|
61
|
+
associated_groups.push(group.group_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
associated_groups
|
65
|
+
end
|
66
|
+
|
67
|
+
def role_names
|
68
|
+
associated_roles = Array.new
|
69
|
+
self.roles.each do |role|
|
70
|
+
associated_roles.push(role.role_name)
|
71
|
+
end
|
72
|
+
|
73
|
+
associated_roles
|
74
|
+
end
|
75
|
+
|
76
|
+
def uniq_permissions
|
77
|
+
permission_array = Array.new
|
78
|
+
|
79
|
+
self.roles.each do |role|
|
80
|
+
role.permissions.each do |permission|
|
81
|
+
permission_array.push(permission.permission_name)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
permission_array.uniq
|
86
|
+
end
|
87
|
+
|
88
|
+
def permissions
|
89
|
+
permission_array = Array.new
|
90
|
+
|
91
|
+
self.roles.each do |role|
|
92
|
+
role.permissions.each do |permission|
|
93
|
+
permission_array.push(permission.permission_name)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
permission_array
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'concerns/group_concerns'
|
2
|
+
require 'active_support/concern'
|
3
|
+
|
4
|
+
module CoreModels
|
5
|
+
module Models
|
6
|
+
module Group
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include CoreModels::Models::Concerns::GroupConcerns
|
9
|
+
|
10
|
+
included do
|
11
|
+
extend FriendlyId
|
12
|
+
friendly_id :group_name, use: [:slugged, :finders, :history]
|
13
|
+
|
14
|
+
has_many :group_memeberships
|
15
|
+
has_many :users, :through => :group_memberships
|
16
|
+
|
17
|
+
has_many :groups_roles
|
18
|
+
has_many :roles, :through => :groups_roles
|
19
|
+
|
20
|
+
validates :group_name, presence: true, uniqueness: true
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module CoreModels
|
4
|
+
module Models
|
5
|
+
module Permission
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
extend FriendlyId
|
10
|
+
friendly_id :permission_name, use: [:slugged, :finders, :history]
|
11
|
+
|
12
|
+
has_many :roles_permissions
|
13
|
+
has_many :roles, :through => :roles_permissions
|
14
|
+
|
15
|
+
validates :permission_name, presence: true, uniqueness: true
|
16
|
+
end
|
17
|
+
|
18
|
+
def should_generate_new_friendly_id?
|
19
|
+
permission_name_changed?
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'concerns/role_concerns'
|
2
|
+
require 'active_support/concern'
|
3
|
+
|
4
|
+
module CoreModels
|
5
|
+
module Models
|
6
|
+
module Role
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include CoreModels::Models::Concerns::RoleConcerns
|
9
|
+
|
10
|
+
included do
|
11
|
+
extend FriendlyId
|
12
|
+
|
13
|
+
friendly_id :role_name, use: [:slugged, :finders, :history]
|
14
|
+
|
15
|
+
has_many :group_memberships
|
16
|
+
has_many :users, :through => :group_memberships
|
17
|
+
|
18
|
+
has_many :groups_roles
|
19
|
+
has_many :groups, :through => :groups_roles
|
20
|
+
|
21
|
+
has_many :roles_permissions
|
22
|
+
has_many :permissions, :through => :roles_permissions
|
23
|
+
|
24
|
+
validates :role_name, presence: true
|
25
|
+
validates_uniqueness_of :role_name
|
26
|
+
end
|
27
|
+
|
28
|
+
def should_generate_new_friendly_id?
|
29
|
+
role_name_changed?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative 'concerns/user_concerns'
|
2
|
+
require 'active_support/concern'
|
3
|
+
require 'bcrypt'
|
4
|
+
|
5
|
+
module CoreModels
|
6
|
+
module Models
|
7
|
+
module User
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
include CoreModels::Models::Concerns::UserConcerns
|
10
|
+
|
11
|
+
included do
|
12
|
+
extend FriendlyId
|
13
|
+
friendly_id :first_name, use: [:slugged, :finders, :history]
|
14
|
+
|
15
|
+
before_save :encrypt_password
|
16
|
+
|
17
|
+
has_many :group_memberships, :dependent => :delete_all
|
18
|
+
has_many :groups, :through => :group_memberships, :dependent => :delete_all
|
19
|
+
has_many :roles, :through => :group_memberships, :dependent => :delete_all
|
20
|
+
|
21
|
+
validates :first_name, presence: true
|
22
|
+
validates :user_name, uniqueness: true, presence: true, length: {minimum: 5}
|
23
|
+
validates :email, presence: true, confirmation: true, uniqueness: true
|
24
|
+
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
|
25
|
+
validates :password, presence: true, confirmation: true, length: { minimum: 10 }, if: :new_record?
|
26
|
+
|
27
|
+
before_create{ generate_token(:auth_token) }
|
28
|
+
end
|
29
|
+
|
30
|
+
class_methods do
|
31
|
+
def authenticate_user(user_name, password)
|
32
|
+
user = self.find_by_user_name(user_name)
|
33
|
+
if(user && (user.password == BCrypt::Engine.hash_secret(password, user.salt)))
|
34
|
+
user
|
35
|
+
else
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def encrypt_password
|
42
|
+
if password.present?
|
43
|
+
self.salt = BCrypt::Engine.generate_salt
|
44
|
+
self.password = BCrypt::Engine.hash_secret(password, salt)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def send_password_reset
|
49
|
+
generate_token(:password_reset_token)
|
50
|
+
self.password_reset_timestamp = Time.zone.now
|
51
|
+
save!
|
52
|
+
UserMailer.password_reset(self).deliver
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
def generate_token(column)
|
57
|
+
begin
|
58
|
+
self[column] = SecureRandom.urlsafe_base64
|
59
|
+
end while self.class.exists?(column => self[column])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|