# 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 !!