Commit 732a468

mo <mo@mokhan.ca>
2019-05-09 22:08:27
separate scim specific page params from general pagination stuff.
1 parent cf204ab
Changed files (5)
app
controllers
models
views
scim
spec
requests
app/controllers/concerns/pageable.rb
@@ -4,8 +4,15 @@ module Pageable
   extend ActiveSupport::Concern
 
   included do
-    def paginate(query)
-      Paginate.new(query, params)
+    def paginate(query, page: 0, page_size: 25)
+      Paginate.new(query, page: page, page_size: page_size)
+    end
+
+    def page_param(key, default:, bottom: 0, top: 250)
+      actual = params.fetch(key, default).to_i
+      return bottom if actual < bottom
+      return top if actual > top
+      actual
     end
   end
 end
app/controllers/scim/v2/users_controller.rb
@@ -10,7 +10,7 @@ module Scim
       end
 
       def index
-        @users = paginate(User.all)
+        @users = paginate(User.order(:created_at), page: page - 1, page_size: page_size)
 
         render formats: :scim, status: :ok
       end
@@ -47,6 +47,14 @@ module Scim
       def repository(container = Spank::IOC)
         container.resolve(:user_repository)
       end
+
+      def page
+        page_param(:startIndex, default: 0, bottom: 1, top: 100)
+      end
+
+      def page_size
+        page_param(:count, default: 25, bottom: 0, top: 25)
+      end
     end
   end
 end
app/models/paginate.rb
@@ -1,7 +1,10 @@
 class Paginate < SimpleDelegator
-  def initialize(query, params)
+  attr_reader :page, :page_size
+
+  def initialize(query, page:, page_size:)
     @query = query
-    @params = params
+    @page = page
+    @page_size = page_size
     super(records)
   end
 
@@ -9,24 +12,7 @@ class Paginate < SimpleDelegator
     @total_count ||= @query.count
   end
 
-  def page
-    @page ||= page_param(:startIndex, default: 1, bottom: 1, top: 100)
-  end
-
-  def page_size
-    @page_size ||= page_param(:count, default: 25, bottom: 0, top: 25)
-  end
-
   def records
-    @records ||= @query.offset(page - 1).limit(page_size)
-  end
-
-  private
-
-  def page_param(key, default:, bottom: 0, top: 250)
-    actual = @params.fetch(key, default).to_i
-    return bottom if actual < bottom
-    return top if actual > top
-    actual
+    @records ||= @query.offset(page).limit(page_size)
   end
 end
app/views/scim/v2/users/index.scim.jbuilder
@@ -2,7 +2,7 @@
 
 json.schemas [Scim::Kit::V2::Messages::LIST_RESPONSE]
 json.totalResults @users.total_count
-json.startIndex @users.page
+json.startIndex @users.page + 1
 json.itemsPerPage @users.page_size
 json.Resources do
   json.array! @users do |user|
spec/requests/scim/v2/users_spec.rb
@@ -146,7 +146,7 @@ describe '/scim/v2/users' do
         specify { expect(json[:totalResults]).to be(users.count + 1) }
         specify { expect(json[:startIndex]).to eql(1) }
         specify { expect(json[:itemsPerPage]).to eql(1) }
-        specify { expect(json[:Resources][0][:id]).to eql(User.offset(0).limit(1).pluck(:id).first) }
+        specify { expect(json[:Resources][0][:id]).to eql(User.order(:created_at).offset(0).limit(1).pluck(:id).first) }
       end
 
       context "when requesting a negative page of results" do