Globo.com: coding challenge
====================
Você deverá usar este repositório como o repo principal do projeto, i.e., todos os seus commits devem estar registrados aqui, pois queremos ver como você trabalha.
Devemos conseguir rodar seu código em um Mac OS X OU no Ubuntu;
Devemos ser capazes de executar o seu código no nosso ambiente local ou em uma VM ou máquina limpa com os seguintes comandos, ou algo similar:
git clone seu-repositorio
cd seu-repositorio
./configure # (ou algo similar)
make run # (ou algo similar)
Esses comandos devem ser o suficiente para configurar uma nova VM e rodar o seu programa. Considere que o meu usuário não é root, porém tem permissão de sudo. Podes considerar que temos instalado no meu sistema: Java, Python, Ruby ou Go. Qualquer outra dependência que precisarmos você deverá prover.
Registre tudo: testes que forem executados, ideias que gostaria de implementar se tivesse mais tempo (explique como você as resolveria, se houvesse tempo), decisões que forem tomadas e seus porquês, arquiteturas que forem testadas e os motivos de terem sido modificadas ou abandonadas. Crie um arquivo COMMENTS.md ou HISTORY.md no repositório para registrar essas reflexões e decisões.
=====================
Desenvolva um BFF que será consumido pelos clients apenas para montar a página abaixo:
Na raiz do projeto, você encontrará o serviço esportes-api
. Essa API possui 3 rotas que te fornecerão todos os dados necessários referentes a time, campeonatos e jogos de uma data. São elas:
GET /esportes/futebol/modalidades/futebol_de_campo/categorias/profissional/data/<DATA>/jogos/
- Retorna todas as informações e referências dos jogos da data pedida. Usar o formatoYYYY-MM-DD
. Considere que a API só entrega jogos do ano de 2019. Se não houver jogo na data solicitada, a API retornará 404.GET /equipes/<ID>
- Retorna todas as informações e referências da equipe. Se não existir uma equipe com o id informado, a API retornará 404.GET /esportes/futebol/modalidades/futebol_de_campo/categorias/profissional/campeonato/<ID>
- Retorna todas as informações e referências do campeonato.Se não existir um campeonato com o id informado, a API retornará 404.
- Você NÃO DEVE alterar nenhum código dessa API. Sua relação com essa API é apenas de cliente.
- Para subir o serviço basta executar o seguinte comando:
cd esportes-api && yarn && yarn start
(ou npm). A API pode ser acessada via127.0.0.1:8080
- A API retorna sempre uma estrutura de payload que contém
resultados
ereferencias
. As referências são complementos dos dados de resultado e podem ser muito úteis. - Todo jogo pertence a uma fase de um campeonato que, por sua vez, pertence a uma edição de campeonato que, finalmente, pertence a um campeonato. É correto considerar o seguinte fluxo de relação/navegação entre jogos e campeonatos:
Jogo -> fase -> edição -> campeonato
. Ex:Jogo 123 é da Fase Semifinal da Edição Libertadores 2019 do Campeonato Taça Libertadores
- Essa API não foi arquitetada para receber uma alta carga de requests por segundo e a API que você irá construir será chamada diretamente pelo frontend por uma página que recebe em média 1k requests por segundo.
- Sobrecarregar a
esportes-api
pode resultar na sua queda ocasionando errors para outros clientes desta API o que pode gerar um problema em todo portal do GE. - As rotas da
esportes-api
podem apresentar lentidões resultando em tempos de resposta de 2 segundos ou mais. - A API só possui jogos cadastrados para datas do ano de 2019.
============================
- Sua API deverá fornecer uma rota onde os clients conseguem pegar todas as informações necessárias pra montar a agenda de um dia.
Ex: GET
/agenda/2019-08-19
-> o payload retornado deve ser suficiente pra montar uma página como a da imagem acima. - Os front-ends deverão ser capazes de receber todos os dados necessários pra montar a página fazendo apenas um request pra sua API.
- Múltiplos front-ends (apps iOS e Android e a página Web) serão clientes da sua API e terão telas extremamente parecidas e com as mesmas regras de negócio. Considere abstrações na sua API que evitem dos clients precisarem codar a mesma regra de negócio nas 3 plataformas por exemplo.
- Jogos em um dia podem variar entre diferentes momentos (Já ocorreram, estão ocorrendo ou irão ocorrer). As equipes de front-end sinalizaram que seria legal conseguir saber de uma maneira simples os jogos de cada momento. Considere que um jogo leva 2 horas para acabar.
- A página de agenda, somando as 3 plataformas, recebe normalmente um grande número de acessos num curto espaço de tempo. Seria legal ter um teste garantindo que a API está pronta pra receber essa carga, e por razões práticas, podemos considerar 1000 requests/seg como baseline de performance desse teste.
- Considere que o seu BFF será utilizado única e exclusivamente por essa feature de Agenda porém por pelo menos 3 front-ends diferentes. Tornar a vida dos seus clients mais fácil é uma boa idéia :)
(Opcional) Conforme dito anteriormente, você tem liberdade de definir a linguagem de programação que quiser. Porém, apenas caso se sinta confortável, usar Golang pode ser uma boa ideia :)
(Opcional|Bônus) Pode existir um cenário onde a
esportes-api
comece a responder muitos errors em um intervalo de tempo. Pode ser uma boa ideia pensar em algum mecanismo para evitar de onerarmos ainda mais o serviço.
O projeto deve estar "pronto para produção" em termos de:
- Formatação e estruturação do código;
- Performance;
- Segurança.
Envie as instruções necessárias para rodar o projeto localmente, incluindo todas as dependências. Devemos ser capazes de executar o seu código em uma VM ou máquina limpa com os seguintes comandos, ou algo similar:
===============================================
- As funcionalidades listadas anteriormente devem estar presentes na sua solução.
- Seu código será observado por uma equipe de desenvolvedores que avaliarão a simplicidade e clareza da solução, a arquitetura, documentação, estilo de código, testes automatizados, o design e a implementação do código.
=============
- Você pode usar ferramentas e bibliotecas open source, mas documente as decisões e os porquês. Considere que queremos entender a forma como você resolveria o problema, portanto, terceirizar para libs suas regras de negócio pode não ser uma boa ideia;
- Automatize tudo que for possível;
- Se sentir que poderia ter feito algo de uma forma melhor porém o tempo não permitiu, fique a vontade para criar um arquivo
.md
e compartilhar essas ideias; - Em caso de dúvidas, pergunte.