From 7de8594bf1d1cff1b2eb28ddee454251d1855a49 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Mon, 17 Apr 2023 23:46:56 -0700 Subject: [PATCH] Implement business logic for reading Guidebooks --- app/blueprints/api/v1/guidebook_blueprint.rb | 23 ++++++++++++ .../api/v1/guidebooks_controller.rb | 11 ++++++ app/controllers/api/v1/search_controller.rb | 20 ++++++++++ app/models/guidebook.rb | 37 +++++++++++++++++++ config/routes.rb | 3 ++ 5 files changed, 94 insertions(+) create mode 100644 app/blueprints/api/v1/guidebook_blueprint.rb create mode 100644 app/controllers/api/v1/guidebooks_controller.rb create mode 100644 app/models/guidebook.rb diff --git a/app/blueprints/api/v1/guidebook_blueprint.rb b/app/blueprints/api/v1/guidebook_blueprint.rb new file mode 100644 index 0000000..0306143 --- /dev/null +++ b/app/blueprints/api/v1/guidebook_blueprint.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Api + module V1 + class GuidebookBlueprint < ApiBlueprint + field :name do |book| + { + en: book.name_en, + ja: book.name_jp + } + end + + field :description do |book| + { + en: book.name_en, + ja: book.name_jp + } + end + + fields :granblue_id + end + end +end diff --git a/app/controllers/api/v1/guidebooks_controller.rb b/app/controllers/api/v1/guidebooks_controller.rb new file mode 100644 index 0000000..5d4cf8c --- /dev/null +++ b/app/controllers/api/v1/guidebooks_controller.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Api + module V1 + class GuidebooksController < Api::V1::ApiController + def all + render json: GuidebookBlueprint.render(Guidebook.all) + end + end + end +end diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index 336704f..0d94ae0 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -196,6 +196,26 @@ module Api }) end + def guidebooks + # Perform the query + books = if search_params[:query].present? && search_params[:query].length >= 2 + Guidebook.method("#{locale}_search").call(search_params[:query]) + else + Guidebook.all + end + + count = books.length + paginated = books.paginate(page: search_params[:page], per_page: SEARCH_PER_PAGE) + + render json: GuidebookBlueprint.render(paginated, + root: :results, + meta: { + count: count, + total_pages: total_pages(count), + per_page: SEARCH_PER_PAGE + }) + end + private def total_pages(count) diff --git a/app/models/guidebook.rb b/app/models/guidebook.rb new file mode 100644 index 0000000..581068a --- /dev/null +++ b/app/models/guidebook.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class Guidebook < ApplicationRecord + alias eql? == + + include PgSearch::Model + + pg_search_scope :en_search, + against: :name_en, + using: { + tsearch: { + prefix: true, + dictionary: 'simple' + } + } + + pg_search_scope :jp_search, + against: :name_jp, + using: { + tsearch: { + prefix: true, + dictionary: 'simple' + } + } + + def blueprint + GuidebookBlueprint + end + + def display_resource(book) + book.name_en + end + + def ==(other) + self.class == other.class && granblue_id === other.granblue_id + end +end diff --git a/config/routes.rb b/config/routes.rb index fe827c9..9218e0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -34,6 +34,7 @@ Rails.application.routes.draw do post 'search/weapons', to: 'search#weapons' post 'search/summons', to: 'search#summons' post 'search/job_skills', to: 'search#job_skills' + post 'search/guidebooks', to: 'search#guidebooks' get 'jobs', to: 'jobs#all' @@ -41,6 +42,8 @@ Rails.application.routes.draw do get 'jobs/:id/skills', to: 'job_skills#job' get 'jobs/:id/accessories', to: 'job_accessories#job' + get 'guidebooks', to: 'guidebooks#all' + get 'raids', to: 'raids#all' get 'weapon_keys', to: 'weapon_keys#all'