From d0c9c81b92df87f4200780feb6b50e7122eaa29e Mon Sep 17 00:00:00 2001 From: Stephann Vasconcelos <3025661+stephannv@users.noreply.github.com> Date: Sun, 17 Jul 2022 14:32:28 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Allow=20search=20for=20items=20with?= =?UTF-8?q?=20demo=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/clients/nintendo/item_data_adapter.rb | 6 +++--- .../games/filter_form_component.html.erb | 14 +++++++++++++- .../specs_section_component.html.erb | 11 +++++++++++ app/form_objects/game_filters_form.rb | 1 + app/lib/items_filter.rb | 3 ++- app/models/concerns/items/scopes.rb | 1 + config/locales/pt-BR/components/games.yml | 1 + .../locales/pt-BR/components/item_details.yml | 1 + config/locales/pt-BR/global.yml | 5 +++++ .../20220717164537_add_with_demo_to_items.rb | 7 +++++++ db/schema.rb | 5 +++-- .../clients/nintendo/item_data_adapter_spec.rb | 18 ++++++++++++++---- spec/factories/items_factories.rb | 2 +- spec/form_objects/game_filters_form_spec.rb | 1 + spec/lib/items_filter_spec.rb | 12 ++++++++++++ spec/models/concerns/items/item_scopes_spec.rb | 9 +++++++++ 16 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 db/migrate/20220717164537_add_with_demo_to_items.rb diff --git a/app/clients/nintendo/item_data_adapter.rb b/app/clients/nintendo/item_data_adapter.rb index 94a3682..4c9d294 100644 --- a/app/clients/nintendo/item_data_adapter.rb +++ b/app/clients/nintendo/item_data_adapter.rb @@ -6,7 +6,7 @@ class ItemDataAdapter ATTRIBUTES = %i[ item_type title description release_date release_date_display website_url banner_url external_id nsuid genres - developer publisher franchises demo_nsuid num_of_players + developer publisher franchises with_demo num_of_players ].freeze IMAGE_BASE_URL = "https://assets.nintendo.com/image/upload/ar_16:9,b_auto:border,c_lpad/b_white/f_auto/q_auto/dpr_auto/c_scale,w_720/v1" ITEM_TYPES = { @@ -85,8 +85,8 @@ def franchises data["franchises"].to_a.compact end - def demo_nsuid - data["demoNsuid"] + def with_demo + data["demoNsuid"].present? end def num_of_players diff --git a/app/components/games/filter_form_component.html.erb b/app/components/games/filter_form_component.html.erb index 6717190..f795f17 100644 --- a/app/components/games/filter_form_component.html.erb +++ b/app/components/games/filter_form_component.html.erb @@ -88,7 +88,7 @@ -
<%= link_to item.website_url, class: "link flex gap-2", target: "_blank", rel: "noopener noreferrer" do %> diff --git a/app/form_objects/game_filters_form.rb b/app/form_objects/game_filters_form.rb index 0481092..cdc4812 100644 --- a/app/form_objects/game_filters_form.rb +++ b/app/form_objects/game_filters_form.rb @@ -18,6 +18,7 @@ class GameFiltersForm attribute :new_release, :boolean attribute :coming_soon, :boolean attribute :pre_order, :boolean + attribute :with_demo, :boolean attribute :wishlisted, :boolean def self.build(attributes = {}) diff --git a/app/lib/items_filter.rb b/app/lib/items_filter.rb index eb285f5..f5d75ef 100644 --- a/app/lib/items_filter.rb +++ b/app/lib/items_filter.rb @@ -11,6 +11,7 @@ class ItemsFilter filter_new_release filter_coming_soon filter_pre_order + filter_with_demo ].freeze def initialize(filters_form:, relation: Item) @@ -54,7 +55,7 @@ def filter_language self.relation = relation.where("languages @> ARRAY[?]::varchar[]", filters_form.language) end - %i[on_sale new_release coming_soon pre_order].each do |scope| + %i[on_sale new_release coming_soon pre_order with_demo].each do |scope| define_method :"filter_#{scope}" do self.relation = relation.send(scope) if filters_form.public_send(scope) end diff --git a/app/models/concerns/items/scopes.rb b/app/models/concerns/items/scopes.rb index 758b684..edb0f1b 100644 --- a/app/models/concerns/items/scopes.rb +++ b/app/models/concerns/items/scopes.rb @@ -13,6 +13,7 @@ module Scopes scope :new_release, -> { where(new_release: true) } scope :coming_soon, -> { where(coming_soon: true) } scope :pre_order, -> { where(pre_order: true) } + scope :with_demo, -> { where(with_demo: true) } scope :pending_scrap, -> { where(last_scraped_at: (..24.hours.ago)).or(where(last_scraped_at: nil)) } scope :with_prices, -> { joins(:price).includes(:price) } scope :including_prices, -> { left_joins(:price).includes(:price) } diff --git a/config/locales/pt-BR/components/games.yml b/config/locales/pt-BR/components/games.yml index a040452..e13e265 100644 --- a/config/locales/pt-BR/components/games.yml +++ b/config/locales/pt-BR/components/games.yml @@ -14,6 +14,7 @@ pt-BR: pre_order: Pré-venda coming_soon: Em breve new_release: Lançamento + with_demo: Demo disponível all: Tudo close: Fechar clear: Limpar diff --git a/config/locales/pt-BR/components/item_details.yml b/config/locales/pt-BR/components/item_details.yml index d70d38a..1bd4470 100644 --- a/config/locales/pt-BR/components/item_details.yml +++ b/config/locales/pt-BR/components/item_details.yml @@ -17,4 +17,5 @@ pt-BR: languages: Idiomas num_of_players: Qtde. de Jogadores rom_size: Espaço em disco + with_demo: Versão demo disponível? official_website: Site Oficial diff --git a/config/locales/pt-BR/global.yml b/config/locales/pt-BR/global.yml index 86a7724..4b938d8 100644 --- a/config/locales/pt-BR/global.yml +++ b/config/locales/pt-BR/global.yml @@ -1,8 +1,13 @@ pt-BR: + yes_or_no: + "true": Sim + "false": Não + time: formats: shorter: "%d/%m/%Y %H:%M" + time_distance_from_now: Há %{distance} website_description: Descubra o próximo jogo do seu Nintendo Switch. diff --git a/db/migrate/20220717164537_add_with_demo_to_items.rb b/db/migrate/20220717164537_add_with_demo_to_items.rb new file mode 100644 index 0000000..ce54e08 --- /dev/null +++ b/db/migrate/20220717164537_add_with_demo_to_items.rb @@ -0,0 +1,7 @@ +class AddWithDemoToItems < ActiveRecord::Migration[7.0] + def change + add_column :items, :with_demo, :boolean, null: false, default: false + remove_column :items, :demo_nsuid + add_index :items, :with_demo, where: :with_demo + end +end diff --git a/db/schema.rb b/db/schema.rb index 40df384..6155698 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2022_06_29_223033) do +ActiveRecord::Schema[7.0].define(version: 2022_07_17_164537) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pgcrypto" @@ -89,12 +89,12 @@ t.string "screenshot_urls", default: [], null: false, array: true t.string "developer" t.string "publisher" - t.string "demo_nsuid" t.string "num_of_players" t.integer "item_type", null: false t.string "bg_color" t.string "headline" t.string "video_urls", default: [], null: false, array: true + t.boolean "with_demo", default: false, null: false t.index ["all_time_visits"], name: "index_items_on_all_time_visits" t.index ["coming_soon"], name: "index_items_on_coming_soon", where: "coming_soon" t.index ["created_at"], name: "index_items_on_created_at", order: :desc @@ -109,6 +109,7 @@ t.index ["pre_order"], name: "index_items_on_pre_order", where: "pre_order" t.index ["release_date"], name: "index_items_on_release_date" t.index ["slug"], name: "index_items_on_slug" + t.index ["with_demo"], name: "index_items_on_with_demo", where: "with_demo" end create_table "price_history_items", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| diff --git a/spec/clients/nintendo/item_data_adapter_spec.rb b/spec/clients/nintendo/item_data_adapter_spec.rb index d05088e..5657925 100644 --- a/spec/clients/nintendo/item_data_adapter_spec.rb +++ b/spec/clients/nintendo/item_data_adapter_spec.rb @@ -156,11 +156,21 @@ end end - describe "#demo_nsuid" do - it "returns demoNsuid" do - adapted_data = described_class.adapt({ "demoNsuid" => "some nsuid" }) + describe "#with_demo" do + context "when demo_nsuid is present" do + it "returns true" do + adapted_data = described_class.adapt({ "demoNsuid" => "some nsuid" }) - expect(adapted_data[:demo_nsuid]).to eq "some nsuid" + expect(adapted_data[:with_demo]).to be true + end + end + + context "when demo_nsuid is blank" do + it "returns false" do + adapted_data = described_class.adapt({ "demoNsuid" => nil }) + + expect(adapted_data[:with_demo]).to be false + end end end diff --git a/spec/factories/items_factories.rb b/spec/factories/items_factories.rb index 1eef5ca..f3e3d87 100644 --- a/spec/factories/items_factories.rb +++ b/spec/factories/items_factories.rb @@ -16,12 +16,12 @@ developer { Faker::Lorem.word } genres { Faker::Lorem.words(number: 3) } franchises { Faker::Lorem.words(number: 2) } - demo_nsuid { Faker::Lorem.word } num_of_players { Faker::Lorem.word } on_sale { Faker::Boolean.boolean } new_release { Faker::Boolean.boolean } coming_soon { Faker::Boolean.boolean } pre_order { Faker::Boolean.boolean } + with_demo { Faker::Boolean.boolean } all_time_visits { Faker::Number.number(digits: 3) } last_week_visits { Faker::Number.number(digits: 2) } languages { I18nData.languages.keys.sample(3) } diff --git a/spec/form_objects/game_filters_form_spec.rb b/spec/form_objects/game_filters_form_spec.rb index 2c8b7c7..e00b3f0 100644 --- a/spec/form_objects/game_filters_form_spec.rb +++ b/spec/form_objects/game_filters_form_spec.rb @@ -19,6 +19,7 @@ new_release: an_instance_of(ActiveModel::Type::Boolean), coming_soon: an_instance_of(ActiveModel::Type::Boolean), pre_order: an_instance_of(ActiveModel::Type::Boolean), + with_demo: an_instance_of(ActiveModel::Type::Boolean), wishlisted: an_instance_of(ActiveModel::Type::Boolean) }.stringify_keys end diff --git a/spec/lib/items_filter_spec.rb b/spec/lib/items_filter_spec.rb index 4f15e39..dc6a888 100644 --- a/spec/lib/items_filter_spec.rb +++ b/spec/lib/items_filter_spec.rb @@ -111,5 +111,17 @@ expect(result.to_a).to eq [item] end end + + context "when with_demo param is true" do + it "returns with_demo items" do + filters_form = GameFiltersForm.build(with_demo: true) + item_with_demo = create(:item, with_demo: true) + create_list(:item, 3, with_demo: false) # items without demo + + result = described_class.apply(relation: Item, filters_form: filters_form) + + expect(result.to_a).to eq [item_with_demo] + end + end end end diff --git a/spec/models/concerns/items/item_scopes_spec.rb b/spec/models/concerns/items/item_scopes_spec.rb index bcc7497..15ada11 100644 --- a/spec/models/concerns/items/item_scopes_spec.rb +++ b/spec/models/concerns/items/item_scopes_spec.rb @@ -54,6 +54,15 @@ end end + describe ".with_demo" do + it "returns items with demo" do + item_with_demo = create(:item, with_demo: true) + create(:item, with_demo: false) # item without demo + + expect(described_class.with_demo.to_a).to eq [item_with_demo] + end + end + describe ".pending_scrap" do let!(:not_scraped) { create(:item, last_scraped_at: nil) } let!(:scraped_long_ago) { create(:item, last_scraped_at: 25.hours.ago) }