Olá, tudo certo?
Seja bem vindo ao teste de seleção para novos desenvolvedores na Bankme!
Estamos honrados que você tenha chegado até aqui!
Prepare aquele ☕️ , e venha conosco codar e se divertir!
Este é um teste para analisarmos como você desempenha ao entender, traduzir, resolver e entregar um código que resolve um problema.
- Documente;
- Pergunte;
- Mostre a sua linha de reciocínio;
- Trabalhe bem o seu README.md;
- Faça um clone deste projeto em seu GitHub pessoal;
- Realize as implementações de acordo com cada um dos níveis;
- Faça pequenos commits;
- Depois de sentir que fez o seu máximo, faça um PR para o repositório original. (Para conseguir fazer isso, não se esqueça de fazer um Fork antes de iniciar tudo!)
IMPORTANTE!
Não significa que você precisa implementar todos os níveis para ser aprovado no processo!
Faça até onde se sentir confortável.
Nós temos um período para fechar a vaga em questão. Então, quanto antes você enviar, mais cuidado podemos ter na revisão do seu teste.
Mas sabemos que o dia a dia é corrido, faça de forma que fique confortável para você!
Mas não desista! Envie até onde conseguir.
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.