202 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
module  OrbitCoreLib
 | 
						|
  module Preview
 | 
						|
    def self.included(base)
 | 
						|
 | 
						|
      # base.instance_eval("field :is_preview,type: Boolean,:default => false")
 | 
						|
      # base.instance_eval("scope :not_preview,where(:is_preview=>false)")
 | 
						|
      base.class_eval ("
 | 
						|
        def to_preview
 | 
						|
          raise 'Developer,please override to_preview method'  
 | 
						|
        end
 | 
						|
      ")
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  module BelongsToCategoryMayDisable
 | 
						|
    def self.included(base)
 | 
						|
        base.instance_eval("belongs_to :#{base::BelongsToCategory.to_s}")
 | 
						|
        base.instance_eval("
 | 
						|
          scope :currently_available_by_category, lambda { |category| 
 | 
						|
          check_data = category.to_a.collect{|cate| cate.id}
 | 
						|
          any_in(#{ base::BelongsToCategory.to_s}_id: check_data) 
 | 
						|
          }
 | 
						|
        ")
 | 
						|
       base.instance_eval("scope :admin_manager_all,find(:all)")
 | 
						|
      # base.instance_eval("scope :all,where(disable: false)")
 | 
						|
       base.instance_eval("
 | 
						|
          scope :all, lambda { 
 | 
						|
          category = base::BelongsToCategory.to_s.classify.constantize.all
 | 
						|
          check_data = category.to_a.collect{|cate| cate.id}
 | 
						|
          any_in(#{ base::BelongsToCategory.to_s}_id: check_data) 
 | 
						|
          }
 | 
						|
        ")
 | 
						|
          base.class_eval("
 | 
						|
          def disable?
 | 
						|
            #{base::BelongsToCategory.to_s}.disable?
 | 
						|
          end
 | 
						|
        ")
 | 
						|
      end
 | 
						|
 | 
						|
 | 
						|
    # end
 | 
						|
 | 
						|
 | 
						|
  end
 | 
						|
  module ObjectDisable
 | 
						|
     def self.included(base)
 | 
						|
 | 
						|
      base.instance_eval("field :disable,type: Boolean,:default => false")
 | 
						|
      base.instance_eval("scope :all, where(:disable.in => [false, nil, ''])")
 | 
						|
      base.instance_eval("scope :admin_manager_all,find(:all)")
 | 
						|
      
 | 
						|
      base.define_singleton_method :find do |*args|
 | 
						|
        if args ==[:all]
 | 
						|
          unscoped
 | 
						|
        else
 | 
						|
          res = unscoped.find(args) 
 | 
						|
          res.count == 1 ? res[0] : res
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      base.define_singleton_method :first do |*args|
 | 
						|
        all.first
 | 
						|
      end
 | 
						|
 | 
						|
      base.define_singleton_method :last do |*args|
 | 
						|
        all.last
 | 
						|
      end
 | 
						|
 | 
						|
    end
 | 
						|
  end
 | 
						|
  module  ObjectAuthable
 | 
						|
    def self.included(base)
 | 
						|
      base.instance_eval("has_many :object_auths,as: :obj_authable,dependent: :delete")
 | 
						|
      
 | 
						|
      base.define_singleton_method :authed_for_user do |user,title = nil|
 | 
						|
        sub_role_ids_ary=user.sub_roles.collect{|t| t.id}
 | 
						|
        if title.nil?
 | 
						|
          auth_object_space = ObjectAuth.where(obj_authable_type: self.to_s)
 | 
						|
        else
 | 
						|
          auth_object_space = ObjectAuth.where(obj_authable_type: self.to_s,title: title)
 | 
						|
        end
 | 
						|
        
 | 
						|
        query1 = auth_object_space.any_in({sub_role_ids: sub_role_ids_ary}).excludes(blocked_user_ids: user.id)
 | 
						|
        query2 = auth_object_space.any_of({all: true},{privilege_user_ids: user.id},{role_ids: user.role_ids}).excludes(blocked_user_ids: user.id)
 | 
						|
        result = (query1 + query2).uniq
 | 
						|
        result.collect{|t| t.obj_authable}.delete_if{|val| val==nil}
 | 
						|
      end
 | 
						|
        
 | 
						|
    end
 | 
						|
    
 | 
						|
    def cur_user_is_sub_manager_of(title)
 | 
						|
       authed_users(title).include?(User.current)
 | 
						|
    end 
 | 
						|
 | 
						|
    def module_app
 | 
						|
       ModuleApp.first(conditions: {:title => self.class::APP_NAME} )
 | 
						|
    end
 | 
						|
 | 
						|
    def pp_object
 | 
						|
      "Object Auth method 'pp_object' need to be defined for class #{self.class}"
 | 
						|
    end
 | 
						|
    
 | 
						|
    def get_object_auth_by_title(title)
 | 
						|
      oa = self.object_auths.where({title: title }).first
 | 
						|
       if oa.nil? && (self.class::ObjectAuthTitlesOptions.include? title)
 | 
						|
        oa =  self.object_auths.create title: title
 | 
						|
      end
 | 
						|
      oa
 | 
						|
    end
 | 
						|
    
 | 
						|
    def authed_users(title=nil)
 | 
						|
      users = []
 | 
						|
      users = case title
 | 
						|
      when :all
 | 
						|
         ary = self.object_auths.collect{|t| t.auth_users}
 | 
						|
         ary.flatten!
 | 
						|
      when nil
 | 
						|
        if self.object_auths.count ==1 
 | 
						|
          self.object_auths.first.auth_users_after_block_list rescue []
 | 
						|
          else
 | 
						|
            logger.info "Warning calling a auth commend without specificed value( has multi-auths ), return empty"
 | 
						|
            []
 | 
						|
          end
 | 
						|
      else
 | 
						|
        get_object_auth_by_title(title).auth_users rescue []
 | 
						|
      end
 | 
						|
      users
 | 
						|
    end
 | 
						|
    
 | 
						|
  end
 | 
						|
  module  ObjectTokenUtility
 | 
						|
    def self.included(base)
 | 
						|
      base.instance_eval("field :s_token")
 | 
						|
      base.instance_eval("after_create :generate_token")
 | 
						|
    end
 | 
						|
    
 | 
						|
    def token
 | 
						|
      return self.s_token
 | 
						|
    end
 | 
						|
    
 | 
						|
    protected
 | 
						|
     def generate_token
 | 
						|
       self.s_token = SecureRandom.hex(16)
 | 
						|
       self.save!
 | 
						|
     end
 | 
						|
  end
 | 
						|
  
 | 
						|
  module PermissionUtility
 | 
						|
  private
 | 
						|
    def check_permission(type = :use)
 | 
						|
      permission_grant =  current_or_guest_user.admin?? true : false
 | 
						|
      module_app = @module_app.nil?? find_module_app_by_token(params[:token]) : @module_app
 | 
						|
      unless permission_grant
 | 
						|
        permission_grant = case type
 | 
						|
        when :use
 | 
						|
          users_ary = module_app.app_auth.auth_users rescue nil
 | 
						|
          users_ary = [] if users_ary.nil?
 | 
						|
          (users_ary.include?(current_or_guest_user) || module_app.is_manager?(current_or_guest_user) || module_app.is_sub_manager?(current_or_guest_user))
 | 
						|
        when :manager
 | 
						|
          module_app.is_manager?(current_or_guest_user)
 | 
						|
        when :sub_manager  
 | 
						|
          module_app.is_manager?(current_or_guest_user) || module_app.is_sub_manager?(current_or_guest_user)
 | 
						|
        end  
 | 
						|
      end
 | 
						|
      permission_grant
 | 
						|
    end
 | 
						|
    def find_module_app_by_token(token)
 | 
						|
      ModuleApp.first(conditions: {s_token: token})
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  module AppBackendUtility
 | 
						|
    def setup_vars
 | 
						|
      @app_title ||= controller_path.split('/')[1].singularize
 | 
						|
      @module_app ||= ModuleApp.first(conditions: {:key => @app_title} )
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    def force_order_for_visitor
 | 
						|
      setup_vars
 | 
						|
      set_current_user
 | 
						|
    end
 | 
						|
 | 
						|
 | 
						|
    def force_order_for_user
 | 
						|
      setup_vars
 | 
						|
      set_current_user    
 | 
						|
      authenticate_user!
 | 
						|
      check_user_can_use
 | 
						|
    end
 | 
						|
 | 
						|
    def check_user_can_use 
 | 
						|
      unless check_permission
 | 
						|
        #redirect_to polymorphic_path(['panel',@app_title,'back_end','public'])
 | 
						|
        redirect_to root_url
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
end
 |