O desafio é construir uma API Rest que seja capaz de cadastrar, buscar, atualizar e apagar os jogadores. Ela deverá ser capaz de consultar a Api da Riot Games para trazer os dados dos jogadores que serão cadastrados em uma base de dados.
Lista dos jogadores a serem cadastrados:
- OldWolfKing
- Praymer
- ThrekSor
- AndrewDiass
- BiliBoss
- DartSecond
- Devils Advocate
- Gabrvxo
- theKovac
- zRabelo
Para consumir a API é necessário criar uma conta na plataforma e ler a documentação. Os endpoints que serão usados nesse projeto requerem autenticação e é possivel gerar um token com tempo de expiração para poder estar consumindo esse serviço.
Deve ser construido a tabela Summoner no banco de dados com essas colunas
Id | Nickname | AccountId | SummonerLevel | ProfileIconId | SummonerId | userId |
---|---|---|---|---|---|---|
1 | Old Wolf King | V94KgBnbbsaR4I4 | 100 | 4864 | OtaV_QBRbtzt7DtpZn | 1 |
2 | Wolf Old King | bsaR4I4V94KgBnb | 150 | 4684 | FtaZ_QBRbtzt7DtpZn | 2 |
3 | King Old Wolf | 4I4V94KgbsaRBnb | 500 | 4648 | GtaT_QBRbtzt7DtpZn | 3 |
O ID do pode ser tanto UUID ou numérico incremental
- userId => chave estrangeira com o "id" da tabela User
- accountId => unique
- summonerId => unique
- nickname => obrigatorio preencher
Deve ser construido a tabela User no banco de dados com essas colunas
Id | Name | Password | |
---|---|---|---|
1 | Gabriel | [email protected] | 6RdShg1qV2ZAp9LJJKeIcCDhatpEXiBdKCnK41AX7ws= |
O ID do pode ser tanto UUID ou numérico incremental
- id => chave estrangeira com o "userId" da tabela Summoner
- email => unique
- name => obrigatorio preencher
- password => obrigatorio preencher
Deve possuir uma rota POST para cadastrar um USUÁRIO, deverá receber os seguintes dados no corpo da requisição:
Body
{
"name": "gabriel",
"email": "[email protected]",
"password": "1213141516",
}
Status Code 201
{
"id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM",
"name":"gabriel",
"email":"[email protected]",
"password":"6RdShg1qV2ZAp9LJJKeIcCDhatpEXiBdKCnK41AX7ws=",
}
Deve possuir uma rota POST para retorna um token de acesso que expira em 24h, com esse token deve ser possivel acessar os endpoints a seguir:
Body
{
"name": "gabriel",
"email": "[email protected]",
"password": "1213141516",
}
Status Code 200
{
"token":"6RdShg1qV2ZApeIcCDhatpEXiBdKCnK41AX79LJJKeIcCDhatpEXiBdKCnK41AX7ws="
}
Para consumir essa rota é necessario enviar um bearer token valido, e o userId vai ser consumido do token.
Deve possuir uma rota POST para cadastrar um SUMMONER, deverá receber os seguintes dados no corpo da requisição:
Body
{
"summonerName":"OldWolfKing"
}
A rota deve consumir o SummonerName do corpo e usar para consultar no end point abaixo da API riotgames as informações AccountId, SummonerLevel, ProfileIconId e Id.
/lol/summoner/v4/summoners/by-name/{summonerName}?api_key={token}
{
"id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM",
"accountId": "V94KgBnbbsaR4I4MXXX4trfyvUay95h_13PCsTz6jo4ByBw",
"puuid": "5LwdLcx1qM2_E-1NNFTBRDgTK6oqvc3XXXmbC4gqNauImdGCIm3WM2RZLBNcIyui-sXc2Q",
"name": "Old Wolf King",
"profileIconId": 4864,
"revisionDate": 1613316510000,
"summonerLevel": 225
}
E com esses dados fazer o cadastro do jogador no banco de dados.
Para consumir essa rota é necessario enviar um bearer token valido.
Deve possuir uma rota GET para listar as informações da tabela Summoner, modelo esperado do retorno abaixo:
Status Code 200
[
{
id: "1",
nickname: "Old Wolf King",
accountId: "V94KgBnbbsaR4I4",
summonerLevel: "100",
profileIconId: "4864",
summonerId: "V94KgBnbbsaR4I4",
},
{
id: "2",
nickname: "Old Wolf King",
accountId: "bsaR4I4V94KgBnb",
summonerLevel: "150",
profileIconId: "4684",
summonerId: "V94KgBnbbsaR4I4",
},
{
id: "3",
nickname: "Old Wolf King",
accountId: "4I4V94KgbsaRBnb",
summonerLevel: "500",
profileIconId: "4648",
summonerId: "V94KgBnbbsaR4I4",
},
];
Para consumir essa rota é necessario enviar um bearer token valido.
Deve possuir uma rota GET que ira além de trazer as informações da tabela ira trazer as quantidades de vitorias e derrotas de cada jogador, e deve ser possivel passar alguns campos para filtrar o resultado retornado:
* Nickname * SummonerLevel * Vitorias * Derrotas
Status Code 200
[
{
id: "1",
nickname: "Old Wolf King",
accountId: "V94KgBnbbsaR4I4",
summonerLevel: "100",
profileIconId: "4864",
summonerId: "V94KgBnbbsaR4I4",
wins: 2,
losses: 100,
},
{
id: "2",
nickname: "Old Wolf King",
accountId: "bsaR4I4V94KgBnb",
summonerLevel: "150",
profileIconId: "4684",
summonerId: "V94KgBnbbsaR4I4",
wins: 12,
losses: 3,
},
{
id: "3",
nickname: "Old Wolf King",
accountId: "4I4V94KgbsaRBnb",
summonerLevel: "500",
profileIconId: "4648",
summonerId: "V94KgBnbbsaR4I4",
wins: 7,
losses: 7,
},
];
Para trazer essas informações, consuma o endpoint da riotgames abaixo, ele retorna um array de objetos com os dados de um jogador com base no encryptedSummonerId enviado e cada objeto possui as propriedades wins e losses:
/lol/league/v4/entries/by-summoner/{encryptedSummonerId}?api_key={token}
response
[
{
leagueId: "469c392c-063c-XXbca8-6c4c7c4d21d4",
queueType: "RANKED_SOLO_5x5",
tier: "SILVER",
rank: "I",
summonerId: "OtaV_QBRbtzt7DtpZnLXXXbvRjuDmDRZJ38wjbEQOqXbM",
summonerName: "Old Wolf King",
leaguePoints: 39,
wins: 12,
losses: 3,
veteran: false,
inactive: false,
freshBlood: false,
hotStreak: false,
},
{
leagueId: "0f276adb-9984-XXfdc-7d5fc5fc35d5",
queueType: "RANKED_FLEX_SR",
tier: "SILVER",
rank: "I",
summonerId: "OtaV_QBRbtzt7DtpZXXbvRjuDmDRZJ38wjbEQOqXbM",
summonerName: "Old Wolf King",
leaguePoints: 8,
wins: 7,
losses: 6,
veteran: false,
inactive: false,
freshBlood: false,
hotStreak: false,
},
];
Deve ser feito a somatória das vitórias e derrotas de cada objeto do array, lembrando que deve ser executado para cada jogador da tabela.
Para consumir essa rota é necessario enviar um bearer token valido.
Deve possuir uma rota PUT para atualizar somente o summonerName e summonerLevel do jogador através do ID:
Body
{
"summonerName":"OldWolfKingMaster",
"summonerLevel": 550
}
Status Code 200
{
"id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM",
"accountId": "V94KgBnbbsaR4I4MXXX4trfyvUay95h_13PCsTz6jo4ByBw",
"puuid": "5LwdLcx1qM2_E-1NNFTBRDgTK6oqvc3XXXmbC4gqNauImdGCIm3WM2RZLBNcIyui-sXc2Q",
"name": "OldWolfKingMaster",
"profileIconId": 4864,
"revisionDate": 1613316510000,
"summonerLevel": 550
}
Para consumir essa rota é necessario enviar um bearer token valido.
Deve possuir uma rota DELETE para apagar o jogador através do ID:
Status Code 200
{
"message": "successfully deleted"
}
Para consumir essa rota é necessario enviar um bearer token valido.
Deve possuir uma rota POST que gera uma XLSX com todos os summoners cadastrados no banco de dados, com as quantidades de vitorias e derrotas.
- API deve ser desenvolvida em NodeJs;
- Deve ser implementado testes que garantam que todas as rotas da API estejam funcionando
- As rotas que manipulam a tabela Summoner deve ser necessario passar um token de autenticação
Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura da API.
- Uso do Git
- Arquitetura da API
- Diferencial: NestJS ou Postgres
- A qualidade do código
- As decisões que você fez para resolver o desafio
- Tratamento de erros
- Farça um fork deste repositório;
- Clone seu fork na sua máquina;
- Crie um novo branch com o seguinte padrão "challenge/seu-nome";
- Resolva o desafio;
- Faça uma PR para este repositório com instruções claras de como executar seu código.
Sua PR será avaliada e lhe daremos um feedback o mais rápido possível.
Resposta: Não só pode como será um diferencial
Resposta: Esperamos sua resposta em até 7 dias
Resposta: Qualquer um, sendo o Postgres ou Mongodb um diferencial