From 21a3206b8560e898265632064f4315f4550959a5 Mon Sep 17 00:00:00 2001 From: Ali Naqvi Date: Thu, 2 Jan 2025 12:49:22 +0800 Subject: [PATCH] feat: PPT-54 updated guests endpoint to use full text search capabilities --- shard.lock | 8 ++++---- spec/controllers/bookings_spec.cr | 2 +- spec/controllers/events_spec.cr | 1 - spec/controllers/recurring_bookings_spec.cr | 2 +- src/controllers/guests.cr | 19 ++++++------------- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/shard.lock b/shard.lock index b240eb1f..c3bab5dd 100644 --- a/shard.lock +++ b/shard.lock @@ -7,7 +7,7 @@ shards: action-controller: git: https://github.com/spider-gazelle/action-controller.git - version: 7.5.0 + version: 7.5.1 active-model: git: https://github.com/spider-gazelle/active-model.git @@ -127,7 +127,7 @@ shards: opentelemetry-instrumentation: git: https://github.com/wyhaines/opentelemetry-instrumentation.cr.git - version: 0.5.5+git.commit.83eace832dad20a71231e71a42258538b05fb193 + version: 0.5.5+git.commit.d7cad682f0b349554c6ff752145d189f6122c86a opentelemetry-sdk: git: https://github.com/wyhaines/opentelemetry-sdk.cr.git @@ -151,7 +151,7 @@ shards: pg-orm: git: https://github.com/spider-gazelle/pg-orm.git - version: 1.1.2+git.commit.9b340ee269cd4a10ed6c5b51235cbaf45fc380e1 + version: 1.1.2+git.commit.7714bb4d3e57fadcfded9d2e17247b5d3506e379 place_calendar: git: https://github.com/placeos/calendar.git @@ -167,7 +167,7 @@ shards: placeos-models: git: https://github.com/placeos/models.git - version: 9.60.1 + version: 9.61.0 pool: git: https://github.com/ysbaddaden/pool.git diff --git a/spec/controllers/bookings_spec.cr b/spec/controllers/bookings_spec.cr index b37e8061..a8c6d2b5 100644 --- a/spec/controllers/bookings_spec.cr +++ b/spec/controllers/bookings_spec.cr @@ -79,7 +79,7 @@ describe Bookings do zones1 = booking1.zones.not_nil! zones_string = "#{zones1.first},#{booking2.zones.not_nil!.last},,#{booking3.zones.not_nil!.last}" - route = "#{BOOKINGS_BASE}?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}&limit=2" + route = "#{BOOKINGS_BASE}/?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}&limit=2" result = client.get(route, headers: headers) result.success?.should be_true diff --git a/spec/controllers/events_spec.cr b/spec/controllers/events_spec.cr index 2a0d4265..6674537d 100644 --- a/spec/controllers/events_spec.cr +++ b/spec/controllers/events_spec.cr @@ -183,7 +183,6 @@ describe Events do guests.compact_map(&.organisation).should eq(["Google inc"]) guests.compact_map(&.notes).should eq(["some notes"]) guests.compact_map(&.photo).should eq(["http://example.com/first.jpg"]) - guests.compact_map(&.searchable).should eq(["jon@example.com john jon google inc 012334446", "dev@acaprojects.onmicrosoft.com dev@acaprojects.onmicrosoft.com "]) guests.compact_map(&.extension_data).should eq([{"fizz" => "buzz"}, {} of String => String?]) end end diff --git a/spec/controllers/recurring_bookings_spec.cr b/spec/controllers/recurring_bookings_spec.cr index 985c0305..854eef51 100644 --- a/spec/controllers/recurring_bookings_spec.cr +++ b/spec/controllers/recurring_bookings_spec.cr @@ -43,7 +43,7 @@ describe Bookings do # make initial request zones1 = booking1.zones.not_nil! zones_string = "#{zones1.first},#{booking2.zones.not_nil!.last},,#{booking3.zones.not_nil!.last}" - route = "#{BOOKINGS_BASE}?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}&limit=2" + route = "#{BOOKINGS_BASE}/?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}&limit=2" result = client.get(route, headers: headers) result.success?.should be_true diff --git a/src/controllers/guests.cr b/src/controllers/guests.cr index 21638959..2df4ead4 100644 --- a/src/controllers/guests.cr +++ b/src/controllers/guests.cr @@ -1,5 +1,3 @@ -require "csv" - class Guests < Application base "/api/staff/v1/guests" @@ -203,17 +201,12 @@ class Guests < Application .limit(1500).to_a else # Return guests based on the filter query - csv = CSV.new(search_query, strip: true, separator: ' ') - csv.next - parts = csv.row.to_a - - sql_query = Guest.by_tenant(tenant.id) - parts.each do |part| - next if part.empty? - sql_query = sql_query.where("searchable LIKE ?", "%#{part}%") - end - - sql_query.order(:name).limit(1500).to_a + tsquery = search_query.split(/\s+/).map { |part| "#{part}:*" }.join(" & ") + Guest + .by_tenant(tenant.id.not_nil!) + .where("tsv_search @@ to_tsquery(?)", tsquery) + .order(:name) + .limit(1500).to_a end end