# PDV CodeXCode ## Conteudo do arquivo: - [Resumo](#resumo) - [O que o cliente pode fazer](#o-que-o-cliente-pode-fazer) - [O que o cliente não pode fazer](#o-que-o-cliente-não-pode-fazer) - [Tarefas dos Devs](#tarefas) - [Banco de Dados](#banco-de-dados) - [Endpoints](#endpoints) - [Deploy da aplicação](#deploy-da-aplicação) ## Resumo O projeto PDV CodeXCode é um projeto focado em servir um sistema Ponto de Venda (PDV) para um negócio. Esse documento delimita as funcionalidades, limitações e restrições do projeto, visando assim um melhor entendimento do escopo ## O que o cliente pode fazer - Gerenciar usuários - Criar conta com senha criptografada via bcrypt. - Conta é salva no banco de dados de nome pdv, o banco de dados utilizado nesse projeto é o PostgreSQL - Logar no sistema com segurança - Autenticação é feita via JSON Web Token - Visualizar categorias das vendas - Gerenciar clientes - Cadastrar novos clientes - Listar clientes cadastrados - Atualizar dados dos clientes - Gerenciar produtos - Cadastrar novos produtos - Listar produtos cadastrados - Atualizar produtos cadastrados - Deletar produtos cadastrados ## O que o cliente não pode fazer - Restrições de segurança - Usuário não pode acessar certas funcionalidades sem estar devidamente autenticado - Editar ou cadastrar clientes ou usuários com campos únicos que já exista no banco de dados (cpf, email) - Detalhar o perfil de outro usuário - Editar o perfil de outro usuário - Restrições gerais - Editar o id de si mesmo, de outros usuários ou qualquer tipo de id - Criar novas tabelas no banco de dados - Criar novas categorias - Deletar clientes ## Tarefas - #### Primeira Sprint - Criação do banco de dados - Ederney - Cadastrar usuário - Ederney - Efetuar login do usuário - Ruan - Atualizar perfil do usuário logado - Elivelton - Detalhar perfil do usuário logado - Wallace - Listar categorias - Wallace - Deployar a aplicação - Ruan - #### Segunda Sprint - Atualização de tabelas no banco de dados - Ruan - Cadastrar cliente & Detalhar cliente - Ederney - Cadastrar produto & Listar e Detalhar produto - Wallace - Editar dados do produto & Excluir produto pelo id - Elivelton - Editar dados do cliente & Listar clientes - Ruan - #### Sprint Final - Atualização de tabelas no banco de dados - Ruan - Aprimorar cadastro & Atualização de produto - Ederney - Cadastrar pedido & listar pedido - Elivelton - Aplicar validação na exclusão de produto - Wallace - Aprimorar exclusão de produto - Ruan - Criar funções de codificação e decodificação em base64 para imagens (extra) - Ruan e quem quiser - Testar e revisar **todas** funcionalidades da aplicação - todos do time - Escrever README de como utilizar e principais funcionalidades do projeto ## Banco de Dados O banco de dados a ser utilizado é o PostgreSQL #### Tabelas do banco: - ### Categorias - id (serial primary key) - descricao (text not null) - ### Usuarios - id (serial primary key) - nome (text not null) - email (text not null unique) - senha (text not null) - ### Produtos - id (serial primary key) - descricao (varchar(150)) - quantidade_estoque (integer) - valor (integer) - categoria_id (integer REFERENCES categorias(id)) - ### Clientes - id (serial primary key) - nome (text not null) - email (text not null unique) - cpf (varchar(11) not null unique) - cep (char(8)) - rua (varchar(150)) - numero (integer) - bairro (varchar(150)) - cidade (varchar(150)) - estado (varchar(2)) - ### Pedidos - id (serial primary key) - cliente_id (integer references clientes(id) not null) - observacao (varchar(150)) - valor_total (integer not null) - ### Pedido_produtos - id (serial primary key) - pedido_id (integer references pedidos(id) not null) - produto_id (integer references produtos(id) not null) - quantidade_produto (integer not null) - valor_produto (integer not null) - ### Produtos - produto_imagem (varchar(400) not null) ## Endpoints <details> <summary> <b>Autenticação</b> </summary> - #### `POST` `/login` Essa rota retorna o token do usuário caso email e senha estejam corretos Exemplo de retorno: ```JSON { "usuario":"objeto com dados do usuário com exceção da senha", "token":"token para ser utilizado nas outras rotas" } ``` </details> <details> <summary> <b>Categorias</b> </summary> - #### `GET` `/categoria` Essa rota retorna todas as categorias cadastradas no banco de dados. As categorias a seguir são registradas previamente: - ### **Categorias** - Informática - Celulares - Beleza e Perfumaria - Mercado - Livros e Papelaria - Brinquedos - Moda - Bebê - Games </details> <details> <summary> <b>Usuarios</b> </summary> - #### `POST` `/usuario` Essa rota é utilizada para criação dos usuários O usuário deve ser informado no body no seguinte padrão: ```JSON { "nome":"nome do usuário", "email":"email único no sistema", "senha":"senha a ser criptografada com bcrypt" } ``` O retorno será um objeto apenas com nome e email do usuário, por razões de segurança em nenhum momento a senha é retornada nas requisições. - #### `GET` `/usuario` Rota que detalha as informações do usuário logado Exemplo de retorno: ```JSON { "nome":"nome do usuário", "email":"email do usuário" } ``` - #### `PUT` `/usuario` Rota para atualizar **todas** as informações do usuário As informações devem ser informadas no corpo da requisição da seguinte forma: ```JSON { "nome":"novo nome", "email":"novo email", "senha":"nova senha" } ``` </details> <details> <summary> <b>Clientes</b> </summary> - #### `GET` `/cliente` Rota para listar **todos** os clientes O retorno é um array com a lista dos clientes ```JSON [ { "id": 2, "nome": "cliente1", "email": "cliente1@email.com", "cpf": "98745612311", "cep": null, "rua": null, "numero": null, "bairro": null, "cidade": null, "estado": null }, {...},... ] ``` - #### `GET` `/cliente/:id` Rota para detalhar um cliente específico O id é um parâmetro de rota que deve ser informado para encontrar o cliente, caso contrário serão listados todos os clientes cadastrados. Exemplo de retorno: ```JSON { "id": 2, "nome": "cliente1", "email": "cliente1@email.com", "cpf": "98745612311", "cep": null, "rua": null, "numero": null, "bairro": null, "cidade": null, "estado": null } ``` ```JSON { "mensagem":"Cliente não encontrado" } ``` - #### `POST` `/cliente` Rota para cadastrar um cliente No corpo da requisição os campos nome, email e cpf são obrigatórios os demais são extras porém não necessários. Exemplo de retorno caso sejam informados apenas os campos obrigatórios: ```JSON { "nome": "cliente1", "email": "cliente1@email.com", "cpf": "98745612311", "cep": null, "rua": null, "numero": null, "bairro": null, "cidade": null, "estado": null } ``` Exemplo caso o campo cpf ou email já exista no banco de dados: ```JSON { "mensagem":"Cpf já cadastrado" } { "mensagem":"Email já cadastrado" } ``` - #### `PUT` `/cliente/:id` Rota para atualizar os dados do cliente Com exceção do cpf,nome e email, informar os outros dados não é obrigatório. Os dados que não forem informados não serão atualizados e permanecerão com o valor antigo. </details> <details> <summary> <b>Produtos</b> </summary> - #### `POST` `/produto` Rota para cadastrar novos produtos. Exemplo do corpo da requisição: ```JSON { "descricao":Descricao do produto, "quantidade_estoque":numero qtd em estoque, "valor":numero do preco, "categoria_id":numero do id (deve existir categoria com id informado) } ``` - #### `GET` `/produto` Rota para listar os produtos cadastrados. O retorno dessa rota será sempre um array com os produtos cadastrados, caso não exista nenhum produto será um array vazio - #### `GET` `/produto/:id` Rota para detalhar um produto específico. O retorno será sempre um o produto como um objeto, caso exista produto com o id informado. Exemplo: ```JSON { "id":id do produto, "descricao":Descricao do produto, "quantidade_estoque":numero qtd em estoque, "valor":numero do preco, "categoria_id":numero do id } ``` Caso não exista um produto com o id informado o retorno será o seguinte: ```JSON { "mensagem":"Produto não encontrado" } ``` Caso o id não seja um número válido: ```JSON { "mensagem":"O id deve ser um numero valido" } ``` - #### `PUT` `/produto/:id` Rota para atualizar os dados do produto. O corpo da requisição será semelhante ao do endpoint de cadastro de produto. O id devera ser informado como parâmetro de rota. não há retorno no corpo da resposta (caso a operação tenha sido bem sucedida) exemplos de erro: ```JSON { "mensagem":"Produto não encontrado!" } ``` ```JSON { "mensagem":"Categoria não encontrada!" } ``` - #### `DELETE` `/produto/:id` Rota para deletar um produto com base no id informado. Não há retorno no corpo da resposta caso o produto seja excluído com sucesso. exemplos de erro: ```JSON { "mensagem":"Produto não encontrado." } ``` ```JSON { "mensagem":"Produto não excluido" } ``` </details> ## Deploy da aplicação A aplicação estará rodando na url https://vast-teal-yak-hem.cyclic.app/, lá será possível testar os endpoints.