OSDN Git Service

t#30137:fix authenticate
[pettanr/pettanr.git] / lib / ar_helper.rb
diff --git a/lib/ar_helper.rb b/lib/ar_helper.rb
new file mode 100644 (file)
index 0000000..8a8be92
--- /dev/null
@@ -0,0 +1,77 @@
+
+module ActiveRecord
+  class Base
+    module ActiveRecordHelper
+      def self.included(base)
+        base.extend(ClassMethods)
+        base.__send__ :include, InstanceMethods
+      end
+      
+      module ClassMethods
+        def get_author_from_roles roles
+          roles.each do |role|
+            return role if role.is_a?(Author)
+            return role.author if role.is_a?(User)
+            return role.author if role.is_a?(Artist) and role.author
+          end
+          nil
+        end
+        
+        def get_artist_from_roles roles
+          roles.each do |role|
+            return role.artist if role.is_a?(Author) and role.artist
+            return role.author.artist if role.is_a?(User) and role.author and role.author.artist
+            return role if role.is_a?(Artist)
+          end
+          nil
+        end
+        
+        def get_admin_from_roles roles
+          roles.each do |role|
+            return role if role.is_a?(Admin)
+          end
+          nil
+        end
+        
+      end
+      
+      module InstanceMethods
+        private
+        
+        public
+        
+        def guest_role_check roles
+          true
+        end
+        
+        def reader_role_check roles
+          roles = [roles] unless roles.respond_to?(:each)
+          roles.each do |role|
+            return true if role.is_a?(Author) or role.is_a?(Artist) or role.is_a?(Admin) or role.is_a?(User)
+          end
+          false
+        end
+        
+        def resource_reader_role_check roles
+          roles = [roles] unless roles.respond_to?(:each)
+          roles.each do |role|
+            return true if role.is_a?(Author) or role.is_a?(Artist) or role.is_a?(Admin) or role.is_a?(User) or role.is_a?(DemandUser)
+          end
+          false
+        end
+        
+        def admin_role_check roles
+          roles = [roles] unless roles.respond_to?(:each)
+          roles.each do |role|
+            return true if role.is_a?(Admin)
+          end
+          false
+        end
+        
+      end
+      
+    end
+    include ActiveRecordHelper
+  end
+end
+