super_auth 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a5da5e9ec945c0624514fb6b72471c934911dfa9e59271aeee08ef7e78e60c7
4
- data.tar.gz: 6f96f6f911d939a4f4059081b45b68894c7ef1795d232df6f4646c854f4554a1
3
+ metadata.gz: d1c0609f1c31ed023cb42444655098f37468e92f4a24f960f520877f5cb152ed
4
+ data.tar.gz: 8c7f9334b2226727b52550581756d9d34c50524283ad89339e2d8f0bdfd3094b
5
5
  SHA512:
6
- metadata.gz: f747d99cf64d276a95d7e3231885b37289b4e587e09be1febbe070ed416f206b7989bba7c32a64b9d5fddeed6afb2502ef871008e51b64395696d54e54887dd1
7
- data.tar.gz: b580ce1942b4ce3334639e0ac20c579af0eb65d285beaa403a5c3540c3239d6582d2444fb88d7d67fdf05720e37b7291d104cb208bbc98d393b97e4280ab066e
6
+ metadata.gz: c3781d17e40e003e7e361789e71d3c9048920b7d14023b1af83de968f1e0e05b4f829fa5e3fda172c141c1c8dceea75888e407bc5f5210cf2148f870954c36df
7
+ data.tar.gz: 6b9edf03113857abcf6e9246f40dbb3a5d36814380f09e1d86782aa1220a56397dc9b2918fb3f85cb23aeeed1acc103d81af2a24c2abd253eb5e4ca140b54e50
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.2.6
data/Gemfile CHANGED
@@ -12,10 +12,11 @@ gemspec
12
12
  gem "rake", "~> 13.0"
13
13
  gem "rspec", "~> 3.0"
14
14
  gem "zeitwerk", "~> 2.6"
15
+ gem "sequel"
15
16
 
16
-
17
- group :development do
17
+ group :development, :test do
18
18
  gem "pry"
19
19
  gem "pg"
20
20
  gem "sqlite3"
21
- end
21
+ gem "activerecord"
22
+ end
data/Gemfile.lock CHANGED
@@ -1,16 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- super_auth (0.1.3)
4
+ super_auth (0.1.5)
5
5
  sequel
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ activemodel (8.0.2)
11
+ activesupport (= 8.0.2)
12
+ activerecord (8.0.2)
13
+ activemodel (= 8.0.2)
14
+ activesupport (= 8.0.2)
15
+ timeout (>= 0.4.0)
16
+ activesupport (8.0.2)
17
+ base64
18
+ benchmark (>= 0.3)
19
+ bigdecimal
20
+ concurrent-ruby (~> 1.0, >= 1.3.1)
21
+ connection_pool (>= 2.2.5)
22
+ drb
23
+ i18n (>= 1.6, < 2)
24
+ logger (>= 1.4.2)
25
+ minitest (>= 5.1)
26
+ securerandom (>= 0.3)
27
+ tzinfo (~> 2.0, >= 2.0.5)
28
+ uri (>= 0.13.1)
29
+ base64 (0.3.0)
30
+ benchmark (0.4.1)
10
31
  bigdecimal (3.1.4)
11
32
  coderay (1.1.3)
33
+ concurrent-ruby (1.3.5)
34
+ connection_pool (2.5.3)
12
35
  diff-lcs (1.5.0)
36
+ drb (2.2.3)
37
+ i18n (1.14.7)
38
+ concurrent-ruby (~> 1.0)
39
+ logger (1.7.0)
13
40
  method_source (1.0.0)
41
+ minitest (5.25.5)
14
42
  pg (1.5.4)
15
43
  pry (0.14.2)
16
44
  coderay (~> 1.1)
@@ -29,21 +57,30 @@ GEM
29
57
  diff-lcs (>= 1.2.0, < 2.0)
30
58
  rspec-support (~> 3.12.0)
31
59
  rspec-support (3.12.1)
60
+ securerandom (0.4.1)
32
61
  sequel (5.75.0)
33
62
  bigdecimal
34
- sqlite3 (1.7.0-arm64-darwin)
35
- sqlite3 (1.7.0-x86_64-linux)
63
+ sqlite3 (2.7.2-arm64-darwin)
64
+ sqlite3 (2.7.2-x86_64-linux-gnu)
65
+ timeout (0.4.3)
66
+ tzinfo (2.0.6)
67
+ concurrent-ruby (~> 1.0)
68
+ uri (1.0.3)
36
69
  zeitwerk (2.6.12)
37
70
 
38
71
  PLATFORMS
39
72
  arm64-darwin-22
73
+ arm64-darwin-23
74
+ arm64-darwin-24
40
75
  x86_64-linux
41
76
 
42
77
  DEPENDENCIES
78
+ activerecord
43
79
  pg
44
80
  pry
45
81
  rake (~> 13.0)
46
82
  rspec (~> 3.0)
83
+ sequel
47
84
  sqlite3
48
85
  super_auth!
49
86
  zeitwerk (~> 2.6)
@@ -1,13 +1,15 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_users) do
2
+ up do
3
+ create_table(:super_auth_users) do
4
4
  primary_key :id
5
-
6
5
  String :external_id # , null: false
7
6
  String :name
8
-
9
7
  DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
10
8
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
11
9
  end
12
10
  end
11
+
12
+ down do
13
+ drop_table(:super_auth_users)
14
+ end
13
15
  end
@@ -1,6 +1,6 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_groups) do
2
+ up do
3
+ create_table(:super_auth_groups) do
4
4
  primary_key :id
5
5
  String :name, null: false
6
6
  foreign_key :parent_id, :super_auth_groups, deferrable: true, type: :integer
@@ -8,4 +8,8 @@ Sequel.migration do
8
8
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
9
9
  end
10
10
  end
11
+
12
+ down do
13
+ drop_table(:super_auth_groups)
14
+ end
11
15
  end
@@ -1,10 +1,14 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_permissions) do
2
+ up do
3
+ create_table(:super_auth_permissions) do
4
4
  primary_key :id
5
5
  String :name, null: false
6
6
  DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
7
7
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
8
8
  end
9
9
  end
10
+
11
+ down do
12
+ drop_table(:super_auth_permissions)
13
+ end
10
14
  end
@@ -1,6 +1,6 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_roles) do
2
+ up do
3
+ create_table(:super_auth_roles) do
4
4
  primary_key :id
5
5
  String :name, null: false
6
6
  foreign_key :parent_id, :super_auth_roles, deferrable: true, type: :integer
@@ -8,4 +8,8 @@ Sequel.migration do
8
8
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
9
9
  end
10
10
  end
11
+
12
+ down do
13
+ drop_table(:super_auth_roles)
14
+ end
11
15
  end
@@ -1,13 +1,15 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_resources) do
2
+ up do
3
+ create_table(:super_auth_resources) do
4
4
  primary_key :id
5
-
6
5
  String :name
7
6
  String :external_id # , null: false
8
-
9
7
  DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
10
8
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
11
9
  end
12
10
  end
11
+
12
+ down do
13
+ drop_table(:super_auth_resources)
14
+ end
13
15
  end
data/db/migrate/6_edge.rb CHANGED
@@ -1,16 +1,18 @@
1
1
  Sequel.migration do
2
- change do
3
- create_table?(:super_auth_edges) do
2
+ up do
3
+ create_table(:super_auth_edges) do
4
4
  primary_key :id
5
-
6
5
  foreign_key :user_id, :super_auth_users, null: true
7
6
  foreign_key :group_id, :super_auth_groups, null: true
8
7
  foreign_key :permission_id, :super_auth_permissions, null: true
9
8
  foreign_key :role_id, :super_auth_roles, null: true
10
9
  foreign_key :resource_id, :super_auth_resources, null: true
11
-
12
10
  DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
13
11
  DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
14
12
  end
15
13
  end
14
+
15
+ down do
16
+ drop_table(:super_auth_edges)
17
+ end
16
18
  end
@@ -0,0 +1,39 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table(:super_auth_authorizations) do
4
+ Integer :user_id, null: true
5
+ String :user_name, null: true
6
+ String :user_external_id, null: true
7
+ DateTime :user_created_at, null: true
8
+ DateTime :user_updated_at, null: true
9
+ Integer :group_id, null: true
10
+ String :group_name, null: true
11
+ String :group_path, null: true
12
+ String :group_name_path, null: true
13
+ String :group_parent_name, null: true
14
+ String :group_parent_id, null: true
15
+ DateTime :group_created_at, null: true
16
+ DateTime :group_updated_at, null: true
17
+ Integer :role_id, null: true
18
+ String :role_name, null: true
19
+ String :role_path, null: true
20
+ String :role_name_path, null: true
21
+ String :role_parent_id, null: true
22
+ DateTime :role_created_at, null: true
23
+ DateTime :role_updated_at, null: true
24
+ Integer :permission_id, null: true
25
+ String :permission_name, null: true
26
+ DateTime :permission_created_at, null: true
27
+ DateTime :permission_updated_at, null: true
28
+ Integer :resource_id, null: true
29
+ String :resource_name, null: true
30
+ String :resource_external_id, null: true
31
+ DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
32
+ DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
33
+ end
34
+ end
35
+
36
+ down do
37
+ drop_table(:super_auth_authorizations)
38
+ end
39
+ end
data/lib/basic_loader.rb CHANGED
@@ -3,6 +3,8 @@
3
3
  # File generated automatically, do not edit
4
4
  # See https://blog.pawelpokrywka.com/p/gem-with-zeitwerk-as-development-only-dependency
5
5
 
6
+ require 'super_auth/active_record' if defined?(ActiveRecord::Base)
7
+ require 'super_auth/authorization'
6
8
  require 'super_auth/edge'
7
9
  require 'super_auth/nestable'
8
10
  require 'super_auth/group'
@@ -11,3 +13,11 @@ require 'super_auth/railtie'
11
13
  require 'super_auth/resource'
12
14
  require 'super_auth/role'
13
15
  require 'super_auth/user'
16
+ require 'super_auth/active_record/authorization' if defined?(ActiveRecord::Base)
17
+ require 'super_auth/active_record/by_current_user' if defined?(ActiveRecord::Base)
18
+ require 'super_auth/active_record/edge' if defined?(ActiveRecord::Base)
19
+ require 'super_auth/active_record/group' if defined?(ActiveRecord::Base)
20
+ require 'super_auth/active_record/permission' if defined?(ActiveRecord::Base)
21
+ require 'super_auth/active_record/resource' if defined?(ActiveRecord::Base)
22
+ require 'super_auth/active_record/role' if defined?(ActiveRecord::Base)
23
+ require 'super_auth/active_record/user' if defined?(ActiveRecord::Base)
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Authorization < ActiveRecord::Base
2
+ self.table_name = 'super_auth_authorizations'
3
+ end
@@ -0,0 +1,24 @@
1
+ module SuperAuth::ActiveRecord::ByCurrentUser
2
+ def self.included(base)
3
+ base.has_many :super_auth_authorizations
4
+
5
+ base.send(:default_scope, **{all_queries: true}) do
6
+ raise "SuperAuth.current_user not set" if SuperAuth.current_user.blank?
7
+
8
+ if SuperAuth.current_user.system?
9
+ self
10
+ else
11
+ # Important:
12
+ # We use a subquery here instead of a inner join because we don't want
13
+ # to potentially affect break on queries issue count queries in their app.
14
+ where(id: SuperAuth::ActiveRecord::Authorization.where(super_auth_user_id: SuperAuth.current_user.id).select(:resource_id))
15
+ end
16
+ end
17
+ end
18
+
19
+ def system? = false
20
+
21
+ module ClassMethods
22
+ end
23
+
24
+ end
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Edge < ActiveRecord::Base
2
+ self.table_name = 'super_auth_edges'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Group < ActiveRecord::Base
2
+ self.table_name = 'super_auth_groups'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Permission < ActiveRecord::Base
2
+ self.table_name = 'super_auth_permissions'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Resource < ActiveRecord::Base
2
+ self.table_name = 'super_auth_resources'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SuperAuth::ActiveRecord::Role < ActiveRecord::Base
2
+ self.table_name = 'super_auth_roles'
3
+ end
@@ -0,0 +1,8 @@
1
+ class SuperAuth::ActiveRecord::User < ActiveRecord::Base
2
+ self.table_name = 'super_auth_users'
3
+
4
+ def model_name = ActiveModel::Name.new(:user)
5
+
6
+ def system? = self.class.system == self
7
+ def self.system = find_or_create_by(name: "system")
8
+ end
@@ -0,0 +1,3 @@
1
+ require "active_record"
2
+ module SuperAuth::ActiveRecord
3
+ end
@@ -0,0 +1,2 @@
1
+ class SuperAuth::Authorization < Sequel::Model(:super_auth_authorizations)
2
+ end
@@ -5,6 +5,20 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
5
5
  many_to_one :role
6
6
  many_to_one :resource
7
7
 
8
+ def before_save
9
+ @affected_users = SuperAuth::Authorization.where(user_id: user_id).distinct.select_map(:user_id) + [user_id]
10
+ end
11
+
12
+ def after_save
13
+ SuperAuth::Authorization.db.transaction do
14
+ SuperAuth::Authorization.where(user_id: @affected_users).delete
15
+ SuperAuth::Authorization.multi_insert(
16
+ SuperAuth::Edge.authorizations.where(user_id: @affected_users)
17
+ .to_a
18
+ )
19
+ end
20
+ end
21
+
8
22
  class << self
9
23
 
10
24
  def authorizations
@@ -12,6 +26,7 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
12
26
  .union(users_roles_permissions_resources)
13
27
  .union(users_groups_permissions_resources)
14
28
  .union(users_permissions_resources)
29
+ .union(users_resources)
15
30
  end
16
31
 
17
32
  def users_groups_roles_permissions_resources
@@ -31,8 +46,8 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
31
46
  Sequel[:groups][:group_path],
32
47
  Sequel[:groups][:group_name_path],
33
48
  Sequel[:groups][:parent_id],
34
- Sequel[:groups][:created_at].as(:group_created_at),
35
- Sequel[:groups][:updated_at].as(:group_updated_at),
49
+ Sequel[:groups][:created_at].cast(:text).as(:group_created_at),
50
+ Sequel[:groups][:updated_at].cast(:text).as(:group_updated_at),
36
51
  ).join(Sequel[:super_auth_edges].as(:group_role_edges), Sequel[:group_role_edges][:group_id] => Sequel[:groups][:id]).select_append(
37
52
  Sequel[:group_role_edges][:id].as(:group_role_edge_id),
38
53
  Sequel[:group_role_edges][:permission_id].as(:group_role_edge_permission_id),
@@ -43,7 +58,7 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
43
58
 
44
59
  SuperAuth::Edge.from(
45
60
  SuperAuth::Edge.from(
46
- SuperAuth::Group.cte(SuperAuth::Group.where(id: users_groups_roles_ds.select(Sequel[:groups][:id])).select(:id)).select { [id.as(:group_id), name.as(:group_name), parent_id.as(:group_parent_id), group_path, group_name_path, created_at.as(:group_created_at), updated_at.as(:group_updated_at)] },
61
+ SuperAuth::Group.cte(SuperAuth::Group.where(id: users_groups_roles_ds.select(Sequel[:groups][:id])).select(:id)).select { [id.as(:group_id), name.as(:group_name), parent_id.as(:group_parent_id), group_path, group_name_path, created_at.cast(:text).as(:group_created_at), updated_at.as(:group_updated_at)] },
47
62
  SuperAuth::Role.cte(users_groups_roles_ds.select(Sequel[:group_role_edges][:role_id])).select { [id.as(:role_id), name.as(:role_name), parent_id.as(:role_parent_id), role_path, role_name_path, created_at.as(:role_created_at), updated_at.as(:role_updated_at) ] }
48
63
  ).as(:users_groups_roles_permissions_resources)
49
64
  ).join(Sequel[:super_auth_edges].as(:user_edges), Sequel[:user_edges][:group_id] => Sequel[:users_groups_roles_permissions_resources][:group_id])
@@ -60,16 +75,16 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
60
75
  Sequel[:users_groups_roles_permissions_resources][:group_path],
61
76
  Sequel[:users_groups_roles_permissions_resources][:group_name_path],
62
77
  Sequel[:users_groups_roles_permissions_resources][:group_parent_id],
63
- Sequel[:users_groups_roles_permissions_resources][:group_created_at].cast(:text),
64
- Sequel[:users_groups_roles_permissions_resources][:group_updated_at].cast(:text),
78
+ Sequel[:users_groups_roles_permissions_resources][:group_created_at].cast(:text).as(:group_created_at),
79
+ Sequel[:users_groups_roles_permissions_resources][:group_updated_at].cast(:text).as(:group_updated_at),
65
80
 
66
81
  Sequel[:users_groups_roles_permissions_resources][:role_id],
67
82
  Sequel[:users_groups_roles_permissions_resources][:role_name],
68
83
  Sequel[:users_groups_roles_permissions_resources][:role_path],
69
84
  Sequel[:users_groups_roles_permissions_resources][:role_name_path],
70
85
  Sequel[:users_groups_roles_permissions_resources][:role_parent_id],
71
- Sequel[:users_groups_roles_permissions_resources][:role_created_at].cast(:text),
72
- Sequel[:users_groups_roles_permissions_resources][:role_updated_at].cast(:text),
86
+ Sequel[:users_groups_roles_permissions_resources][:role_created_at].cast(:text).as(:role_created_at),
87
+ Sequel[:users_groups_roles_permissions_resources][:role_updated_at].cast(:text).as(:role_updated_at),
73
88
 
74
89
  Sequel[:super_auth_permissions][:id].as(:permission_id),
75
90
  Sequel[:super_auth_permissions][:name].as(:permission_name),
@@ -191,7 +206,6 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
191
206
  Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "group_created_at"]), # Sequel[:groups][:group_created_at],
192
207
  Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "group_updated_at"]), # Sequel[:groups][:group_updated_at],
193
208
 
194
-
195
209
  Sequel.lit(%Q[0 as "role_id"]), # Sequel[:roles][:role_id],
196
210
  Sequel::NULL.as(:role_name), # Sequel[:roles][:role_name],
197
211
  Sequel::NULL.as(:role_path), # Sequel[:roles][:role_path],
@@ -215,5 +229,45 @@ class SuperAuth::Edge < Sequel::Model(:super_auth_edges)
215
229
  join(Sequel[:super_auth_resources], id: Sequel[:resource_edges][:resource_id]).
216
230
  distinct
217
231
  end
232
+
233
+ def users_resources
234
+ SuperAuth::User.
235
+ join(Sequel[:super_auth_edges].as(:user_edges), user_id: :id).
236
+ select(
237
+ Sequel[:super_auth_users][:id].as(:user_id),
238
+ Sequel[:super_auth_users][:name].as(:user_name),
239
+ Sequel[:super_auth_users][:external_id].as(:user_external_id),
240
+ Sequel[:super_auth_users][:created_at].cast(:text).as(:user_created_at),
241
+ Sequel[:super_auth_users][:updated_at].cast(:text).as(:user_updated_at),
242
+
243
+ Sequel.lit(%Q[0 as "group_id"]), # Sequel[:groups][:group_id],
244
+ Sequel::NULL.as(:group_name), # Sequel[:groups][:group_name],
245
+ Sequel::NULL.as(:group_path), # Sequel[:groups][:group_path],
246
+ Sequel::NULL.as(:group_name_path), # Sequel[:groups][:group_name_path],
247
+ Sequel.lit(%Q[0 as "group_parent_id"]), # Sequel[:groups][:group_id],
248
+ Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "group_created_at"]), # Sequel[:groups][:group_created_at],
249
+ Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "group_updated_at"]), # Sequel[:groups][:group_updated_at],
250
+
251
+
252
+ Sequel.lit(%Q[0 as "role_id"]), # Sequel[:roles][:role_id],
253
+ Sequel::NULL.as(:role_name), # Sequel[:roles][:role_name],
254
+ Sequel::NULL.as(:role_path), # Sequel[:roles][:role_path],
255
+ Sequel::NULL.as(:role_name_path), # Sequel[:roles][:role_name_path],
256
+ Sequel.lit(%Q[0 as "role_parent_id"]), # Sequel[:roles][:role_parent_id],
257
+ Sequel::NULL.as(:role_created_at), # Sequel[:roles][:role_created_at],
258
+ Sequel::NULL.as(:role_updated_at), # Sequel[:roles][:role_updated_at],
259
+
260
+ Sequel.lit(%Q[0 as "permission_id"]),
261
+ Sequel::NULL.as(:permission_name),
262
+ Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "permission_created_at"]),
263
+ Sequel.lit(%Q['1970-01-01 00:00:00.000000-00' as "permission_updated_at"]),
264
+
265
+ Sequel[:super_auth_resources][:id].as(:resource_id),
266
+ Sequel[:super_auth_resources][:name].as(:resource_name),
267
+ Sequel[:super_auth_resources][:external_id].as(:resource_external_id)
268
+ ).
269
+ join(Sequel[:super_auth_resources], Sequel[:user_edges][:resource_id] => Sequel[:super_auth_resources][:id]).
270
+ distinct
271
+ end
218
272
  end
219
- end
273
+ end
@@ -7,7 +7,7 @@ class SuperAuth::Permission < Sequel::Model(:super_auth_permissions)
7
7
  end
8
8
 
9
9
  def with_roles
10
- with_edges.join(Role.from(Role.trees).as(:roles), id: :role_id).select(
10
+ with_edges.join(SuperAuth::Role.from(SuperAuth::Role.trees).as(:roles), id: :role_id).select(
11
11
  Sequel[:super_auth_permissions][:id].as(:id),
12
12
  Sequel[:super_auth_permissions][:id].as(:permission_id),
13
13
  Sequel[:roles][:id].as(:role_id),
@@ -4,6 +4,35 @@ module SuperAuth
4
4
  rake_tasks do
5
5
  load "tasks/super_auth_tasks.rake"
6
6
  end
7
+
8
+ initializer "super_auth.initialize" do
9
+ if defined?(Sequel) && Sequel.const_defined?("Model")
10
+ require 'super_auth/authorization'
11
+ require 'super_auth/edge'
12
+ require 'super_auth/nestable'
13
+ require 'super_auth/group'
14
+ require 'super_auth/permission'
15
+ require 'super_auth/resource'
16
+ require 'super_auth/role'
17
+ require 'super_auth/user'
18
+ elsif defined?(ActiveRecord)
19
+ require 'super_auth/active_record'
20
+ require 'super_auth/active_record/authorization'
21
+ require 'super_auth/active_record/edge'
22
+ require 'super_auth/active_record/group'
23
+ require 'super_auth/active_record/permission'
24
+ require 'super_auth/active_record/resource'
25
+ require 'super_auth/active_record/role'
26
+ require 'super_auth/active_record/user'
27
+ SuperAuth::Authorization = SuperAuth::ActiveRecord::Authorization
28
+ SuperAuth::Edge = SuperAuth::ActiveRecord::Edge
29
+ SuperAuth::Group = SuperAuth::ActiveRecord::Group
30
+ SuperAuth::Permission = SuperAuth::ActiveRecord::Permission
31
+ SuperAuth::Resource = SuperAuth::ActiveRecord::Resource
32
+ SuperAuth::User = SuperAuth::ActiveRecord::User
33
+ SuperAuth::Role = SuperAuth::ActiveRecord::Role
34
+ end
35
+ end
7
36
  end
8
37
  else
9
38
  class Railtie
@@ -1,5 +1,9 @@
1
1
  class SuperAuth::User < Sequel::Model(:super_auth_users)
2
2
  one_to_many :edges
3
+ one_to_many :resources
4
+
5
+ def system? = self.class.system == self
6
+ def self.system = find_or_create(name: "system")
3
7
 
4
8
  dataset_module do
5
9
  def with_edges
@@ -7,7 +11,7 @@ class SuperAuth::User < Sequel::Model(:super_auth_users)
7
11
  end
8
12
 
9
13
  def with_groups
10
- with_edges.join(Group.from(Group.trees).as(:groups), id: :group_id).select(
14
+ with_edges.join(SuperAuth::Group.from(SuperAuth::Group.trees).as(:groups), id: :group_id).select(
11
15
  Sequel[:super_auth_users][:id].as(:id),
12
16
  Sequel[:super_auth_users][:id].as(:user_id),
13
17
  Sequel[:groups][:id].as(:group_id),
@@ -25,7 +29,7 @@ class SuperAuth::User < Sequel::Model(:super_auth_users)
25
29
  end
26
30
 
27
31
  def with_roles
28
- with_edges.join(Role.from(Role.trees).as(:roles), id: :role_id).select(
32
+ with_edges.join(SuperAuth::Role.from(SuperAuth::Role.trees).as(:roles), id: :role_id).select(
29
33
  Sequel[:users][:id].as(:id),
30
34
  Sequel[:users][:id].as(:user_id),
31
35
  Sequel[:roles][:id].as(:role_id),
@@ -41,9 +45,5 @@ class SuperAuth::User < Sequel::Model(:super_auth_users)
41
45
  Sequel[:roles][:parent_id]
42
46
  )
43
47
  end
44
-
45
- def with_roles_with_groups
46
- with_groups_with_roles
47
- end
48
48
  end
49
49
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SuperAuth
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.5"
5
5
  end
data/lib/super_auth.rb CHANGED
@@ -8,34 +8,76 @@ if defined? SuperAuth::AUTOLOADERS
8
8
  loader.ignore("#{__dir__}/basic_loader.rb")
9
9
  loader.setup
10
10
  end
11
+ require "sequel"
12
+ else
13
+ require 'basic_loader'
11
14
  end
12
15
 
13
- require 'sequel'
16
+ module SuperAuth
17
+ class Error < StandardError; end
14
18
 
15
- ENV["SUPER_AUTH_LOG_LEVEL"] = 'debug'
16
- require 'logger'
17
- logger = Logger.new(STDOUT)
19
+ def self.setup
20
+ yield self if block_given?
21
+ end
18
22
 
19
- Sequel::Model.plugin :timestamps, update_on_create: true
20
- if !ENV['SUPER_AUTH_DATABASE_URL'].nil? && !ENV['SUPER_AUTH_DATABASE_URL'].empty?
21
- Sequel::Model.db = Sequel.connect(ENV['SUPER_AUTH_DATABASE_URL'], logger: logger)
22
- else
23
- logger.warn "SUPER_AUTH_DATABASE_URL not set, using sqlite in memory database."
24
- Sequel::Model.db = Sequel.sqlite(logger: logger)
25
- end
26
- Sequel::Model.default_association_options = {:class_namespace=>'SuperAuth'}
23
+ def self.set_db
24
+ logger =
25
+ if defined?(Rails) && ENV["SUPER_AUTH_LOG_LEVEL"] == "debug"
26
+ Rails.logger
27
+ elsif ENV["SUPER_AUTH_LOG_LEVEL"] == "debug"
28
+ require "logger"
29
+ logger = Logger.new(STDOUT)
30
+ else
31
+ nil
32
+ end
27
33
 
28
- # I don't love this, but I don't know how to do it better
29
- unless Sequel::Model.db.table_exists?(:super_auth_edges)
30
- Sequel.extension :migration
31
- path = Pathname.new(__FILE__).parent.parent.join("db", "migrate")
32
- Sequel::Migrator.run(Sequel::Model.db, path)
33
- end
34
- require 'basic_loader' unless defined?(SuperAuth::AUTOLOADERS)
34
+ if !ENV['SUPER_AUTH_DATABASE_URL'].nil? && !ENV['SUPER_AUTH_DATABASE_URL'].empty?
35
+ SuperAuth.db = Sequel.connect(ENV['SUPER_AUTH_DATABASE_URL'], logger: logger)
36
+ else
37
+ puts "ENV SUPER_AUTH_DATABASE_URL not set, using sqlite."
38
+ SuperAuth.db = Sequel.sqlite(logger: logger, database: "./tmp/test.db")
39
+ install_migrations
40
+ end
41
+ Sequel::Model.default_association_options = {:class_namespace=>'SuperAuth'}
42
+ end
35
43
 
44
+ def self.install_migrations
45
+ require "sequel"
46
+ Sequel.extension :migration
47
+ require "pathname"
48
+ path = Pathname.new(__FILE__).parent.parent.join("db", "migrate")
49
+ Sequel::Migrator.run(SuperAuth.db, path)
50
+ end
36
51
 
37
- module SuperAuth
38
- class Error < StandardError; end
52
+ def self.uninstall_migrations
53
+ require "sequel"
54
+ set_db
55
+ Sequel.extension :migration
56
+ require "pathname"
57
+
58
+ path = Pathname.new(__FILE__).parent.parent.join("db", "migrate")
59
+ db = SuperAuth.db
60
+
61
+ Sequel::Migrator.run(db, path, target: 0)
62
+ rescue => e
63
+ raise Error, "Failed to uninstall migrations: #{e.message}"
64
+ end
65
+
66
+ def self.current_user=(user)
67
+ @current_user = user
68
+ end
69
+
70
+ def self.current_user
71
+ @current_user
72
+ end
73
+
74
+ def self.db=(db)
75
+ @db = db
76
+ end
77
+
78
+ def self.db
79
+ @db
80
+ end
39
81
  end
40
82
 
41
83
  require "super_auth/railtie" if defined?(Rails::Railtie)
@@ -1,13 +1,14 @@
1
1
  namespace :super_auth do
2
2
  desc "Run the super_auth database migrations"
3
3
  task migrate: :environment do
4
- # TODO: Make this work properly without auto applying migrations, which is silly
5
- #
6
- # raise "ENV variable SUPER_AUTH_DATABASE_URL is not set" if ENV['SUPER_AUTH_DATABASE_URL'].nil? || ENV['SUPER_AUTH_DATABASE_URL'].empty?
7
- # Sequel::Model.db = Sequel.connect(ENV['SUPER_AUTH_DATABASE_URL'])
8
- # Sequel.extension :migration
9
- # binding.irb
10
- # path = Pathname.new(__FILE__).parent.parent.join("db", "migrate")
11
- # Sequel::Migrator.run(Sequel::Model.db, path)
4
+ raise "You must define SUPER_AUTH_DATABASE_URL in your environment for this to work" if ENV['SUPER_AUTH_DATABASE_URL'].nil? || ENV['SUPER_AUTH_DATABASE_URL'].empty?
5
+ SuperAuth.install_migrations
6
+ puts "Done"
7
+ end
8
+
9
+ task :rollback => :environment do
10
+ raise "You must define SUPER_AUTH_DATABASE_URL in your environment for this to work" if ENV['SUPER_AUTH_DATABASE_URL'].nil? || ENV['SUPER_AUTH_DATABASE_URL'].empty?
11
+ SuperAuth.uninstall_migrations
12
+ puts "Done"
12
13
  end
13
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Frias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-02 00:00:00.000000000 Z
11
+ date: 2025-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -46,6 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - ".rspec"
49
+ - ".ruby-version"
49
50
  - CHANGELOG.md
50
51
  - Gemfile
51
52
  - Gemfile.lock
@@ -58,8 +59,19 @@ files:
58
59
  - db/migrate/4_roles.rb
59
60
  - db/migrate/5_resources.rb
60
61
  - db/migrate/6_edge.rb
62
+ - db/migrate/7_authorization.rb
61
63
  - lib/basic_loader.rb
62
64
  - lib/super_auth.rb
65
+ - lib/super_auth/active_record.rb
66
+ - lib/super_auth/active_record/authorization.rb
67
+ - lib/super_auth/active_record/by_current_user.rb
68
+ - lib/super_auth/active_record/edge.rb
69
+ - lib/super_auth/active_record/group.rb
70
+ - lib/super_auth/active_record/permission.rb
71
+ - lib/super_auth/active_record/resource.rb
72
+ - lib/super_auth/active_record/role.rb
73
+ - lib/super_auth/active_record/user.rb
74
+ - lib/super_auth/authorization.rb
63
75
  - lib/super_auth/edge.rb
64
76
  - lib/super_auth/group.rb
65
77
  - lib/super_auth/nestable.rb