Seja Bem vindo à Multiplier!
Estamos felizes de ter você no nosso processo seletivo para Equipe de Integração!
Neste processo, vamos analisar seu conhecimento sobre APIs Rest, Banco de Dados, Javascript (e/ou Typescript) e Git!
Como enviar o desafio
Crie um repositório público no Github. Assim que finalizar seu desafio, envie o link do repositório para o endereço de email talentos@multiplier.com.br
Lembre-se que estamos analisando seu conhecimento Git também, então utilize Commits Semânticos no processo de desenvolvimento do desafio.
ex:
- Caso esteja desenvolvendo o endpoint de Produtos, crie uma branch chamada
feature/endpoint-produtos
. - Faça os commits semânticos nela, ex:
feat(Produtos): Criado endpoint GET de produtos
. - Quando finalizar, realize o merge para a branch
main
Dúvidas sobre o desafio
Caso tenha alguma dúvida sobre o desafio, abra uma issue neste repositório e alguém da nossa equipe de integração vai te ajudar! Utilizamos as issues para que cada dúvida possa servir de ajuda para o próximo!
A seguir, está seu desafio, boa sorte!
DESAFIO
Resumo:
- Criar um Banco de dados PostgreSQL
- Criar um Banco de dados MySQL
- Criar uma api para consumir o banco de dados Mysql utilizando Sequelize como ORM
- Criar um serviço cron utilizando node-schedule para buscar dados na API e salvar no banco de dados PostgreSQL
Diferenciais:
Aqui na Multiplier, utilizamos a framework NestJS para desenvolver nossos serviços de integração. Você não precisa utilizar esta mesma framework, você é livre para escolher a forma que deseja executar o desafio, porém utilizando o NestJS você já se familiariza com nossos processos, e requere menos configuração para executar o desafio
Caso opte por utilizar a framework NestJS (preferencialmente), você deve utilizar typescript. Você deverá usar o pacote npm sequelize-typescript
. Consulte as docs do NestJs para maiores informações.
Caso opte por não utilizar a framework, você deverá usar o express
como servidor e o sequelize
como ORM. Você poderá usar ou não typescript se seguir esta opção. Fica ao seu critério.
Instruções:
1. Criar um banco MySQL
1.1. Criar as tabelas:
Categorias
coluna | tipo | descrição |
---|---|---|
id | int | Chave primária da tabela |
codigo | varchar | Código da Categoria (slug) |
titulo | varchar | Título da Categoria |
status | int | 0 - Inativo, 1 - Ativo |
Produtos
coluna | tipo | descrição |
---|---|---|
id | int | Chave primária da tabela |
idCategoria | int | id da Categoria (fk) |
codigo | varchar | SKU do Produto |
nome | varchar | Nome do Produto |
descricao | text | Descrição do Produto |
valor | decimal | Valor do Produto |
status | int | 0 - Inativo, 1 - Ativo |
Estoque
coluna | tipo | descrição |
---|---|---|
id | int | Chave primária da tabela |
idProduto | int | id do Produto (fk) |
quantidade | int | Quantidade em estoque |
reserva | int | Quantidade reservada |
status | int | 0 - Inativo, 1 - Ativo |
2. Desenvolver uma API Restful para cada resource:
- Categorias
[GET] /categorias - Lista todas as Categorias
[GET] /categorias/:id - Busca uma Categoria por id
[POST] /categorias - Cria uma Categoria
[PATCH] /categorias/:id - Edita uma Categoria
[DELETE] /categorias/:id - Deleta uma Categoria (deve atualizar o produto setando idCategoria como NULL para produtos que utilizam essa categoria)
- Produtos
[GET] /produtos - Lista todos os Produtos
[GET] /produtos/:id - Busca um Produto por id
[POST] /produtos - Cria um Produto
[PATCH] /produtos/:id - Edita um Produto
[DELETE] /produtos/:id - Deleta um Produto (e seu estoque)
- Estoque
* Quando um produto é criado, deve ser criado um estoque com quantidade 0 para o Produto
* Só pode haver 1 estoque para um mesmo Produto
[GET] /produtos/:id/estoque - Lista o estoque para o Produto pelo id
[PATCH] /produtos/:id/estoque - Edita o Estoque para o Produto pelo id
[DELETE] /produtos/:id/estoque - Deve retornar o status [501] - Not Implemented. (não se pode deletar um estoque)
3. Criar um banco de dados PostgreSQL com as mesmas tabelas anteriores
4. Criar o serviço Cron
Crie um serviço que consome os dados dos endpoints e execute uma determinada função que realize a integração dos dados MySQL => PostgreSQL.
A função deve consumir os endpoints criados anteriormente em um determinado intervalo de tempo (utilizando o node-cron) e salvar os dados no banco PostgreSQL.
Dica: Você pode utilizar o site Crontab.guru para melhor visualizar o formato cron.
Boa sorte!
-- Equipe Multiplier