From 29b533d1045fdea17f75a4e9fc44c25856e89e05 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Wed, 9 Mar 2022 11:01:55 -0800 Subject: [PATCH 1/6] Update search routes to use POST instead of GET --- config/routes.rb | 6 +++--- db/schema.rb | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 9abb6b4..7c88858 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,9 +22,9 @@ Rails.application.routes.draw do post 'check/email', to: 'users#check_email' post 'check/username', to: 'users#check_username' - get 'search/characters', to: 'search#characters' - get 'search/weapons', to: 'search#weapons' - get 'search/summons', to: 'search#summons' + post 'search/characters', to: 'search#characters' + post 'search/weapons', to: 'search#weapons' + post 'search/summons', to: 'search#summons' get 'raids', to: 'raids#all' get 'weapon_keys', to: 'weapon_keys#all' diff --git a/db/schema.rb b/db/schema.rb index e0359e4..33e1e82 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -17,6 +17,7 @@ ActiveRecord::Schema.define(version: 2022_03_09_013333) do enable_extension "pg_trgm" enable_extension "pgcrypto" enable_extension "plpgsql" + enable_extension "timescaledb" create_table "characters", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.string "name_en" @@ -99,6 +100,9 @@ ActiveRecord::Schema.define(version: 2022_03_09_013333) do t.integer "element" t.index ["party_id"], name: "index_grid_weapons_on_party_id" t.index ["weapon_id"], name: "index_grid_weapons_on_weapon_id" + t.index ["weapon_key1_id"], name: "index_grid_weapons_on_weapon_key1_id" + t.index ["weapon_key2_id"], name: "index_grid_weapons_on_weapon_key2_id" + t.index ["weapon_key3_id"], name: "index_grid_weapons_on_weapon_key3_id" end create_table "oauth_access_grants", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| From 14260e4ce0c1b5578a6a7e444d6f7b4af39d92c9 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Wed, 9 Mar 2022 11:02:12 -0800 Subject: [PATCH 2/6] Add filtering to weapon search --- app/controllers/api/v1/search_controller.rb | 44 ++++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index e169fd5..99d4f2d 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -1,13 +1,13 @@ class Api::V1::SearchController < Api::V1::ApiController def characters - locale = params[:locale] || 'en' + locale = search_params[:locale] || 'en' - if params[:query].present? + if search_params[:query].present? if locale == 'ja' - @characters = Character.jp_search(params[:query]).limit(10) + @characters = Character.jp_search(search_params[:query]).limit(10) else # @characters = Character.where("name_en ILIKE ? AND name_en NOT ILIKE ALL(ARRAY[?])", "%#{params[:query]}%", excludes).limit(10) - @characters = Character.en_search(params[:query]).limit(10) + @characters = Character.en_search(search_params[:query]).limit(10) end else @characters = Character.all @@ -15,30 +15,46 @@ class Api::V1::SearchController < Api::V1::ApiController end def weapons - locale = params[:locale] || 'en' + filters = search_params[:filters] + locale = search_params[:locale] || 'en' - if params[:query].present? + conditions = {} + conditions[:rarity] = filters['rarity'] unless filters['rarity'].blank? || filters['rarity'].empty? + conditions[:element] = filters['element'] unless filters['element'].blank? || filters['element'].empty? + conditions[:proficiency] = filters['proficiency'] unless filters['proficiency'].blank? || filters['proficiency'].empty? + conditions[:series] = filters['series'] unless filters['series'].blank? || filters['series'].empty? + + ap conditions + + if search_params[:query].present? if locale == 'ja' - @weapons = Weapon.jp_search(params[:query]).limit(10) + @weapons = Weapon.jp_search(search_params[:query]).where(conditions).limit(10) else - @weapons = Weapon.en_search(params[:query]).limit(10) - end + @weapons = Weapon.en_search(search_params[:query]).where(conditions).limit(10) + end else - @weapons = Weapon.all + @weapons = Weapon.where(conditions).limit(10) # Temporary limit before pagination end end def summons - locale = params[:locale] || 'en' + locale = search_params[:locale] || 'en' - if params[:query].present? + if search_params[:query].present? if locale == 'ja' - @summons = Summon.jp_search(params[:query]).limit(10) + @summons = Summon.jp_search(search_params[:query]).limit(10) else - @summons = Summon.en_search(params[:query]).limit(10) + @summons = Summon.en_search(search_params[:query]).limit(10) end else @summons = Summon.all end end + + private + + # Specify whitelisted properties that can be modified. + def search_params + params.require(:search).permit! + end end \ No newline at end of file From 0584ac84e5baafc70134c3b9233da1dc49938f1b Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 11 Mar 2022 01:12:35 -0800 Subject: [PATCH 3/6] Added filters to summons and characters --- app/controllers/api/v1/search_controller.rb | 79 ++++++++++++++------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index 99d4f2d..f3230a7 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -1,54 +1,79 @@ class Api::V1::SearchController < Api::V1::ApiController def characters + filters = search_params[:filters] locale = search_params[:locale] || 'en' + conditions = {} - if search_params[:query].present? - if locale == 'ja' - @characters = Character.jp_search(search_params[:query]).limit(10) - else - # @characters = Character.where("name_en ILIKE ? AND name_en NOT ILIKE ALL(ARRAY[?])", "%#{params[:query]}%", excludes).limit(10) - @characters = Character.en_search(search_params[:query]).limit(10) - end - else - @characters = Character.all + if filters + conditions[:rarity] = filters['rarity'] unless filters['rarity'].blank? || filters['rarity'].empty? + conditions[:element] = filters['element'] unless filters['element'].blank? || filters['element'].empty? + conditions[:proficiency1] = filters['proficiency1'] unless filters['proficiency1'].blank? || filters['proficiency1'].empty? + conditions[:proficiency2] = filters['proficiency2'] unless filters['proficiency2'].blank? || filters['proficiency2'].empty? + # conditions[:series] = filters['series'] unless filters['series'].blank? || filters['series'].empty? end + + if search_params[:query].present? && search_params[:query].length >= 2 + if locale == 'ja' + @characters = Character.jp_search(search_params[:query]).where(conditions) + else + @characters = Character.en_search(search_params[:query]).where(conditions) + end + else + @characters = Character.where(conditions) + end + + @count = @characters.length + @characters = @characters.paginate(page: search_params[:page], per_page: 10) end def weapons filters = search_params[:filters] locale = search_params[:locale] || 'en' - conditions = {} - conditions[:rarity] = filters['rarity'] unless filters['rarity'].blank? || filters['rarity'].empty? - conditions[:element] = filters['element'] unless filters['element'].blank? || filters['element'].empty? - conditions[:proficiency] = filters['proficiency'] unless filters['proficiency'].blank? || filters['proficiency'].empty? - conditions[:series] = filters['series'] unless filters['series'].blank? || filters['series'].empty? - ap conditions + if filters + conditions[:rarity] = filters['rarity'] unless filters['rarity'].blank? || filters['rarity'].empty? + conditions[:element] = filters['element'] unless filters['element'].blank? || filters['element'].empty? + conditions[:proficiency] = filters['proficiency1'] unless filters['proficiency1'].blank? || filters['proficiency1'].empty? + conditions[:series] = filters['series'] unless filters['series'].blank? || filters['series'].empty? + end - if search_params[:query].present? + if search_params[:query].present? && search_params[:query].length >= 2 if locale == 'ja' - @weapons = Weapon.jp_search(search_params[:query]).where(conditions).limit(10) + @weapons = Weapon.jp_search(search_params[:query]).where(conditions) else - @weapons = Weapon.en_search(search_params[:query]).where(conditions).limit(10) + @weapons = Weapon.en_search(search_params[:query]).where(conditions) end else - @weapons = Weapon.where(conditions).limit(10) # Temporary limit before pagination + @weapons = Weapon.where(conditions) end + + @count = @weapons.length + @weapons = @weapons.paginate(page: search_params[:page], per_page: 10) end def summons + filters = search_params[:filters] locale = search_params[:locale] || 'en' + conditions = {} - if search_params[:query].present? - if locale == 'ja' - @summons = Summon.jp_search(search_params[:query]).limit(10) - else - @summons = Summon.en_search(search_params[:query]).limit(10) - end - else - @summons = Summon.all + if filters + conditions[:rarity] = filters['rarity'] unless filters['rarity'].blank? || filters['rarity'].empty? + conditions[:element] = filters['element'] unless filters['element'].blank? || filters['element'].empty? end + + if search_params[:query].present? && search_params[:query].length >= 2 + if locale == 'ja' + @summons = Summon.jp_search(search_params[:query]).where(conditions) + else + @summons = Summon.en_search(search_params[:query]).where(conditions) + end + else + @summons = Summon.where(conditions) + end + + @count = @summons.length + @summons = @summons.paginate(page: search_params[:page], per_page: 10) end private From 6a2f5e1a5cd4d3ce2efb026a21261e8e5cbc5c60 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 11 Mar 2022 01:12:45 -0800 Subject: [PATCH 4/6] Updated search templates --- app/views/api/v1/search/characters.json.rabl | 12 ++++++++++-- app/views/api/v1/search/summons.json.rabl | 12 ++++++++++-- app/views/api/v1/search/weapons.json.rabl | 12 ++++++++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/views/api/v1/search/characters.json.rabl b/app/views/api/v1/search/characters.json.rabl index 70134c6..ab551fa 100644 --- a/app/views/api/v1/search/characters.json.rabl +++ b/app/views/api/v1/search/characters.json.rabl @@ -1,3 +1,11 @@ -collection @characters, :object_root => false +node :count do + @count +end -extends 'characters/base' \ No newline at end of file +node :total_pages do + (@count.to_f / 10 > 1) ? (@count.to_f / 10).ceil() : 1 +end + +node(:results) { + partial('characters/base', object: @characters) +} unless @characters.empty? diff --git a/app/views/api/v1/search/summons.json.rabl b/app/views/api/v1/search/summons.json.rabl index 8fd7e1e..073eb1e 100644 --- a/app/views/api/v1/search/summons.json.rabl +++ b/app/views/api/v1/search/summons.json.rabl @@ -1,3 +1,11 @@ -collection @summons, :object_root => false +node :count do + @count +end -extends 'summons/base' \ No newline at end of file +node :total_pages do + (@count.to_f / 10 > 1) ? (@count.to_f / 10).ceil() : 1 +end + +node(:results) { + partial('summons/base', object: @summons) +} unless @summons.empty? diff --git a/app/views/api/v1/search/weapons.json.rabl b/app/views/api/v1/search/weapons.json.rabl index fce5472..b759323 100644 --- a/app/views/api/v1/search/weapons.json.rabl +++ b/app/views/api/v1/search/weapons.json.rabl @@ -1,3 +1,11 @@ -collection @weapons, :object_root => false +node :count do + @count +end -extends 'weapons/base' \ No newline at end of file +node :total_pages do + (@count.to_f / 10 > 1) ? (@count.to_f / 10).ceil() : 1 +end + +node(:results) { + partial('weapons/base', object: @weapons) +} unless @weapons.empty? From 0561c11ebcd337eb61a36c140938032081ef65a1 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 11 Mar 2022 01:12:54 -0800 Subject: [PATCH 5/6] Update path --- app/views/api/v1/users/{info.rabl => info.json.rabl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/views/api/v1/users/{info.rabl => info.json.rabl} (100%) diff --git a/app/views/api/v1/users/info.rabl b/app/views/api/v1/users/info.json.rabl similarity index 100% rename from app/views/api/v1/users/info.rabl rename to app/views/api/v1/users/info.json.rabl From ad74ed4a14024dc33a0f379d885f17e70a812820 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 11 Mar 2022 01:13:03 -0800 Subject: [PATCH 6/6] Add will_paginate --- Gemfile | 4 ++++ Gemfile.lock | 2 ++ 2 files changed, 6 insertions(+) diff --git a/Gemfile b/Gemfile index 6f1c65c..e247f01 100644 --- a/Gemfile +++ b/Gemfile @@ -37,8 +37,12 @@ gem 'awesome_nested_set' # An email validator for Rails gem "email_validator" +# pg_search builds ActiveRecord named scopes that take advantage of PostgreSQL’s full text search gem 'pg_search' +# Pagination library +gem 'will_paginate', '~> 3.3' + group :doc do gem 'sdoc' gem 'apipie-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 3861ed2..c7f2096 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -272,6 +272,7 @@ GEM websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) + will_paginate (3.3.1) yard (0.9.26) zeitwerk (2.5.1) @@ -313,6 +314,7 @@ DEPENDENCIES solargraph spring spring-commands-rspec + will_paginate (~> 3.3) RUBY VERSION ruby 3.0.0p0