---
# System prepended metadata

title: Markdown quick start guide

---

# Projeto Modulo 5
# Primeira sprint
## Link do repositório:
https://github.com/LeandroFS1/desafio-backend-modulo-05-sistema-pdv-dds-t14-dbe-t05

## Avisos importantes
- Sempre quando der erro, colocar o codigo do erro correto
- Nos endpoints sempre o nome do objeto tem que ser igual ao nome da tabela
- Na duvida, sempre perguntar ao grupo, trabalho em grupo economiza tempo e dores de cabeça por erros simples
- Sempre lembrar de atualizar o codigo com o github antes de começar a codar
---
### Banco de dados:(Leandro)
#### O banco de dados será com essas tabelas e seus respectivos conteudos:
##### Usuarios:
- Id (Autoincrement)
- Nome (Sem restrições, porem seria bom ser obrigatório)
- Email (campo unico e obrigatório) 
- Senha (Obrigatória, criptografada e com caracteres minimos de 8)

#### Categorias:
- Id (Autoincrement)
- Categorias(obrigatório)
- Preparar a tabela para futuro relacionamento com produtos
---
## Rotas:
### Listar categorias:(Sergio)
- Sem autenticação
- Listar categorias uma a uma (lembrar do /:id)

### Cadastrar usuario:(Edvani)
- Sem autenticação
- Verificar sempre se o email inserido já existe
- Verificar se o usuario digitou a senha minima exigida
- Caso escolha nome obrigatório, conferir o campo nome
- Criptografar a senha

### Efetuar login:(Eduarda)
- Sem autenticação
- Verificar se o email digitado existe e se está correto
- Verificar se a senha foi digitada e se está correta


### Detalhar perfil usuario:(Leo Oliveira)
- Com autenticação
- Puxar o id do usuario pelo token de autenticação para evitar acesso a outros
- Detalhar completamente o usuario

### Editar perfil usuario:(ismael)
- Com autenticação
- Sempre exigir os campos a serem editados sejam validos
- Sempre exigir senha ao trocar dados do usuario

### Efetuar deploy

---

# Segunda sprint
## Avisos importantes
- Sempre quando der erro, colocar o codigo do erro correto
- Nos endpoints sempre o nome do objeto tem que ser igual ao nome da tabela
- Na duvida, sempre perguntar ao grupo, trabalho em grupo economiza tempo e dores de cabeça por erros simples
- Sempre lembrar de atualizar o codigo com o github antes de começar a codar
---
### Atualizar banco de dados (Leandro)

#### Criar as seguintes tabelas:
- produtos:
  - id
  - descricao
  - quantidade_estoque
  - valor
  - categoria_id
    
    
- clientes:
  -  id
  - nome
  - email (campo único)
  - cpf (campo único)
  - cep
  - rua
  - numero
  - bairro
  - cidade
  - estado
    
    
### Cadastrar produto (Leandro)
- Validar os campos obrigatórios:
    -   descricao
    -   quantidade_estoque
    -   valor
    -   categoria_id
-   A categoria informada na qual o produto será vinculado deverá existir.
### Editar produto (Leandro)
-   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.

### Excluir produto (Leandro)
-   Validar se existe produto para o id enviado como parâmetro na rota.

### Detalhar produto (Sergio)
-   Validar se existe produto para o id enviado como parâmetro na rota.

### Listar produto (Sergio)

- 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.

### Cadastrar cliente (Edvani)

-   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 cliente (Ismael)
-   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 (Eduarda)
- listar todos os clientes existentes

### Detalhar cliente (Leo)
-   Validar se existe cliente para o id enviado como parâmetro na rota.

---
# Terceira sprint
## Avisos importantes
- Sempre quando der erro, colocar o codigo do erro correto
- Nos endpoints sempre o nome do objeto tem que ser igual ao nome da tabela
- Na duvida, sempre perguntar ao grupo, trabalho em grupo economiza tempo e dores de cabeça por erros simples
- Sempre lembrar de atualizar o codigo com o github antes de começar a codar
---
### Banco de dados (Leandro)
#### Criar as tabelas:
- pedidos
    - id
    - cliente_id
    - observacao
    - valor_total
- pedido_produtos
    - id
    - pedido_id
    - produto_id
    - quantidade_produto
    - valor_produto
#### Atualizar a tabela produtos:
- Adicionar produto_imagem

### Correção de bugs (Leandro)

### Cadastrar pedidos (Sergio)
- 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.

#### Itens obrigatórios:
-   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. 
-   Enviar e-mail para o cliente notificando que o pedido foi efetuado com sucesso.

### Listar pedidos (Edvaní)
#### Itens obrigatórios:
- 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 produtos (Leo)
#### Itens obrigatórios:
- 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.

### Aprimorar cadastro/atualização de produtos (Ismael)
#### Itens obrigatórios:
- O campo `produto_imagem` deve ser opcional, mas, em caso de ser enviado no corpo da requisição deveremos processar a imagem vinculada a essa propriedade e armazenar a imagem em um servidor de armazenamento (Supabase, Blackblaze, etc...)
- Armazenar na coluna `produto_imagem` a URL que possibilita visualizar a imagem que foi efetuada upload para o servidor de armazenamento.

### Aprimorar exclusão de produtos (Eduarda)
#### Itens obrigatórios:
- Na exclusão do produto a imagem vinculada a este produto deverá ser excluída do servidor de armazenamento.







# "Apreciando cada passo, mas já sonhando com as próximas conquistas!"
## Fim da api PDV !!
