Descrição
O projeto consiste na criação de um sistema de estoque de produtos
Tecnologias e requisitos
- Back-end - Node.js com TypeScript (Pode ser usado qualquer lib ou framework)
- Front-end - React.js com TypeScript (Pode ser usado Create React App ou Next.js)
- Docker para orquestar o ambiente da aplicação
- Banco de dados MySQL
Contexto do sistema
Usuários poderão cadastrar produtos e dar entrada/saída no estoque. O cadastro de produtos serão categorizados. Somente usuários autenticados poderão manipular o sistema.
Design do sistema
Back-end - Node.js com TypeScript
Você deve criar uma API Rest que terá os seguintes endpoints:
- POST /auth - Gera um token JWT para autenticação (usuário e senha deverão ser fixo: admin@user.com e 123456. Se a credential não for valida, a API deverá retornar um erro. O tempo de vida de um token será de 5 min).
{
"email": "admin@user.com",
"password": "123456"
}
- POST /auth/refresh - Renova o token de acesso atual por mais 5 min, será gerado um novo token. Se o token de acesso não for válido, a API deverá retornar um erro.
{
"access_token": "xxxxx.yyyyy.zzzzz"
}
- GET /categories - Listagem de categorias
[
{
"id": 1,
"name": "Category 1"
},
{
"id": 2,
"name": "Category 2"
}
]
- POST /categories - Criação de categorias (se o nome não for passado, a API deverá informar um erro)
{
"name": "Awesome category"
}
- POST /products - Criação de um produto (se o nome não for passado ou a categoria não existir, a API deverá informar um erro)
{
"name": "Foo product",
"category_id": 123
}
- GET /products?page=1 - Listar produtos (A listagem de produtos terá paginação com no máximo 15 registros por página)
{
"data": [
{
"id": 1,
"name": "Product 1",
"quantity": 120,
"category_id": 1,
"category_name": "Categoria 1"
},
{
"id": 1,
"name": "Product 2",
"quantity": 60,
"category_id": 2,
"category_name": "Categoria 2"
}
],
"meta": {
"page": 1
}
}
- GET /products/:id - Mostrar um produto (Se o produto não existir, a API deve retornar um erro)
{
"id": 1,
"name": "Product 1",
"quantity": 120,
"category_id": 1,
"category_name": "Categoria 1"
}
- POST /inventory/add - Dar entrada de mais quantidades de um produto no estoque
{
"product_id": 1,
"quantity": 1,
}
- POST /inventory/sub - Dar saída de mais quantidades de um produto no estoque (Se o produto não existir ou se o estoque do produto menos a quantidade a ser retirada for < 0, a API deve retornar um erro)
{
"product_id": 2,
"quantity": 1,
}
Sempre quando uma entrada ou saída for realizada, deve-se registrar isto e também atualizar o estoque do produto.
Crie dados falsos para categorias e produtos. Crie pelo menos 5 categorias e 150 produtos já previamente cadastrados no banco de dados.
Criar a aplicação usando testes automatizados será um grande diferencial.
Front-end - React.js
O front-end da aplicação deverá ter as seguintes páginas:
- Página de login de usuário - Somente usuários logados deverão ter acesso interno à aplicação. Quando o login acontecer, o token deverá ser armazenado no browser e a cada requisição HTTP para a API, se retornar um erro 401, será usado o endpoint de renovação do token para gerar um novo token e automaticamente deverá ser enviado a requisição novamente.
- Listar as categorias
- Cadastrar uma categoria - Antes de enviar os dados do formulário, estes deverão ser validados
- Listar os produtos - Esta listagem deverá se integrar com a paginação do backend e deverá usar algum cache local para que produtos já listados anteriormente (paginações de produtos já listadas) continuem na memória do browser e não seja chamada novamente a API Rest para capturar os produtos.
- Cadastrar um produto - Antes de enviar os dados do formulário, estes deverão ser validados
- Dar entrada no estoque
- Dar saída no estoque
Fique a vontade para organizar páginas ou modais e até usar libs de estilização para React.js. A componetização e composição serão muito bem-vindos.
Criar a aplicação usando pirâmides de testes será muito bem vindo.
Docker
Crie as duas aplicações montando-as com Docker de forma que ao fazer docker-compose up
seja possível testar todo o ambiente.
O Docker deve levantar back-end, front-end, banco de dados.
Entrega
Subir a aplicação em um repositório Git remoto e disponibilizar o link.