calib-rails 0.1.2 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ec33c98e4c2fd75072cc6eda243e73628fd28a47278536082ff4d9402af681d
4
- data.tar.gz: 35fad2a56d46148731d6acce0586c1dbb4844b2606a48bf9532cd0318ec0babe
3
+ metadata.gz: a169448262ad90005944b50c2a715536f06f14ce4c3f7c9410b8c626cb06153d
4
+ data.tar.gz: 0a8a6d38c66d06ba4aa7cad08688627e912ee52913cfc5fe1f4654013726583e
5
5
  SHA512:
6
- metadata.gz: 5c7b5bab0933ebbf9a7e0af9c486595e1fd67dd3c77173921761677b83915c6eee589a3e23d99a944d545fe09a5e374e1421b4a3b7eb951c557c79ce2921c239
7
- data.tar.gz: c3f74b134e5b83b59aa9f6d6799265ffb93fece584d7bba53328712e87514a7f217819cfdfabba518f323a1b7184a4f476ecfb89d15bc3f29134f645acec8bce
6
+ metadata.gz: 9aedee16b3782063afeb706fea29e76be213b916997b2b0ad8867f185aac994f5fb08fc1594711a2d5510c4ff7876732e6fa0df5ce6a8706d4412a69612f1da0
7
+ data.tar.gz: 681cf919772a6c90f154d6d539c8bb9dbebc1959d0e8a9c151e394b431fa0fcc34e9a5db07325be22f13aafdb98fd888f520feaeba2dcf0f3599044c4090e980
@@ -0,0 +1,14 @@
1
+ module Calib::Delegatable
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ def self.delegate_all(targets)
6
+ targets = Array(targets)
7
+ define_method('method_missing') do |method, *args|
8
+ target = targets.find {|target| target.respond_to?(method) }
9
+ return target.send(method, *args) if target.present?
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ module Calib::Devise::FriendlyForwardable
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ # @see https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
6
+ before_action :store_access_location!, if: :storable_location?
7
+ end
8
+
9
+ private
10
+
11
+ # path with stored_location or root
12
+ def smart_path(r = devise_key_for_store_location)
13
+ stored_location_for(r) || root_path
14
+ end
15
+
16
+ def storable_location?
17
+ request.get? &&
18
+ is_navigational_format? &&
19
+ !devise_controller? &&
20
+ request.fullpath != root_path && # for return on creating new account
21
+ !request.xhr?
22
+ end
23
+
24
+ def store_access_location!
25
+ Rails.logger.debug("store_#{devise_key_for_store_location}_location!: #{request.fullpath}")
26
+ store_location_for(devise_key_for_store_location, request.fullpath)
27
+ end
28
+
29
+ def devise_key_for_store_location
30
+ Devise.mappings.keys[0]
31
+ end
32
+ end
@@ -0,0 +1,82 @@
1
+ # on schema:
2
+ #
3
+ # with coulumn for soft_deleted_flag
4
+ # t.integer "alive", default: 1
5
+ #
6
+ # unique index
7
+ # [for postgresql] # partial indexes
8
+ # t.index ["email", "alive"], name: "index_users_on_email_and_alive", unique: true, where: "(alive = 1)"
9
+ # [for mysql] # ignoring null column
10
+ # t.index ["email", "alive"], name: "index_users_on_email_and_alive", unique: true
11
+ #
12
+ module Calib::Devise::SoftDeletion
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ class_attribute :alive_column_name
17
+
18
+ def self.devise_soft_deletable(alive_column_name = :alive)
19
+ self.alive_column_name = alive_column_name
20
+
21
+ # @see http://blog.319ring.net/2016/05/24/devise-kakurenbo-puti/
22
+ # remove unique email Devise::validatable
23
+ # https://gist.github.com/brenes/4503386
24
+ self._validators.delete(:email)
25
+ self._validate_callbacks.each do |callback|
26
+ if callback.raw_filter.respond_to? :attributes
27
+ callback.raw_filter.attributes.delete :email
28
+ end
29
+ end
30
+
31
+ # redefine email unique with column for soft deletation
32
+ self.validates :email, presence: true
33
+ self.validates_format_of :email, with: email_regexp, allow_blank: true, if: :will_save_change_to_email?
34
+ self.validates :email, uniqueness: { scope: alive_column_name }, if: :will_save_change_to_email?
35
+
36
+ self.scope :alive, -> { where(alive_column_name => 1) }
37
+ end
38
+
39
+ def self.find_for_authentication(warden_conditions)
40
+ alive.where(email: warden_conditions[:email]).first
41
+ end
42
+ end
43
+
44
+ def canceled?
45
+ self.alive_value == nil
46
+ end
47
+
48
+ def soft_destroy
49
+ save if pre_destroy
50
+ end
51
+
52
+ def soft_destroy!
53
+ save! if pre_destroy
54
+ end
55
+
56
+ def alive_value
57
+ self.send(self.class.alive_column_name)
58
+ end
59
+
60
+ private
61
+
62
+ def pre_destroy
63
+ return false if canceled?
64
+
65
+ self.attributes = cancel_attributes
66
+ self.skip_reconfirmation!
67
+ true
68
+ end
69
+
70
+ def cancel_attributes
71
+ key = Devise.friendly_token.first(8)
72
+
73
+ attrs = {
74
+ email: "calceled_#{self.id}_#{key}@canceled.com",
75
+ password: key,
76
+ canceled_at: Time.zone.now
77
+ }
78
+
79
+ attrs[self.class.alive_column_name] = nil
80
+ attrs
81
+ end
82
+ end
@@ -0,0 +1,15 @@
1
+ module Calib::Devise::SoftDeletionMigrationEnhancable
2
+ include Calib::SoftDeletion::MigrationEnhancable
3
+
4
+ def change_for_device_soft_deletion(scope, filter_column = :alive, canceled_at_column = :canceled_at)
5
+ reversible do |dir|
6
+ dir.up { remove_index scope, :email }
7
+ dir.down { add_index scope, :email, unique: true }
8
+ end
9
+
10
+ add_column scope, canceled_at_column, :datetime
11
+
12
+ add_column_for_soft_deletion(scope, filter_column)
13
+ add_unique_index_for_soft_deletion(scope, :email, filter_column)
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Calib
2
+ class IllegalAccessError < StandardError; end
3
+ end
@@ -0,0 +1,34 @@
1
+ # @see https://stackoverflow.com/questions/43707745/pundit-with-namespaced-controllers
2
+ module Calib::Pundit::ControllerNestable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :namespace
7
+
8
+ def self.nested_namespace(namespace)
9
+ self.namespace = Array(namespace)
10
+ end
11
+ end
12
+
13
+ def initialize(user, record)
14
+ @user = user
15
+ @record = record.is_a?(Array) ? record.last : record
16
+ end
17
+
18
+ def scope
19
+ Pundit.policy_scope! user, self.class.namespace + [record.class]
20
+ end
21
+
22
+ class Scope # :nodoc:
23
+ attr_reader :user, :scope
24
+
25
+ def initialize(user, scope)
26
+ @user = user
27
+ @scope = scope.is_a?(Array) ? scope.last : scope
28
+ end
29
+
30
+ def resolve
31
+ scope
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ # @see https://stackoverflow.com/questions/43707745/pundit-with-namespaced-controllers
2
+ # @see https://github.com/elabs/pundit/pull/392/files
3
+ module Calib::Pundit::Nestable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ class_attribute :namespace
8
+
9
+ def self.nested_namespace(namespace)
10
+ self.namespace = Array(namespace)
11
+ end
12
+ end
13
+
14
+ def policy_scope(scope)
15
+ super self.class.namespace + [scope]
16
+ end
17
+
18
+ def authorize(record, query = nil)
19
+ super self.class.namespace + [record], query
20
+ record
21
+ end
22
+
23
+ def policy(record)
24
+ # if record is Array, as already namespace array
25
+ super record.is_a?(Array) ? record : self.class.namespace + [record]
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module Calib
2
2
  module Rails
3
- VERSION = '0.1.2'
3
+ VERSION = '0.1.6'
4
4
  end
5
5
  end
data/lib/calib/rails.rb CHANGED
@@ -1,6 +1,25 @@
1
1
  module Calib
2
- module Rails
2
+ module Controllers
3
+ autoload :BasicAuth, 'calib/controllers/basic_auth'
4
+ end
5
+
6
+ module Devise
7
+ autoload :FriendlyForwardable, 'calib/devise/friendly_forwardable'
8
+ autoload :SoftDeletionMigrationEnhancable, 'calib/devise/soft_deletion_migration_enhancable'
9
+ autoload :SoftDeletion, 'calib/devise/soft_deletion'
10
+ end
11
+
12
+ module Pundit
13
+ autoload :ControllerNestable, 'calib/pundit/controller_nestable'
14
+ autoload :Nestable, 'calib/pundit/nestable'
3
15
  end
4
- end
5
16
 
6
- require 'calib/controllers/basic_auth'
17
+ module SoftDeletion
18
+ autoload :MigrationEnhancable, 'calib/soft_deletion/migration_enhancable'
19
+ end
20
+
21
+ autoload :Delegatable, 'calib/delegatable'
22
+ autoload :IllegalAccessError, 'calib/illegal_access_error'
23
+ autoload :Service, 'calib/service'
24
+ autoload :UnauthenticatedError, 'calib/unauthenticated_error'
25
+ end
@@ -0,0 +1,9 @@
1
+ # @see https://techracho.bpsinc.jp/hachi8833/2017_10_16/46482
2
+ module Calib::Service
3
+ extend ActiveSupport::Concern
4
+ class_methods do
5
+ def call(*args)
6
+ new(*args).call
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Calib::SoftDeletion::MigrationEnhancable
2
+ def add_unique_column_for_soft_deletion(table, unique_column, filter_column = :alive)
3
+ add_column_for_soft_deletion(table, filter_column)
4
+ add_unique_index_for_soft_deletion(table, unique_column, filter_column)
5
+ end
6
+
7
+ def add_column_for_soft_deletion(table, filter_column = :alive)
8
+ # @see https://qiita.com/yuba/items/70165875cfe02b03513d
9
+ add_column table, filter_column, :integer, default: 1 # if canceled, alive=NULL for MYSQL
10
+ end
11
+
12
+ def add_unique_index_for_soft_deletion(table, unique_column, filter_column = :alive)
13
+ if connection.adapter_name == 'MySQL'
14
+ add_index table, [unique_column, filter_column], unique: true
15
+ else
16
+ # @see http://rny.io/rails/postgresql/2013/08/20/postgresql-indexing-in-rails.html
17
+ add_index table, [unique_column, filter_column], unique: true, where: "#{filter_column} = 1" # for Postgresql indexes partial
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module Calib
2
+ class UnauthenticatedError < IllegalAccessError; end
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calib-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - ms2sato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-05 00:00:00.000000000 Z
11
+ date: 2018-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -63,8 +63,18 @@ files:
63
63
  - README.md
64
64
  - Rakefile
65
65
  - lib/calib/controllers/basic_auth.rb
66
+ - lib/calib/delegatable.rb
67
+ - lib/calib/devise/friendly_forwardable.rb
68
+ - lib/calib/devise/soft_deletion.rb
69
+ - lib/calib/devise/soft_deletion_migration_enhancable.rb
70
+ - lib/calib/illegal_access_error.rb
71
+ - lib/calib/pundit/controller_nestable.rb
72
+ - lib/calib/pundit/nestable.rb
66
73
  - lib/calib/rails.rb
67
74
  - lib/calib/rails/version.rb
75
+ - lib/calib/service.rb
76
+ - lib/calib/soft_deletion/migration_enhancable.rb
77
+ - lib/calib/unauthenticated_error.rb
68
78
  - lib/tasks/calib/rails_tasks.rake
69
79
  homepage: https://github.com/CircleAround/calib-rails
70
80
  licenses: