{"id":27443813,"url":"https://github.com/renanjava/overwatch2-hero-picker","last_synced_at":"2025-10-24T14:03:15.206Z","repository":{"id":287949347,"uuid":"966295543","full_name":"renanjava/overwatch2-hero-picker","owner":"renanjava","description":"Projeto Pessoal - Favoritar heróis do Overwatch 2","archived":false,"fork":false,"pushed_at":"2025-04-14T23:10:08.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-15T02:49:26.349Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"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/renanjava.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,"zenodo":null}},"created_at":"2025-04-14T17:48:52.000Z","updated_at":"2025-04-14T23:10:11.000Z","dependencies_parsed_at":"2025-04-14T20:23:02.008Z","dependency_job_id":"fa3ecce4-829c-4341-8f4f-025cad550436","html_url":"https://github.com/renanjava/overwatch2-hero-picker","commit_stats":null,"previous_names":["renanjava/overwatch2-hero-picker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Foverwatch2-hero-picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Foverwatch2-hero-picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Foverwatch2-hero-picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Foverwatch2-hero-picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/renanjava","download_url":"https://codeload.github.com/renanjava/overwatch2-hero-picker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248997086,"owners_count":21195797,"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":[],"created_at":"2025-04-15T02:49:30.002Z","updated_at":"2025-10-24T14:03:15.200Z","avatar_url":"https://github.com/renanjava.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://via.placeholder.com/150\" alt=\"Overwatch Logo\" /\u003e\r\n\u003ch1\u003eOverwatch2 Hero Picker\u003c/h1\u003e\r\n\u003cp\u003e\r\n  \u003cstrong\u003eOverwatch2 Hero Picker\u003c/strong\u003e é uma API RESTful projetada para fãs de \u003cem\u003eOverwatch 2\u003c/em\u003e, permitindo que jogadores criem perfis e marquem seus heróis favoritos. A aplicação consome uma API não oficial do \u003cem\u003eOverwatch\u003c/em\u003e para obter dados atualizados de heróis (como nome, função, etc.) e os armazena automaticamente em um banco SQLite ao iniciar. Jogadores podem registrar perfis e associar heróis favoritos, com validação robusta de dados via Yup e gerenciamento de banco via Sequelize, garantindo uma experiência confiável e personalizada.\r\n\u003c/p\u003e\r\n\u003ch2\u003eFuncionalidades\u003c/h2\u003e\r\n\u003cul\u003e\r\n  \u003cli\u003e\u003cstrong\u003eIntegração com API do Overwatch\u003c/strong\u003e: Consome uma API não oficial para buscar informações de heróis, como Tracer, Reinhardt ou Mercy.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eGerenciamento de Jogadores\u003c/strong\u003e: Criação e consulta de perfis de jogadores com informações básicas (ex.: ID, nome).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eFavoritagem de Heróis\u003c/strong\u003e: Jogadores podem adicionar heróis à sua lista de favoritos, associando-os ao seu perfil.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eValidação de Dados\u003c/strong\u003e: Usa Yup para validar DTOs (Data Transfer Objects) em requisições, garantindo que entradas como IDs sejam válidas (ex.: números inteiros positivos).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003ePersistência com SQLite\u003c/strong\u003e: Armazena jogadores, heróis e favoritos em um banco relacional, gerenciado pelo Sequelize.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eAPI RESTful\u003c/strong\u003e: Oferece endpoints como \u003ccode\u003ePOST /players\u003c/code\u003e, \u003ccode\u003ePOST /favorites\u003c/code\u003e e \u003ccode\u003eGET /players/:id/favorites\u003c/code\u003e para interagir com o sistema.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003ePaginamento, Filtro e Ordenação\u003c/strong\u003e: Implementação de funcionalidades para paginar, filtrar e ordenar heróis e favoritos.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch2\u003eTecnologias Utilizadas\u003c/h2\u003e\r\n\u003cul\u003e\r\n  \u003cli\u003e\u003cstrong\u003eNode.js/Express\u003c/strong\u003e: Framework para criar a API RESTful, gerenciando rotas e requisições.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eJavaScript\u003c/strong\u003e: Linguagem principal, usada em todo o projeto para compatibilidade.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eSequelize\u003c/strong\u003e: ORM para gerenciar o banco SQLite, incluindo migrations e sincronização de dados.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eSQLite\u003c/strong\u003e: Banco de dados leve para armazenar jogadores, heróis e favoritos.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eYup\u003c/strong\u003e: Biblioteca de validação para garantir a integridade dos DTOs.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003eAxios\u003c/strong\u003e: Cliente HTTP para consumir a API não oficial do \u003cem\u003eOverwatch\u003c/em\u003e.\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003edotenv\u003c/strong\u003e: Gerenciamento de variáveis de ambiente (ex.: URL da API externa).\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch2\u003ePré-requisitos\u003c/h2\u003e\r\n\u003cp\u003eAntes de começar, certifique-se de ter instalado:\u003c/p\u003e\r\n\u003cul\u003e\r\n  \u003cli\u003e\u003ca href=\"https://nodejs.org/\"\u003eNode.js\u003c/a\u003e (v16 ou superior)\u003c/li\u003e\r\n  \u003cli\u003e\u003ca href=\"https://www.npmjs.com/\"\u003enpm\u003c/a\u003e (incluído com Node.js)\u003c/li\u003e\r\n  \u003cli\u003e\u003ca href=\"https://www.sqlite.org/\"\u003eSQLite\u003c/a\u003e (opcional, Sequelize gerencia o arquivo do banco)\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch2\u003eInstalação\u003c/h2\u003e\r\n\u003col\u003e\r\n  \u003cli\u003e\r\n    \u003cp\u003e\u003cstrong\u003eClone o repositório\u003c/strong\u003e:\u003c/p\u003e\r\n    \u003cpre\u003e\u003ccode\u003egit clone https://github.com/seu-usuario/overwatch2-hero-picker.git\r\ncd overwatch2-hero-picker\u003c/code\u003e\u003c/pre\u003e\r\n  \u003c/li\u003e\r\n  \u003cli\u003e\r\n    \u003cp\u003e\u003cstrong\u003eInstale as dependências\u003c/strong\u003e:\u003c/p\u003e\r\n    \u003cpre\u003e\u003ccode\u003enpm install\u003c/code\u003e\u003c/pre\u003e\r\n  \u003c/li\u003e\r\n  \u003cli\u003e\r\n    \u003cp\u003e\u003cstrong\u003eConfigure as variáveis de ambiente\u003c/strong\u003e:\u003c/p\u003e\r\n    \u003cp\u003eCrie um arquivo \u003ccode\u003e.env\u003c/code\u003e na raiz com base no \u003ccode\u003e.env.example\u003c/code\u003e:\u003c/p\u003e\r\n    \u003cpre\u003e\u003ccode\u003ePORT=3000\r\nAPI_OVERWATCH_URL=https://api-externa-overwatch.com/heroes\r\nDATABASE_URL=sqlite:./database.sqlite\u003c/code\u003e\u003c/pre\u003e\r\n    \u003cp\u003eSubstitua \u003ccode\u003eAPI_OVERWATCH_URL\u003c/code\u003e pela URL real da API não oficial.\u003c/p\u003e\r\n  \u003c/li\u003e\r\n  \u003cli\u003e\r\n    \u003cp\u003e\u003cstrong\u003eExecute as migrations\u003c/strong\u003e:\u003c/p\u003e\r\n    \u003cp\u003eCrie as tabelas no SQLite:\u003c/p\u003e\r\n    \u003cpre\u003e\u003ccode\u003enpx sequelize-cli db:migrate\u003c/code\u003e\u003c/pre\u003e\r\n  \u003c/li\u003e\r\n  \u003cli\u003e\r\n    \u003cp\u003e\u003cstrong\u003eInicie o servidor\u003c/strong\u003e:\u003c/p\u003e\r\n    \u003cpre\u003e\u003ccode\u003enpm run dev\u003c/code\u003e\u003c/pre\u003e\r\n    \u003cp\u003eA API estará disponível em \u003ccode\u003ehttp://localhost:3000\u003c/code\u003e. Na inicialização, o sistema consumirá a API do \u003cem\u003eOverwatch\u003c/em\u003e, sincronizará os heróis no banco e estará pronto para uso.\u003c/p\u003e\r\n  \u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003eEndpoints Principais\u003c/h2\u003e\r\n\u003ctable\u003e\r\n  \u003ctr\u003e\r\n    \u003cth\u003eMétodo\u003c/th\u003e\r\n    \u003cth\u003eEndpoint\u003c/th\u003e\r\n    \u003cth\u003eDescrição\u003c/th\u003e\r\n    \u003cth\u003eExemplo de Body\u003c/th\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003ePOST\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e/players\u003c/code\u003e\u003c/td\u003e\r\n    \u003ctd\u003eCria um novo jogador\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e{ \"name\": \"Player1\" }\u003c/code\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003eGET\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e/players/:id\u003c/code\u003e\u003c/td\u003e\r\n    \u003ctd\u003eRetorna os dados de um jogador\u003c/td\u003e\r\n    \u003ctd\u003e-\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003ePOST\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e/favorites\u003c/code\u003e\u003c/td\u003e\r\n    \u003ctd\u003eAdiciona um herói favorito\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e{ \"userId\": 1, \"heroId\": 1 }\u003c/code\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003eGET\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e/players/:id/favorites\u003c/code\u003e\u003c/td\u003e\r\n    \u003ctd\u003eLista os heróis favoritos de um jogador\u003c/td\u003e\r\n    \u003ctd\u003e-\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd\u003eGET\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e/heroes\u003c/code\u003e\u003c/td\u003e\r\n    \u003ctd\u003eLista heróis com paginação, filtro e ordenação\u003c/td\u003e\r\n    \u003ctd\u003e\u003ccode\u003e{ \"page\": 1, \"pageSize\": 10, \"filter\": \"tank\", \"sortBy\": \"name\", \"sortOrder\": \"asc\" }\u003c/code\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n\u003c/table\u003e\r\n\u003ch3\u003eParâmetros de Paginação, Filtro e Ordenação\u003c/h3\u003e\r\n\u003cul\u003e\r\n  \u003cli\u003e\u003cstrong\u003epage\u003c/strong\u003e: Página atual (opcional, padrão: 1).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003epageSize\u003c/strong\u003e: Número de itens por página (opcional, padrão: 10).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003efilter\u003c/strong\u003e: Filtro para a função do herói (opcional, valores: \u003ccode\u003etank\u003c/code\u003e, \u003ccode\u003edps\u003c/code\u003e, \u003ccode\u003esupport\u003c/code\u003e).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003esortBy\u003c/strong\u003e: Campo para ordenação (opcional, valores: \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003erole\u003c/code\u003e).\u003c/li\u003e\r\n  \u003cli\u003e\u003cstrong\u003esortOrder\u003c/strong\u003e: Direção da ordenação (opcional, valores: \u003ccode\u003easc\u003c/code\u003e, \u003ccode\u003edesc\u003c/code\u003e, padrão: \u003ccode\u003easc\u003c/code\u003e).\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch3\u003eExemplo de Requisição com Filtro, Paginação e Ordenação\u003c/h3\u003e\r\n\u003cpre\u003e\u003ccode\u003ecurl -X GET \"http://localhost:3000/heroes?page=1\u0026pageSize=10\u0026filter=tank\u0026sortBy=name\u0026sortOrder=asc\"\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003e\u003cstrong\u003eResposta:\u003c/strong\u003e\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003e{\r\n  \"page\": 1,\r\n  \"pageSize\": 10,\r\n  \"total\": 50,\r\n  \"heroes\": [\r\n    {\r\n      \"id\": 1,\r\n      \"name\": \"Reinhardt\",\r\n      \"role\": \"tank\"\r\n    },\r\n    {\r\n      \"id\": 2,\r\n      \"name\": \"Winston\",\r\n      \"role\": \"tank\"\r\n    }\r\n  ]\r\n}\u003c/code\u003e\u003c/pre\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanjava%2Foverwatch2-hero-picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenanjava%2Foverwatch2-hero-picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanjava%2Foverwatch2-hero-picker/lists"}