Bem-vindo(a). Este é o desafio Back end!
O objetivo deste desafio é avaliar suas habilidades de programação. Quando sua solução estiver pronta, basta responder o e-mail que recebeu com o link do seu repo aqui no Github! Em seguida, enviaremos o feedback e as instruções dos próximos passos!
Caso tenha alguma dúvida, pode enviá-las em resposta ao e-mail que recebeu o teste. Bom desafio! Bom desafio!
⚠️ É importante que o seu repo esteja público, caso contrário não iremos conseguir avaliar sua resposta
Para deixar a jornada dos nossos alunos mais completa, a Rocketseat disponibiliza desafios que estimulam a prática do conteúdo estudado. Sabendo disso, este projeto consiste em implementar um serviço que gerencie os desafios enviados por nossos alunos.
Neste projeto, está incluído o corrections (serviço de correção das submissões) já pré-configurado, sua missão será implementar os fluxos de:
- Interação com Desafios e Submissões. (Criar, buscar, editar e remover);
 - Atualização das submissões utilizando a integração com o serviço corrections;
 
- Uma submissão de um desafio é enviada;
 - A submissão é registrada com o status 
Pending;⚠️ Caso não exista o desafio ou a url não seja um repositório do github a submissão é registrada com statusErrore um erro é retornado ao usuário, dando fim a esse fluxo;
 - O serviço corrections é notificado e retorna a correção da submissão;
 - O status e a nota da submissão são atualizados;
 
| Atributo | Tipo | 
|---|---|
| Identificador | uuidv4 | 
| Titulo | texto | 
| Descrição | texto | 
| Data de criação | data | 
Operações necessárias
- Criar
 - Remover
 - Editar
 -  Listar
- Paginação
 - Busca por título e descrição
 
 
| Atributo | Tipo | 
|---|---|
| Identificador | uuidv4 | 
| Identificador do desafio | uuidv4 | 
| Link para o reposítorio | texto | 
| Data de criação | data | 
| Status | Pending, Error, Done | 
| Nota | númerico | 
Operações necessárias
- Enviar
 -  Listar
- Filtros: desafio, intervalo de datas, status
 - Paginação
 
 
Além dos requisitos levantados acima, iremos olhar para os seguintes critérios durante a correção do desafio:
- Arquitetura (DDD, Clean Architecture)
 - Documentação (comente sobre decisões técnicas, escolhas, requisitos, etc)
 - Código limpo (utilização de princípios como DRY, KISS, SOLID, YAGNI)
 - Testes (unitários, e2e, etc)
 - Padrão de commits (Conventional)
 
- Utilizar Nest.js
 - Custom Scalar Types
 
Chegou a hora de colocar a mão na massa!
Neste projeto já incluímos alguns arquivos para a configuração do projeto.
Criamos um docker-compose que faz a configuração de 3 containers incluindo as credenciais (login do postgres, database, etc):
| Container | Ports | 
|---|---|
| Postgres | 5432:5432 | 
| Kafka | 9092:9092 | 
| Zookeper | 2181:2181 | 
Escolhemos o utilizar o Kafka para a comunicação com o serviço de corrections. Caso você utilize Nest.js, o mesmo possui uma integração completa com essa ferramenta.
Nas instruções do serviço de corrections estão especificados os tópicos e eventos que a aplicação deve utilizar.
A interação com os desafios e submissões deve ser feita via GraphQL, para isso deixamos uma sugestão das operações a serem criadas, porém sinta-se livre para modelar seu schema da melhor forma:
Query {
  challenges(...): [Challenge!]!
  answers(...): [Answer!]!
}
Mutation {
 createChallenge(...): Challenge!
 updateChallenge(...): Challenge!
 deleteChallenge(...): Challenge!
 answerChallenge(...): Answer!
}- Fazer o fork do projeto
 - Configurar ambiente de desenvolvimento (inclusive executar o serviço de corrections)
 - Criar uma API GraphQL com o contexto acima utilizando Typescript
 - Fazer a integração com o serviço de corrections através do Apache Kafka
 - Incluir no README as instruções de instalação do projeto
 
ℹ️ Sinta-se livre para incluir quaisquer observações que achar necessário
O desafio acima foi cuidadosamente construído para propósitos de avaliação apenas. Já possuimos uma funcionalidade similar na nossa plataforma.
Made with 💜 at Rocketseat

