{"id":15152625,"url":"https://github.com/renatorosafranco/pokeapi-challenge","last_synced_at":"2026-01-20T00:34:38.046Z","repository":{"id":195698809,"uuid":"693440229","full_name":"RenatoRosaFranco/pokeapi-challenge","owner":"RenatoRosaFranco","description":"🚀 RAILS | API | pokeapi challenge ZRP","archived":false,"fork":false,"pushed_at":"2023-09-22T21:28:51.000Z","size":90,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-07T11:20:03.268Z","etag":null,"topics":["api","challenge","code-challenge","pokemon-api","rails-api","ruby","rubyonrails"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RenatoRosaFranco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-19T03:21:15.000Z","updated_at":"2023-09-21T21:43:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"2ab20346-3aad-4ed9-a691-a75900f14279","html_url":"https://github.com/RenatoRosaFranco/pokeapi-challenge","commit_stats":null,"previous_names":["renatorosafranco/pokeapi-challenge"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RenatoRosaFranco%2Fpokeapi-challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RenatoRosaFranco%2Fpokeapi-challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RenatoRosaFranco%2Fpokeapi-challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RenatoRosaFranco%2Fpokeapi-challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RenatoRosaFranco","download_url":"https://codeload.github.com/RenatoRosaFranco/pokeapi-challenge/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640472,"owners_count":20971558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","challenge","code-challenge","pokemon-api","rails-api","ruby","rubyonrails"],"created_at":"2024-09-26T16:20:21.297Z","updated_at":"2026-01-20T00:34:38.007Z","avatar_url":"https://github.com/RenatoRosaFranco.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align='center'\u003e\n  \n  # LEIA-ME\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\n\u003cdiv align='center'\u003e\n\n  ![Sem título](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/ce5ebf11-9843-4b0a-b57f-985136fb9ee1)\n\n  \n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # ZRP Challenge\n\u003c/div\u003e\n\nChallenge desenvolvido como teste de conhecimento da empresa ZRP, no cenário sugerido, foi proposto o desenvolvimento de um\nend-point que consumirá uma API externa, assim trazendo so os dados interessantes a serem desenvolvidos em nossa api.\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n\n  # TECNOLOGIAS\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n\n  \u003cimg src=\"https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/8afbeb6b-ee1a-44bf-8dd0-324b8c60481b\" width=\"144\" height=\"144\" alt=\"image\"\u003e\n  \u003cimg src=\"https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/149cca4c-8dff-46c7-a41b-094699376f46\" width=\"114\" height=\"114\" alt=\"image\"\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # ARQUITETURA\n\u003c/div\u003e\n\nA arquitetura utilizada neste projeto consiste simplesmente em **4 Pilares principais**, O controller **(Pokemons)** responsavel por fazer a chamada\na API externa do **PokéAPI** através do interactor **FetchApiInteractor**, este interactor requisita o service de consulta a api externa chamado\nde **PokemonServiceApi**, que retorna ao controller a resposta da requisição e em caso de sucesso renderiza o serializer **(PokemonSerializer)** como camada \nde apresentação da estrutura da **response**, que apresenta apenas as **habilidades** do pokemon em um array ordenado por nome.\n\n\u003cbr\u003e\n\n![Captura de tela de 2023-09-19 02-06-15](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/93ec45ee-7a01-4441-9942-a94a47ce759a)\n\n\n\u003cbr\u003e\n\n#### EXEMPLO:\nDada a chamada:\n```\nhttp://localhost:3000/api/v1/pokemons/:nome_pokemon\nhttp://localhost:3000/api/v1/pokemons/charmander  # exemplo\n```\n\n\u003cbr\u003e\n\nA Resposta da API devera ser\n```\n{\n  \"abilities\": [\n    \"lightning-rod\",\n    \"static\"\n  ]\n}\n```\n\n\u003cbr\u003e\n\nA Api devera devolver essa estrutura contendo as habilidades do pokemon, sendo mostradas por ordem alfabética\nAbaixo uma lista para você realizar requisições para testar o endpoint com outros pokemons\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  | Pokemon    | \n  |------------|\n  | ditto      |\n  | venusaur   |   \n  | blastoise  | \n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # IMAGENS\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nAbaixo você pode acompanhar uma Screenshot de uma requisição realizada ao endpoint com o pokemon **Pikachu**\n\n\u003cbr\u003e\n\n### Pikachu\n![Captura de tela de 2023-09-19 00-58-08](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/37403de9-ee44-40ad-89bb-7eb223fb2196)\n\n### Charmander\n![Captura de tela de 2023-09-19 01-38-26](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/bee81746-8faa-415d-a181-fdc02a16c123)\n\n### Squirtle\n![Captura de tela de 2023-09-19 01-41-34](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/0c800e69-7447-4453-96f2-6aade08c81db)\n\n### Não encontrado (Frodo)\n![Captura de tela de 2023-09-19 01-47-31](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/721feb4a-bf81-4bb4-a634-16838383201e)\n\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n\n  # VERSÃO DO RUBY\n\u003c/div\u003e\n\n\u003cbr\u003e\n  \nEste projeto foi desenvolvido utilizando a **Versão** 3.0.0 do **Ruby**\n\n```\n3.2.0\n```\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # DEPENDENCIAS\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nPara instalar as dependencias do projeto, basta executar o comando abaixo em seu terminal na **pasta do projeto**.\n\n```\nbundle install\n```\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # CONFIGURAÇÕES\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nNo arquivo **.env** na raiz de seu projeto coloque o seguinte valor\n\n```\nAPI_URL=https://pokeapi.co/api/\n```\n\n\u003cbr\u003e\n\nA Variavel de ambiente **API_URL** é necessária para termos o ponto base da URL que utilizaremos\nda API do **PokéAPI** quando quisermos consultar os dados dos pokemons lá cadastrados, para montar\na nossa resposta.\n\n\u003cbr\u003e\n\nApós adicionar a env basta subir o servidor utilizando o comando abaixo:\n\n```\n  rails server -p 3000\n```\n\n\u003cdiv align='center'\u003e\n\n  # DOCKER\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nVocê pode executar esse projeto através do docker, é simples e prático, basta executas os comandos abaixo\nna pasta raiz do projeto, a mesma onde se encontram os arquivos **Dockerfile** e **docker-compose.yml**\n\n\u003cbr\u003e\n\n![Captura de tela de 2023-09-21 16-05-17](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/b5db9ce9-4702-4d59-83f4-811e174b02f6)\n\n\n\u003cbr\u003e\n\n```\n  docker-compose build --no-cache # make the build\n  docker-compose up               # Initialize containers\n  docker-compose down             # Remove containers\n```\n\n\n\u003cdiv align='center'\u003e\n\n  # TESTES\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nVocê pode rodar os testes automatizados apartir da pasta raiz do projeto utilizando o comando abaixo.\n\n```\nbundle exec rspec /spec/interactors/\nbundle exec rspec /spec/requests/\nbundle exec rspec /spec/\n```\n\n\u003cbr\u003e\n\n![Captura de tela de 2023-09-22 00-49-36](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/18ab7b37-b5f5-4088-bce6-47f30df155e8)\n\n\n\u003cbr\u003e\n\n\u003cdiv align='center'\u003e\n  \n  # CACHING\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nA API tem um caching operando na endpoint /pokemons, onde o usuário so fara a requisição apenas uma vez\npara um dado pokemon, sendo este resultado armazenado no Cache, se o usuário tentar requisitar informações\ndo mesmo pokemon novamente, a API não terá necessidade de realizar outra requisição, poderá utilizar os\ndados da requisição prévia, já armazenada.\n\n\u003cbr\u003e\n\nMódulo responsavel por implementar o cache na aplicação\n\n\u003cbr\u003e\n\n```\n# frozen_string_literal: true\n\nmodule Http\n  module Cache\n    class CacheService\n      attr_reader :logger, :cache\n\n      def initialize(logger, cache)\n        @logger = logger\n        @cache  = cache\n      end\n\n      def generate(suffix, name)\n        \"#{suffix}_#{name}\"\n      end\n\n      def read(cache_key)\n        logger.level = Logger::INFO\n        logger.write(:info, \"Cache key #{cache_key} readed\")\n        cache.read(cache_key)\n      rescue StandardError =\u003e e\n        logger.level = Logger::ERROR\n        logger.write(:error, \"Failed to read cache key #{cache_key}\")\n      end\n\n      def write(cache_key, serialized_object, expiration = 1.minute)\n        logger.level = Logger::INFO\n        logger.write(:info, \"Cache Key create for #{cache_key}\")\n        cache.write(cache_key, serialized_object, expires_in: expiration)\n      rescue StandardError =\u003e e\n        logger.level = Logger::ERROR\n        logger.write(:error, \"Failed to write cache key #{cache_key}\")\n      end\n    end\n  end\nend\n```\n\n\u003cbr\u003e\n\n**OBS**: Para ver o cache em pleno funcionamento no ambiente de desenvolvimento basta executar o comando\nabaixo antes de rodar o servidor:\n\n\u003cbr\u003e\n\n```\n  bin/rails dev:cache # Development mode is now being cached.\n```\n\nPara desativar o Cache basta executar o comando novamente e o console irá te retornar o seguinte resultado:\n\n```\n bin/rails dev:cache # Development mode is no longer being cached.\n```\n\n\u003cbr\u003e\n\n![Captura de tela de 2023-09-22 00-41-29](https://github.com/RenatoRosaFranco/pokeapi-challenge/assets/6882872/68f02916-8892-451f-adc1-3945ab5afefb)\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenatorosafranco%2Fpokeapi-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenatorosafranco%2Fpokeapi-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenatorosafranco%2Fpokeapi-challenge/lists"}