From 08dc03658d7062ecc51128bff24cad17db7f0b63 Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Thu, 27 Jun 2024 23:23:59 -0300 Subject: [PATCH 1/2] Adding service to api --- app/controllers/pokemons_controller.rb | 69 ++++++++++++++------------ app/services/pokemons_service.rb | 38 ++++++++++++++ 2 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 app/services/pokemons_service.rb diff --git a/app/controllers/pokemons_controller.rb b/app/controllers/pokemons_controller.rb index c3b2bbb..507f33a 100644 --- a/app/controllers/pokemons_controller.rb +++ b/app/controllers/pokemons_controller.rb @@ -4,12 +4,12 @@ class PokemonsController < ApplicationController before_action :authenticate_user! def create - @pokemon = Pokemon.new(pokemon_params) - if @pokemon.save - render json: @pokemon, status: :created - else - render json: @pokemon.errors, status: :unprocessable_entity - end + @pokemon = Pokemon.new(pokemon_params) + if @pokemon.save + render json: @pokemon, status: :created + else + render json: @pokemon.errors, status: :unprocessable_entity + end end def search @@ -21,38 +21,37 @@ def list render json: Pokemon.all end - def update - if @pokemon.update(pokemon_params) - render json: @pokemon - else - render json: @pokemon.errors, status: :unprocessable_entity - end - end + def update + if @pokemon.update(pokemon_params) + render json: @pokemon + else + render json: @pokemon.errors, status: :unprocessable_entity + end + end - def destroy - @pokemon.destroy - render json: { message: 'Pokemon was successfully destroyed.' } - end + def destroy + @pokemon.destroy + render json: { message: 'Pokemon was successfully destroyed.' } + end - def fetch_all_pokemon_data - response = HTTParty.get("#{POKEMON_API}?limit=10000") - if response.code == 200 - render json: JSON.parse(response.body) - end - end + def fetch_all_pokemon_data + response = pokemons_service.fetch_pokemon + render json: response + end - def species - name = params[:name] - data = fetch_pokemon_species_data(name) - if data[:error] - render json: { error: data[:error] }, status: :not_found - else - description = find_english_description(data) - render json: { description: description } - end - end + def species + name = params[:name] + data = fetch_pokemon_species_data(name) + if data[:error] + render json: { error: data[:error] }, status: :not_found + else + description = find_english_description(data) + render json: { description: description } + end + end private + def fetch_pokemon_data(pokemon_name) response = HTTParty.get("#{POKEMON_API}/#{pokemon_name}") if response.code == 200 @@ -87,4 +86,8 @@ def set_pokemon def pokemon_params params.require(:pokemon).permit(:nome, :tipo, :imagem, moves: []) end + + def pokemons_service + PokemonsService + end end diff --git a/app/services/pokemons_service.rb b/app/services/pokemons_service.rb new file mode 100644 index 0000000..cdde6a7 --- /dev/null +++ b/app/services/pokemons_service.rb @@ -0,0 +1,38 @@ +class PokemonsService + POKEMON_API = "https://pokeapi.co/api/v2/pokemon" + API = false + + def self.fetch_pokemon + if API + fetch_all_pokemon_data_from_url + else + fetch_all_pokemon_data_from_db + end + end + + private + + def self.fetch_all_pokemon_data_from_url + response = HTTParty.get("#{POKEMON_API}?limit=10000") + if response.code == 200 + JSON.parse(response.body) + end + end + + def self.fetch_all_pokemon_data_from_db + pokemons = Pokemon.all + count = pokemons.count + pokemon_data = pokemons.map do |pokemon| + { + "name" => pokemon.nome, + "url" => pokemon.imagem + } + end + { + "count" => count, + "next" => nil, + "previous" => nil, + "results" => pokemon_data + } + end +end From efb9a8584a162dea44b039d8ab5822267f6ca92e Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Fri, 28 Jun 2024 11:47:39 -0300 Subject: [PATCH 2/2] Structures to repositories and presenters --- app/controllers/pokemons_controller.rb | 4 +-- app/presenters/pokemons_presenter.rb | 12 +++++++ app/repositories/pokemons_api_repository.rb | 17 ++++++++++ app/repositories/pokemons_repository.rb | 30 +++++++++++++++++ app/services/pokemons_service.rb | 37 +++------------------ 5 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 app/presenters/pokemons_presenter.rb create mode 100644 app/repositories/pokemons_api_repository.rb create mode 100644 app/repositories/pokemons_repository.rb diff --git a/app/controllers/pokemons_controller.rb b/app/controllers/pokemons_controller.rb index 507f33a..7724698 100644 --- a/app/controllers/pokemons_controller.rb +++ b/app/controllers/pokemons_controller.rb @@ -35,7 +35,7 @@ def destroy end def fetch_all_pokemon_data - response = pokemons_service.fetch_pokemon + response = pokemons_service.all_pokemons render json: response end @@ -88,6 +88,6 @@ def pokemon_params end def pokemons_service - PokemonsService + PokemonsService.new(PokemonsApiRepository.new) end end diff --git a/app/presenters/pokemons_presenter.rb b/app/presenters/pokemons_presenter.rb new file mode 100644 index 0000000..16c8f6a --- /dev/null +++ b/app/presenters/pokemons_presenter.rb @@ -0,0 +1,12 @@ +class PokemonsPresenter + def initialize(pokemon) + @pokemon = pokemon + end + + def as_json + { + name: @pokemon.nome, + url: @pokemon.imagem + } + end + end \ No newline at end of file diff --git a/app/repositories/pokemons_api_repository.rb b/app/repositories/pokemons_api_repository.rb new file mode 100644 index 0000000..4694912 --- /dev/null +++ b/app/repositories/pokemons_api_repository.rb @@ -0,0 +1,17 @@ +class PokemonsApiRepository + POKEMON_API = "https://pokeapi.co/api/v2/pokemon" + + attr_reader :url, :limit + + def initialize(limit = 10000) + @url = POKEMON_API + @limit = limit + end + + def fetch_all_as_json + response = HTTParty.get("#{url}?limit=#{limit}") + if response.code == 200 + response.body + end + end +end diff --git a/app/repositories/pokemons_repository.rb b/app/repositories/pokemons_repository.rb new file mode 100644 index 0000000..373e115 --- /dev/null +++ b/app/repositories/pokemons_repository.rb @@ -0,0 +1,30 @@ +class PokemonsRepository + require_relative "../presenters/pokemons_presenter" + + def initialize(model = Pokemon) + @model = model + @presenter = ::PokemonsPresenter + end + + def fetch_all_as_json + pokemons = all + { + count: pokemons.count, + next: nil, + previous: nil, + results: pokemons.map { |pokemon| @presenter.new(pokemon).as_json }, + }.to_json + end + + def all + @model.all + end + + def find_by_name(name) + @model.find_by(nome: name) + end + + def find_by_id(id) + @model.find(id) + end +end diff --git a/app/services/pokemons_service.rb b/app/services/pokemons_service.rb index cdde6a7..828308e 100644 --- a/app/services/pokemons_service.rb +++ b/app/services/pokemons_service.rb @@ -1,38 +1,11 @@ class PokemonsService - POKEMON_API = "https://pokeapi.co/api/v2/pokemon" - API = false - def self.fetch_pokemon - if API - fetch_all_pokemon_data_from_url - else - fetch_all_pokemon_data_from_db - end + def initialize(repository = PokemonsRepository.new) + @repository = repository end - private - - def self.fetch_all_pokemon_data_from_url - response = HTTParty.get("#{POKEMON_API}?limit=10000") - if response.code == 200 - JSON.parse(response.body) - end - end + def all_pokemons + JSON.parse(@repository.fetch_all_as_json) + end - def self.fetch_all_pokemon_data_from_db - pokemons = Pokemon.all - count = pokemons.count - pokemon_data = pokemons.map do |pokemon| - { - "name" => pokemon.nome, - "url" => pokemon.imagem - } - end - { - "count" => count, - "next" => nil, - "previous" => nil, - "results" => pokemon_data - } - end end