Module: Milia::Control
- Defined in:
- lib/milia/control.rb
Defined Under Namespace
Modules: ClassMethods Classes: InvalidTenantAccess, MaxTenantExceeded
Class Method Summary collapse
-
.included(base) ⇒ Object
#############################################################################.
Instance Method Summary collapse
-
#__milia_change_tenant!(tid) ⇒ Object
—————————————————————————— ——————————————————————————.
-
#__milia_reset_tenant! ⇒ Object
—————————————————————————— ——————————————————————————.
-
#after_sign_in_path_for(resource_or_scope) ⇒ Object
—————————————————————————— ——————————————————————————.
-
#after_sign_out_path_for(resource_or_scope) ⇒ Object
Overwriting the sign_out redirect path method.
-
#after_sign_up_path_for(resource_or_scope) ⇒ Object
—————————————————————————— ——————————————————————————.
-
#authenticate_tenant! ⇒ Object
—————————————————————————— authenticate_tenant! – authorization & tenant setup – authenticates user – sets current tenant ——————————————————————————.
-
#initiate_tenant(tenant) ⇒ Object
—————————————————————————— initiate_tenant – initiates first-time tenant; establishes thread assumes not in a session yet (since here only upon new account sign-up) ONLY for brand-new tenants upon User account sign up arg tenant – tenant obj of the new tenant ——————————————————————————.
-
#invalid_tenant ⇒ Object
—————————————————————————— invalid_tenant – using wrong or bad data ——————————————————————————.
-
#klass_option_obj(klass, option_obj) ⇒ Object
——————————————————————————.
-
#max_tenants ⇒ Object
—————————————————————————— ——————————————————————————.
-
#prep_signup_view(tenant = nil, user = nil, coupon = {coupon:''}) ⇒ Object
——————————————————————————.
-
#redirect_back ⇒ Object
—————————————————————————— redirect_back – bounce client back to referring page ——————————————————————————.
-
#set_current_tenant(tenant_id = nil) ⇒ Object
—————————————————————————— set_current_tenant – sets the tenant id for the current invocation (thread) args tenant_id – integer id of the tenant; nil if get from current user EXCEPTIONS – InvalidTenantAccess ——————————————————————————.
-
#trace_tenanting(fm_msg) ⇒ Object
—————————————————————————— ——————————————————————————.
Class Method Details
.included(base) ⇒ Object
#############################################################################
9 10 11 |
# File 'lib/milia/control.rb', line 9 def self.included(base) base.extend ClassMethods end |
Instance Method Details
#__milia_change_tenant!(tid) ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/milia/control.rb', line 25 def __milia_change_tenant!( tid ) old_id = ( Thread.current[:tenant_id].nil? ? '%' : Thread.current[:tenant_id] ) new_id = ( tid.nil? ? '%' : tid.to_s ) Thread.current[:tenant_id] = tid session[:tenant_id] = tid # remember it going forward logger.debug("MILIA >>>>> [change tenant] new: #{new_id}\told: #{old_id}") unless logger.nil? end |
#__milia_reset_tenant! ⇒ Object
35 36 37 38 |
# File 'lib/milia/control.rb', line 35 def __milia_reset_tenant! __milia_change_tenant!( nil ) logger.debug("MILIA >>>>> [reset tenant] ") unless logger.nil? end |
#after_sign_in_path_for(resource_or_scope) ⇒ Object
202 203 204 |
# File 'lib/milia/control.rb', line 202 def after_sign_in_path_for(resource_or_scope) welcome_path end |
#after_sign_out_path_for(resource_or_scope) ⇒ Object
Overwriting the sign_out redirect path method
188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/milia/control.rb', line 188 def after_sign_out_path_for(resource_or_scope) if ::Milia.signout_to_root root_path # return to index page else # or return to sign-in page scope = Devise::Mapping.find_scope!(resource_or_scope) send(:"new_#{scope}_session_path") end end |
#after_sign_up_path_for(resource_or_scope) ⇒ Object
209 210 211 |
# File 'lib/milia/control.rb', line 209 def after_sign_up_path_for(resource_or_scope) root_path end |
#authenticate_tenant! ⇒ Object
authenticate_tenant! – authorization & tenant setup – authenticates user – sets current tenant
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/milia/control.rb', line 101 def authenticate_tenant! unless current_user.present? || authenticate_user!(force: true) email = ( params.nil? || params[:user].nil? ? "<email missing>" : params[:user][:email] ) flash[:error] = "cannot sign in as #{email}; check email/password" logger.info("MILIA >>>>> [failed auth user] ") unless logger.nil? end trace_tenanting( "authenticate_tenant!" ) # user_signed_in? == true also means current_user returns valid user raise SecurityError,"*** invalid user_signed_in ***" unless user_signed_in? set_current_tenant # relies on current_user being non-nil # successful tenant authentication; do any callback if self.respond_to?( :callback_authenticate_tenant, true ) logger.debug("MILIA >>>>> [auth_tenant callback]") self.send( :callback_authenticate_tenant ) end true # allows before filter chain to continue end |
#initiate_tenant(tenant) ⇒ Object
initiate_tenant – initiates first-time tenant; establishes thread assumes not in a session yet (since here only upon new account sign-up) ONLY for brand-new tenants upon User account sign up arg
tenant -- tenant obj of the new tenant
89 90 91 |
# File 'lib/milia/control.rb', line 89 def initiate_tenant( tenant ) __milia_change_tenant!( tenant.id ) end |
#invalid_tenant ⇒ Object
invalid_tenant – using wrong or bad data
143 144 145 146 |
# File 'lib/milia/control.rb', line 143 def invalid_tenant flash[:error] = "Wrong tenant access" redirect_back end |
#klass_option_obj(klass, option_obj) ⇒ Object
165 166 167 168 169 |
# File 'lib/milia/control.rb', line 165 def klass_option_obj(klass, option_obj) return option_obj if option_obj.instance_of?(klass) option_obj ||= {} # if nil, makes it empty hash return klass.send( :new, option_obj ) end |
#max_tenants ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/milia/control.rb', line 126 def max_tenants logger.info( "MILIA >>>>> [max tenant signups] #{Time.now.to_s(:db)} - User: '#{params[:user].try(:email)}', Tenant: '#{params[:tenant].try(:name)}'" ) unless logger.nil? flash[:error] = "Sorry: new accounts not permitted at this time" # if using Airbrake & airbrake gem if ::Milia.use_airbrake notify_airbrake( $! ) # have airbrake report this -- requires airbrake gem end redirect_back end |
#prep_signup_view(tenant = nil, user = nil, coupon = {coupon:''}) ⇒ Object
179 180 181 182 183 |
# File 'lib/milia/control.rb', line 179 def prep_signup_view(tenant=nil, user=nil, coupon={coupon:''}) @user = klass_option_obj( User, user ) @tenant = klass_option_obj( Tenant, tenant ) @coupon = coupon # if ::Milia.use_coupon end |
#redirect_back ⇒ Object
redirect_back – bounce client back to referring page
151 152 153 |
# File 'lib/milia/control.rb', line 151 def redirect_back super(fallback_location: root_path) end |
#set_current_tenant(tenant_id = nil) ⇒ Object
set_current_tenant – sets the tenant id for the current invocation (thread) args
tenant_id -- integer id of the tenant; nil if get from current user
EXCEPTIONS – InvalidTenantAccess
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/milia/control.rb', line 58 def set_current_tenant( tenant_id = nil ) if user_signed_in? @_my_tenants ||= current_user.tenants # gets all possible tenants for user tenant_id ||= session[:tenant_id] # use session tenant_id ? if tenant_id.nil? # no arg; find automatically based on user tenant_id = @_my_tenants.first.id # just pick the first one else # validate the specified tenant_id before setup raise InvalidTenantAccess unless @_my_tenants.any?{|tu| tu.id == tenant_id} end else # user not signed in yet... tenant_id = nil # an impossible tenant_id end __milia_change_tenant!( tenant_id ) trace_tenanting( "set_current_tenant" ) true # before filter ok to proceed end |
#trace_tenanting(fm_msg) ⇒ Object
42 43 44 45 46 47 48 49 50 |
# File 'lib/milia/control.rb', line 42 def trace_tenanting( fm_msg ) if ::Milia.trace_on tid = ( session[:tenant_id].nil? ? "%/#{Thread.current[:tenant_id]}" : session[:tenant_id].to_s ) uid = ( current_user.nil? ? "%/#{session[:user_id]}" : "#{current_user.id}") logger.debug( "MILIA >>>>> [#{fm_msg}] stid: #{tid}\tuid: #{uid}\tus-in: #{user_signed_in?}" ) unless logger.nil? end # trace check end |