Skip to content

Latest commit

 

History

History
183 lines (103 loc) · 6.22 KB

CHALLENGE.md

File metadata and controls

183 lines (103 loc) · 6.22 KB

💻 O Problema

Um cliente da Bankme solicitou uma nova funcionalidade, relacionada a recebíveis.

Todos os dias esse cliente movimenta vários recebíveis, e nosso time de operações estava ficando maluco tendo que cadastrar tudo isso de forma manual!

Os recebíveis são representações digitais de um documento que simula uma dívida a ser recebida. E para Bankme, é importante ter essas informações como parte do fluxo comercial que temos com este cliente.

Estrutura de um recebível

CAMPO TIPO DESCRIÇÃO
id string (UUID) É a identificação de um recebível.
value float É o valor do recebível.
emissionDate date É a data de emissão do recebível.
assignor string (UUID) Representa a identificação de um cedente.

Estrutrua de um cedente

CAMPO TIPO DESCRIÇÃO
id string (UUID) É a identificação de um cedente.
document string(30) É o documento CPF ou CNPJ do cedente.
email string(140) É o email do cedente.
phone string(20) É o telefone do cedente.
name string(140) É a nome ou razão social do cedente.

💾 Back-end

Nível 1 - Validação

Implemente uma API utilizando NestJS que receba dados de um recebível e de um cedente.

A rota para este cadastro é:

POST /integrations/payable

Essa rota deverá receber todas as informações. É importante garantir a validação destes dados:

  1. Nenhum campo pode ser nulo;
  2. Os ids devem ser do tipo UUID;
  3. As strings não podem ter caracteres a mais do que foi definido em sua estrutura;

Se algum campo não estiver preenchido corretamente, deve-se retornar uma mensagem para o usuário mostrando qual o problema foi encontrado em qual campo.

Se todos os dados estiverem validados. Apenas retorne todos os dados em um formato JSON.

Nível 2 - Persistência

Utilize o Prisma, para incluir um novo banco de dados SQLite.

Crie a estrutura de acordo com o que foi definido.

Caso os dados estejam válidos, cadastre-os.

Crie 2 novas rotas:

GET /integrations/payable/:id

GET /integrations/assignor/:id

Para que seja possível retornar pagáveis e cedentes de forma independete.

Inclua também rotas para as outras operações:

  • Edição;
  • Exclusão;
  • Cadastro;

Nível 3 - Testes

Crie testes unitários para cada arquivo da aplicação. Para cada nova implementação a seguir, também deve-se criar os testes.

Nível 4 - Autenticação

Inclua um sistema de autenticação em todas as rotas.

Para isso, crie uma nova rota:

POST /integrations/auth que deve receber:

{
  "login": "aprovame",
  "password": "aprovame"
}

Com essas credenciais o endpoint deverá retornar um JWT com o tempo de expiração de 1 minuto.

Reescreva as regras de todas as outras rotas para que o JWT seja enviado como parâmetro do Header da requisição.

Se o JWT estiver válido, então os dados devem ser mostrados, caso contrário, deve-se mostrar uma mensagem de "Não autorizado".

Nível 5 - Gerenciamento de permissões

Agora, crie um sistema de gerenciamento de permissões.

Crie um novo cadastro de permissões. Esse cadastro deve armazenar: login e password.

Refatore o endpoint de autenticação para que sempre se gere JWTs se login e senha estiverem cadastrados no Banco de Dados.

Nível 6 - Infra e Doc

Crie um Dockerfile para sua API.

Crie um docker-compose.yaml para iniciar o seu projeto.

Documente tudo o que foi feito até aqui:

  • Como preparar o ambiente;
  • Como instalar as dependência;
  • Como rodar o projeto;

Nível 7 - Lotes

Crie um novo recurso de processamento de pagáveis por lotes.

A ideia é que o cliente possa enviar um GRANDE número de pagáveis de uma única vez. E isso, não poderá ser processado de forma síncrona.

Crie um novo endpoint:

POST integrations/payable/batch

Neste endpoint deve ser possível receber lotes de até 10.000 pagáveis.

Ao receber todos os pagáveis, deve-se postá-los em uma fila.

Crie um consumidor para esta fila que deverá pegar pagável por pagável, criar seu registro no banco de dados, e ao final do processamento do lote enviar um e-mail de lote processado, com o número de sucesso e falhas.

Nível 8 - Resiliência

Caso não seja possível processar algum ítem do lote, coloque-o novamente na fila. Isso deve ocorrer por até 4 vezes. Depois, esse ítem deve ir para uma "Fila Morta" e um e-mail deve ser disparado para o time de operações.

Nível 9 - Cloud

Crie uma pipeline de deploy da aplicação em alguma estrutura de Cloud. (AWS, Google, Azure...)

Nível 10 - Infra as a Code

Crie uma estrutura em terraforma que monte a infra-estrutura desejada.

🖥️ Front-end

Nível 1 - Cadastro

Crie uma interface na qual é possível cadastrar os pagáveis.

É importante que sua interface previna o cadastro de campos vazios, ou que não estejam nas regras definidas anteriormente.

Exiba o pagável cadastrado em uma nova tela.

Nível 2 - Conectando na API

Conecte a seu Front-end a API que foi criada, e faça o cadastro de um pagável refletir na sua API.

Faça também uma tela para cadastro do cedente.

Altere o cadastro inicial para que o campo assignor seja um combobox no qual seja possível selecionar um cedente.

Nível 3 - Listando

Agora faça um sistema de listagens de pagáveis. Mostrando apenas: id, value e emissionDate.

Para cada ítem da lista, coloque um link que mostra os detalhes do pagável.

Além disso, coloque opções de editar e excluir.

Nessa página de detalhes, inclua um novo link para exibir os dados do cedente.

Todos os dados devem vir da API.

Nível 4 - Autenticação

Implemente agora o sistema de login e senha para poder acessar as suas rotas de forma autenticada.

Armazene o token no localStorage do seu navegador.

Caso o token expire, redirecione o usuário para a página de login.

Nível 5 - Testes

Crie testes para sua aplicação Front-end.