Giter VIP home page Giter VIP logo

desafio-backend-final's Introduction

desafio-backend-05-pdv

Desafio Módulo 5 - Backend

Seja bem vindo(a) ao desafio do módulo 5.

Sua tarefa como desenvolvedor(a) será criar uma API para um PDV (Frente de Caixa). Esse será um projeto piloto, ou seja, no futuro outras funcionalidades serão implementadas.

Importante 1: O diretório ".github" e seu conteúdo não podem ser alterados e muito menos excluídos

Importante 2: Sempre que a validação de uma requisição falhar, responda com código de erro e mensagem adequada à situação, ok?

Importante 3: Para endpoints de cadastro/atualização os objetos de requisição devem conter as propriedades equivalentes as colunas das tabelas.

Exemplo:

// Corpo da requisição para cadastro de usuário (body)
{
    "nome": "José",
    "email": "[email protected]",
    "senha": "jose"
}

ATENÇÃO: Todos os endpoints deverão atender os requisitos citados acima.

Banco de dados

Você precisa criar um Banco de Dados PostgreSQL chamado pdv.

IMPORTANTE: Deverá ser criado no projeto o arquivo SQL que deverá ser o script contendo os comandos de criação das tabelas respeitando os nomes das tabelas e colunas respectivamente, além de, conter os comandos para a inserção das categorias que devem ser previamente cadastradas (estão citadas na 1ª Sprint no item Listar Categorias).

Requisitos obrigatórios

  • A API a ser criada deverá acessar o banco de dados a ser criado pdv para persistir e manipular os dados de categorias, clientes, pedidos, produtos e usuários utilizados pela aplicação.
  • O campo id das tabelas no banco de dados deve ser auto incremento, chave primária e não deve permitir edição uma vez criado.
  • Qualquer valor monetário deverá ser representado em centavos (Ex.: R$ 10,00 reais = 1000)

Status Codes

Abaixo, listamos os possíveis status codes esperados como resposta da API.

// 200 (OK) = requisição bem sucedida
// 201 (Created) = requisição bem sucedida e algo foi criado
// 204 (No Content) = requisição bem sucedida, sem conteúdo no corpo da resposta
// 400 (Bad Request) = o servidor não entendeu a requisição pois está com uma sintaxe/formato inválido
// 401 (Unauthorized) = o usuário não está autenticado (logado)
// 403 (Forbidden) = o usuário não tem permissão de acessar o recurso solicitado
// 404 (Not Found) = o servidor não pode encontrar o recurso solicitado
// 500 (Internal Server Error) = erro inesperado do servidor
1ª Sprint
Banco de Dados

Crie as seguintes tabelas e colunas abaixo:

ATENÇÃO! Os nomes das tabelas e das colunas a serem criados devem seguir exatamente os nomes listados abaixo.

  • usuarios
    • id
    • nome
    • email (campo único)
    • senha
  • categorias
    • id
    • descricao
Listar categorias

GET /categoria

Essa é a rota que será chamada quando o usuário quiser listar todas as categorias cadastradas.

As categorias a seguir precisam ser previamente cadastradas para que sejam listadas no endpoint de listagem das categorias.

Categorias

  • Informática
  • Celulares
  • Beleza e Perfumaria
  • Mercado
  • Livros e Papelaria
  • Brinquedos
  • Moda
  • Bebê
  • Games
Cadastrar usuário

POST /usuario

Essa é a rota que será utilizada para cadastrar um novo usuário no sistema.

Critérios de aceite:

- Validar os campos obrigatórios: 
    - nome
    - email
    - senha
- A senha deve ser criptografada utilizando algum algoritmo de criptografia confiável.
- O campo e-mail no banco de dados deve ser único para cada registro, não permitindo dois usuários possuírem o mesmo e-mail.
Efetuar login do usuário

POST /login

Essa é a rota que permite o usuário cadastrado realizar o login no sistema.

Critérios de aceite:

- Validar se o e-mail e a senha estão corretos para o usuário em questão.
- Gerar um token de autenticação para o usuário.
Redefinir senha do usuário

PATCH /usuario/redefinir

Essa é a rota que permite o usuário cadastrado redefinir a senha.

Critérios de aceite:

- Validar os campos obrigatórios: 
    - email
    - senha_antiga
    - senha_nova
- A senha antiga não pode ser igual a senha nova.
- Validar se o e-mail e a senha antiga estão corretos para o usuário em questão.
- Alterar a senha no banco de dados para a nova senha informada.
- Como forma de segurança, enviar e-mail alertando o usuário que a senha foi alterada.

ATENÇÃO: Todas as funcionalidades (endpoints) a seguir, a partir desse ponto, deverão exigir o token de autenticação do usuário logado, recebendo no header com o formato Bearer Token. Portanto, em cada funcionalidade será necessário validar o token informado.


Detalhar perfil do usuário logado

GET /usuario

Essa é a rota que permite o usuário logado a visualizar os dados do seu próprio perfil, de acordo com a validação do token de autenticação.

Editar perfil do usuário logado

PUT /usuario

Essa é a rota que permite o usuário logado atualizar informações de seu próprio cadastro, de acordo com a validação do token de autenticação.

Critérios de aceite:

- Validar os campos obrigatórios: 
    - nome
    - email
    - senha
- A senha deve ser criptografada utilizando algum algoritmo de criptografia confiável.
- O campo e-mail no banco de dados deve ser único para cada registro, não permitindo dois usuários possuírem o mesmo e-mail.
Efetuar deploy da aplicação

Fazer deploy do projeto no Heroku e disponibilizar a URL para o líder técnico.


2ª Sprint
Banco de Dados

Crie as seguintes tabelas e colunas abaixo:

ATENÇÃO! Os nomes das tabelas e das colunas a serem criados devem seguir exatamente os nomes listados abaixo.

  • produtos
    • id
    • descricao
    • quantidade_estoque
    • valor
    • categoria_id
  • clientes
    • id
    • nome
    • email (campo único)
    • cpf (campo único)
    • cep
    • rua
    • numero
    • bairro
    • cidade
    • estado

ATENÇÃO: Todas as funcionalidades (endpoints) a seguir, a partir desse ponto, deverão exigir o token de autenticação do usuário logado, recebendo no header com o formato Bearer Token. Portanto, em cada funcionalidade será necessário validar o token informado.


Cadastrar Produto

POST /produto

Essa é a rota que permite o usuário logado cadastrar um novo produto no sistema.

Critérios de aceite:

-   Validar os campos obrigatórios:
    -   descricao
    -   quantidade_estoque
    -   valor
    -   categoria_id
-   A categoria informada na qual o produto será vinculado deverá existir.
Editar dados do produto

PUT /produto/:id

Essa é a rota que permite o usuário logado a atualizar as informações de um produto cadastrado.

Critérios de aceite:

-   Validar se existe produto para o id enviado como parâmetro na rota.
-   Validar os campos obrigatórios:
    -   descricao
    -   quantidade_estoque
    -   valor
    -   categoria_id
-   A categoria informada na qual o produto será vinculado deverá existir.
Listar Produtos

GET /produto

Essa é a rota que será chamada quando o usuário logado quiser listar todos os produtos cadastrados.

Deveremos incluir um parâmetro do tipo query categoria_id para que seja possível consultar produtos por categorias, de modo, que serão filtrados de acordo com o id de uma categoria.

Critérios de aceite:

- Caso seja enviado o parâmetro do tipo query **categoria_id**, filtrar os produtos de acordo com a categoria, caso o id de categoria informada exista.
- Caso não seja informado o parâmetro do tipo query **categoria_id** todos os produtos cadastrados deverão ser retornados.
Detalhar Produto

GET /produto/:id

Essa é a rota que permite o usuário logado obter um de seus produtos cadastrados.

Critérios de aceite:

-   Validar se existe produto para o id enviado como parâmetro na rota.
Excluir Produto por ID

DELETE /produto/:id

Essa é a rota que será chamada quando o usuário logado quiser excluir um de seus produtos cadastrados.

Critérios de aceite:

-   Validar se existe produto para o id enviado como parâmetro na rota.
Cadastrar Cliente

POST /cliente

Essa é a rota que permite usuário logado cadastrar um novo cliente no sistema.

Critérios de aceite:

-   Validar os campos obrigatórios:
    -   nome
    -   email
    -   cpf
-   O campo e-mail no banco de dados deve ser único para cada registro, não permitindo dois clientes possuírem o mesmo e-mail.
-   O campo cpf no banco de dados deve ser único para cada registro, não permitindo dois clientes possuírem o mesmo cpf.
Editar dados do cliente

PUT /cliente/:id

Essa é a rota que permite o usuário realizar atualização de um cliente cadastrado.

Critérios de aceite:

-   Validar se existe cliente para o id enviado como parâmetro na rota.
-   Validar os campos obrigatórios:
    -   nome
    -   email
    -   cpf
-   O campo e-mail no banco de dados deve ser único para cada registro, não permitindo dois clientes possuírem o mesmo e-mail.
-   O campo cpf no banco de dados deve ser único para cada registro, não permitindo dois clientes possuírem o mesmo cpf.
Listar Clientes

GET /cliente

Essa é a rota que será chamada quando o usuário logado quiser listar todos os clientes cadastrados.

Detalhar Cliente

GET /cliente/:id

Essa é a rota que será chamada quando o usuário logado quiser obter um de seus clientes cadastrados.

Critérios de aceite:

-   Validar se existe cliente para o id enviado como parâmetro na rota.

3ª Sprint
Banco de Dados

Crie as seguintes tabelas e colunas abaixo:

ATENÇÃO! Os nomes das tabelas e das colunas a serem criados devem seguir exatamente os nomes listados abaixo.

  • pedidos
    • id
    • cliente_id
    • observacao
    • valor_total
  • pedido_produtos
    • id
    • pedido_id
    • produto_id
    • quantidade_produto
    • valor_produto

ATENÇÃO: Todas as funcionalidades (endpoints) a seguir, a partir desse ponto, deverão exigir o token de autenticação do usuário logado, recebendo no header com o formato Bearer Token. Portanto, em cada funcionalidade será necessário validar o token informado.


Cadastrar Pedido

POST /pedido

Essa é a rota que será utilizada para cadastrar um novo pedido no sistema.

Lembre-se: Cada pedido deverá conter ao menos um produto vinculado.

Atenção: As propriedades produto_id e quantidade_produto devem ser informadas dentro de um array e para cada produto deverá ser criado um objeto neste array, como ilustrado no objeto de requisição abaixo. Só deverá ser cadastrado o pedido caso todos produtos vinculados ao pedido realmente existão no banco de dados.

// Corpo da requisição para cadastro de pedido (body)
{
    "cliente_id": 1,
    "observacao": "Em caso de ausência recomendo deixar com algum vizinho",
    "pedido_produtos": [
        {
            "produto_id": 1,
            "quantidade_produto": 10
        },
        {
            "produto_id": 2,
            "quantidade_produto": 20
        }
    ]
}

Critérios de aceite:

-   Validar os campos obrigatórios:
    -   cliente_id
    -   pedido_produtos
        -   produto_id
        -   quantidade_produto
-   Validar se existe cliente para o id enviado no corpo (body) da requisição.
-   Validar se existe produto para cada produto_id informado dentro do array enviado no corpo (body) da requisição.
-   Validar se existe a quantidade em estoque de cada produto existente dentro do array, de acordo com a quantidade informada no corpo (body) da requisição.
-   O pedido deverá ser cadastrado, apenas, se todos os produtos estiverem validados.    
Listar Pedidos

GET /pedido

Essa é a rota que será chamada quando o usuário logado quiser listar todos os pedidos cadastrados.

Deveremos incluir um parâmetro do tipo query cliente_id para que seja possível consultar pedidos por clientes, de modo, que serão filtrados de acordo com o id de um cliente.

// Resposta para listagem de pedido (body)
[
    {
        "pedido": {
            "id": 1,
            "valor_total": 230010,
            "observacao": null,
            "cliente_id": 1
        },
        "pedido_produtos": [
            {
                "id": 1,
                "quantidade_produto": 1,
                "valor_produto": 10,
                "pedido_id": 1,
                "produto_id": 1
            },
            {
                "id": 2,
                "quantidade_produto": 2,
                "valor_produto": 230000,
                "pedido_id": 1,
                "produto_id": 2
            }
        ]
    }
]

Critérios de aceite:

- Caso seja enviado o parâmetro do tipo query **cliente_id**, filtrar os pedidos de acordo com o cliente, caso o id do cliente informado exista.
- Caso não seja informado o parâmetro do tipo query **cliente_id** todos os pedidos cadastrados deverão ser retornados.
Aplicar validação na exclusão de produto

Deverá ser aplicada uma regra de negócio que não permitirá exclusão de produto que tenha sido registrado em algum pedido.

Critérios de aceite:

- Validar se o produto que está sendo excluído não está vinculado a nenhum pedido, caso estiver, não poderá ser excluído e deverá ser retornada uma mensagem indicando o motivo.
Upload de imagem

POST /upload

Essa é a rota que será utilizada para fazer o upload de uma imagem no servidor de armazenamento.

Atenção: O nome da imagem deverá ser gerado, de modo, que não deverá ser passada a propriedade relacionada ao nome da imagem.

Lembre-se: Cada imagem deverá ter um nome gerado exclusivo, ou seja, não poderá ter risco de uma imagem possuir o mesmo nome de uma outra já existente no servidor de armazenamento.

Critérios de aceite:

- Validar se a propriedade `imagem`, foi informada no corpo da requisição.
- Receber a propriedade `imagem` em formato base64 e enviar para o servidor de armazenamento.
- Obter e retornar a URL da imagem que teve upload concluído.
Aprimorar cadastro de produto

Deverá ser aprimorado o cadastro de produto para permitir vincular uma imagem a um produto. Deverá ser criada uma coluna produto_imagem para que seja possível efetuar o vínculo entre a imagem e o produto.

Critérios de aceite:

- O campo produto_imagem deve ser opcional.
Aprimorar atualização de produto

Deverá ser aprimorada a atualização de produto para permitir vincular uma imagem a um produto existente.

Critérios de aceite:

- Caso exista uma imagem vinculada a esse produto, a imagem vinculada anteriormente deverá ser excluída no servidor de armazenamento e substituída pela nova imagem.
- Caso exista uma imagem vinculada a esse produto, e o campo `produto_imagem` de atualização possuir valor `null`deverá ser excluída a imagem vinculada anteriormente e o valor `null` será atribuído a coluna `produto_imagem` deixando o produto sem imagem vinculada.
Aprimorar exclusão de produto

Deverá ser aprimorada a exclusão de produto para que quando o produto for excluído também seja removida a imagem vinculada a ele na servidor de armazenamento.

Critérios de aceite:

- Na exclusão do produto a imagem vinculada a este produto deverá ser excluída do servidor de armazenamento.

Aulas úteis:

tags: back-end módulo 5 nodeJS PostgreSQL API REST desafio

desafio-backend-final's People

Contributors

bkvrpedro avatar brunospo avatar vitorfrsvidal avatar vtorres96 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.