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.
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. |
CAMPO | TIPO | DESCRIÇÃO |
---|---|---|
id | string (UUID) | É a identificação de um cedente. |
document | string(30) | É o documento CPF ou CNPJ do cedente. |
string(140) | É o email do cedente. | |
phone | string(20) | É o telefone do cedente. |
name | string(140) | É a nome ou razão social do cedente. |
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:
- Nenhum campo pode ser nulo;
- Os ids devem ser do tipo UUID;
- 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.
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;
Crie testes unitários para cada arquivo da aplicação. Para cada nova implementação a seguir, também deve-se criar os testes.
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".
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.
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;
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.
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.
Crie uma pipeline de deploy da aplicação em alguma estrutura de Cloud. (AWS, Google, Azure...)
Crie uma estrutura em terraforma que monte a infra-estrutura desejada.
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.
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.
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.
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.
Crie testes para sua aplicação Front-end.