OSDN Git Service

fix: finder
[pettanr/pettanr.git] / lib / manifest / controller / action / list.rb
index 201240c..dec4beb 100644 (file)
@@ -2,16 +2,77 @@ module Manifest
   module ControllerModule
     module ActionModule
       class ActionList < Base
-        attr :list_name
+        attr :order, :direction, :default_page_size, :max_page_size, :return_item_name
         
         def set_default
           super
+          @args['direction'] ||= -1
+          @args['default_page_size'] ||= 25
+          @args['max_page_size'] ||= 100
         end
         
         def init
           super
-          raise "undefined list_name for controllers > #{self.controller_name} > actions > #{@action_name} > args\n" unless @args['list_name']
-          @list_name = @args['list_name']
+          @order = @args['order'] || 'updated_at'
+          @direction = @args['direction'].to_i
+          @default_page_size = @args['default_page_size']
+          @max_page_size = @args['max_page_size']
+          @return_item_name = @args['return_item_name'] || @item_name
+        end
+        
+        def a_arg_names
+          super + ['order', 'direction', 'default_page_size', 'max_page_size']
+        end
+        
+        def find options = {}
+          self.finder(options).order(
+            self.order_sql(options[:order], options[:direction])
+          ).page(options[:page]).per(options[:page_size])
+        end
+        
+        def finder options = {}
+          finder_name = options[:finder] || 'find_' + @name
+          finder = if args = options[:param]
+            args = [args] unless options[:param].is_a?(Array)  # param to array
+            self.finder_model.__send__(finder_name, *args)
+          else
+            self.finder_model.__send__(finder_name)
+          end
+        end
+        
+        def finder_model
+          Manifest.manifest.models[@item_name].classify
+        end
+        
+        def return_model
+          Manifest.manifest.models[@return_item_name].classify
+        end
+        
+        def order_sql order, direction
+          order ||= self.order
+          direction ||= (self.direction < 0 ? :desc : :asc)
+          self.return_model.arel_table[order].__send__(direction)
+        end
+        
+        def page page
+          page.to_i
+          page = 1 if page < 1
+          page
+        end
+        
+        def page_size page_size
+          page_size ||= self.default_page_size
+          page_size = -1 if page_size < 0
+          page_size = self.max_page_size if page_size > self.max_page_size
+          page_size
+        end
+        
+        def limited?
+          self.max_page_size > 0
+        end
+        
+        def unlimited?
+          !self.limited?
         end
         
       end