Commit fffcefe

mo <mo.khan@gmail.com>
2019-06-02 05:05:20
connect layers to the new filter API
1 parent 6710904
Changed files (5)
app
controllers
models
spec
app/controllers/scim/v2/users_controller.rb
@@ -12,17 +12,11 @@ module Scim
       def index
         @users =
           if params[:filter].present?
-            paginate(
-              apply_filter_to(User.order(:created_at), params[:filter]),
-              page: page - 1,
-              page_size: page_size
-            )
+            User.order(:created_at).scim_filter_for(params[:filter])
           else
-            paginate(
-              User.order(:created_at),
-              page: page - 1, page_size: page_size
-            )
+            User.order(:created_at)
           end
+        @users = paginate(@users, page: page - 1, page_size: page_size)
         render formats: :scim, status: :ok
       end
 
@@ -66,12 +60,6 @@ module Scim
       def page_size
         page_param(:count, default: 25, bottom: 0, top: 25)
       end
-
-      def apply_filter_to(scope, raw_filter)
-        parser = Scim::Kit::V2::Filter.new
-        parse_tree = parser.parse(raw_filter)
-        scope.scim_filter_for(parse_tree)
-      end
     end
   end
 end
app/models/scim/visitor.rb
@@ -78,8 +78,9 @@ module Scim
       end
     end
 
-    def self.result_for(node)
-      new(User, SCIM::User::ATTRIBUTES).visit(node)
+    def self.result_for(filter)
+      node = Scim::Node.parse(filter)
+      node.accept(new(User, SCIM::User::ATTRIBUTES))
     end
 
     private
app/models/user.rb
@@ -13,7 +13,7 @@ class User < ApplicationRecord
   validates :timezone, inclusion: VALID_TIMEZONES
   validates :locale, inclusion: VALID_LOCALES
 
-  scope :scim_filter_for, ->(tree) { Scim::Visitor.result_for(tree) }
+  scope :scim_filter_for, ->(filter) { Scim::Visitor.result_for(filter) }
 
   def name_id_for(name_id_format)
     Saml::Kit::Namespaces::PERSISTENT == name_id_format ? id : email
spec/models/scim/visitor_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe ::Scim::Visitor do
@@ -13,7 +15,7 @@ RSpec.describe ::Scim::Visitor do
     end
 
     specify do
-      results = Scim::Node.parse("userName pr").accept(subject)
+      results = described_class.result_for("userName pr")
       expect(results.to_sql).to eql(User.where.not(email: nil).to_sql)
       expect(results).to match_array(users)
     end
spec/models/user_spec.rb
@@ -16,40 +16,35 @@ RSpec.describe User do
 
     let!(:users) { create_list(:user, 10) }
     let(:random_user) { users.sample }
-    let(:parser) { Scim::Kit::V2::Filter.new }
-
-    def tree_for(filter)
-      parser.parse(filter)
-    end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName pr"))
+      results = subject.scim_filter_for("userName pr")
       expect(results.to_sql).to eql(subject.where.not(email: nil).to_sql)
       expect(results).to match_array(users)
     end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName eq \"#{random_user.email}\""))
+      results = subject.scim_filter_for("userName eq \"#{random_user.email}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName ne \"#{random_user.email}\""))
+      results = subject.scim_filter_for("userName ne \"#{random_user.email}\"")
       expect(results.pluck(:email)).not_to include(random_user.email)
     end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName co \"#{random_user.email[1..-2]}\""))
+      results = subject.scim_filter_for("userName co \"#{random_user.email[1..-2]}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName sw \"#{random_user.email[0..3]}\""))
+      results = subject.scim_filter_for("userName sw \"#{random_user.email[0..3]}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for(tree_for("userName ew \"#{random_user.email[-8..-1]}\""))
+      results = subject.scim_filter_for("userName ew \"#{random_user.email[-8..-1]}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -57,7 +52,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for(tree_for("meta.lastModified gt \"#{Time.now.iso8601}\""))
+      results = subject.scim_filter_for("meta.lastModified gt \"#{Time.now.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -65,7 +60,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for(tree_for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\""))
+      results = subject.scim_filter_for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -73,7 +68,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for(tree_for("meta.lastModified lt \"#{Time.now.iso8601}\""))
+      results = subject.scim_filter_for("meta.lastModified lt \"#{Time.now.iso8601}\"")
       expect(results).to match_array(users - [random_user])
     end
 
@@ -81,14 +76,14 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.ago)
 
-      results = subject.scim_filter_for(tree_for("meta.lastModified le \"#{random_user.updated_at.iso8601}\""))
+      results = subject.scim_filter_for("meta.lastModified le \"#{random_user.updated_at.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
     context "when searching for condition a OR condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { described_class.scim_filter_for(tree_for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}"))) }
+      let(:results) { described_class.scim_filter_for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")) }
 
       specify { expect(results.pluck(:email)).to match_array([first_user.email, second_user.email]) }
     end
@@ -96,7 +91,7 @@ RSpec.describe User do
     context "when searching for condition a AND condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { described_class.scim_filter_for(tree_for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}"))) }
+      let(:results) { described_class.scim_filter_for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")) }
 
       before do
         freeze_time