API_Controle_Financeiro-NodeJS
API Controle Financeiro
Acesse agora
Objetivo
Esta API Rest tem por objetivo fazer o controle financeiro, por meio do cadastro de Receitas e Despesas pessoais. É possível também gerar um relatório mensal mostrando receitas, despesas e saldo final. Desta forma é possível ver os gastos e ter mais controle sobre eles.
As despesas podem ser cadastradas em 8 categorias: "Alimentação", "Saúde", "Moradia", "Transporte", "Educação", "Lazer", "Imprevistos" e "Outros". Os gastos em cada categoria também são exibidas no relatório mensal.
A API conta com um sistema de autenticação de usuários que usa senhas criptografadas e gera tokens de acesso JWT.
Índice
- Objetivo
- Índice
- Instalação / Configuração
3.1. Variável de Ambiente
3.2. Banco de Dados
-3.2.1. Configurando API
-3.2.2. Schemas
-3.2.3. Migrations
-3.2.4. Triggers
-3.2.5. Seeders - Iniciando API
- Sistema de Autenticação Usuário
6.1 Redis - Sistema de Envio de E-mails
- Rotas
7.1. Usuários
7.2. Receitas
7.3. Despesas
-7.3.1 Categorias ID
7.4. Relatórios - Documentação Swagger
- Testes
- Front-end
- Contato
Instalando / Configurando
Para instalar as dependências, entre no terminal, vá até o diretório raiz do projeto e execute o comandos abaixo:
npm install
Configurando a Variável de Ambiente
Crie o arquivo .env, no diretório raiz conforme abaixo.
Opções de ambiente "NODE_ENV": Opções "development", "test" ou "production"
Criando "CHAVE_JWT": Esta é a chave de segurança da sua aplicação, usada para gerar tokens de acesso. Como opção, execute o código abaixo pelo terminal no diretório raiz, para gerar uma chave segura:
node -e "console.log( require('crypto').randomBytes(256).toString('base64'))"
- Configurações de envio de e-mail: são usadas para envio de e-mail de confirmação de cadastro e também para recuperação de conta apaga.
NODE_ENV="development"
CHAVE_JWT=""
BASE_URL="localhost:3000"
EMAIL_HOST=""
EMAIL_USUARIO=""
EMAIL_SENHA=""
Caso esteja trabalhando no ambiente "development" ou "test", a API não envia e-mail, apenas gera um link simulando um e-mail.
No ambiente "production" é necessário preencher as configurações de e-mail: "HOST", "USUARIO" e "SENHA".
Banco de dados MySQL
Para o bom funcionamento da API é necessário que o banco de dados esteja de acordo com as funcionalidades da aplicação. Segue abaixo os passo-a-passo para implantar e configurar o banco de dados.
- Configurando o banco de dados na API
Acesse o arquivo api/config/config.json
Configure o acesso ao banco de dados, em cada ambiente: "host", "username", "password" ...
- Schemas
No MySQL, crie o schema conforme abaixo:
CREATE SCHEMA `control_financeiro`;
- Migrations
O sequelize migra as tabelas automaticamente para o bando de dados. Pelo terminal, entre na pasta raiz do projeto e execute os comandos abaixo:
npx sequelize-cli db:migrate
- Triggers
Os triggers são reesposáveis pelos cálculos do relatório mensal com base nos dados das receitas e despesas.
- Seeders
O sequelize preenche algumas colunas com dados, adiciona as triggers e cálculos de colunas geradas. No terminal, entre na pasta raiz do projeto e execute os comandos abaixo:
npx sequelize-cli db:seed:all
Iniciando API
npm run start
Sistema de Autenticação de usuários
- Fazendo login
Recebemos em resposta o "AccessToken" no HEADERS / Authorization, este token nos da acesso a outras rotas e tem validade de 15 minutos.
Recebemos também o "RefreshToken" no "BODY", este token com validade de 2 dias, o objetivo dele é gerar um novo "AccessToken" quando o mesmo tem seu tempo expirado.
O "RefreshToken" é adicionado ao Redis como token ativo.
- Acessando Rotas
Ao acessar uma rota envie o "AccessToken" recebido no login, em HEADERS / Authorization Bearer.
A aplicação verifica se o "AccessToken" esta como bloqueado no Redis, se não estiver, ele da acesso a rota.
- AccessToken Expirado
Ao expirar o tempo do "AccessToken", o mesmo é enviado para o Redis como token bloqueado.
Devemos renovar o "AccessToken" enviando:
No BODY o "RefreshToken". A aplicação verifica se e token esta ativo no Redis.
E resposta receberemos "AccessToken" e "RefreshToken" novos.
O novo "RefreshToken" é adicionado ao Redis como token ativo, o antigo é eliminado.
- Fazendo logout
Ao fazer logout devemos enviar o "AccessToken" no HEADERS / Authorization Bearer e o "RefreshToken" no BODY.
No redis o "AccessToken" é adicionado a lista de bloqueados, e o "RefreshToken" é eliminado da lista de tokens ativos.
Redis
O redis é usado para guardar os tokens com os seguintes prefixos:
allowlist-refresh-token: "RefreshToken" criados no login que estão ativos.
blocklist-acessToken: "AccessTokens" inutilizados por logout.
Sistema de Envio de E-mails
A API envia e-mails de confirmação por meio de "nodemailer" em 2 situações:
Ao criar um novo usuário: O e-mail contém um endereço com um token, ao acessar o cliente verifica que seu email é valido e consegue fazer login na aplicação.
Ao excluir um usuário: O e-mail confirma a exclusão e fornece um link para recuperar a conta em até 5 dias, caso o cliente queira recuperar sua conta.
No ambiente de teste ou desenvolvimento os e-mails não são enviados, é feita apenas uma simulação de envio de email, podemos acessa-la atravez do link gerado no terminal.
Rotas
Usuários
Método | Rotas | Ação |
---|---|---|
POST |
/usuarios/ | Cria Usuário |
GET |
/usuarios/verifica_email/:token | Verificação de E-mail |
POST |
/usuarios/login | Faz Login |
GET |
/usuarios/atualiza_refresh | Atualiza Token Expirado |
PUT |
/usuarios/ | Atualiza dados Usuário |
GET |
/usuarios/logout | Faz Logout |
Receitas
Método | Rotas | Ação |
---|---|---|
POST |
/receitas | Cria Receita |
GET |
/receitas | Lista Receitas |
GET |
/receitas/11/2022 | Busca por mês/ano |
GET |
/receitas?busca=salario | Busca por Descrição |
PUT |
/receitas/:id | Atualiza dados Receita |
DELETE |
/receitas/:id | Apaga Receita |
Despesas
Método | Rotas | Ação |
---|---|---|
POST |
/despesas | Cria Despesa |
GET |
/despesas | Lista Despesas |
GET |
/despesas/11/2022 | Busca por mês/ano |
GET |
/despesas?busca=mercado | Busca por Descrição |
PUT |
/despesas/:id | Atualiza dados Despesa |
DELETE |
/despesas/:id | Apaga Despesa |
Categorias ID
Cada despesa deve ter uma categoria especifica. Segue abaixo a lista das IDs das categorias.
ID | Categoria | . | ID | Categoria |
---|---|---|---|---|
1 | Alimentação | . | 5 | Educação |
2 | Saúde | . | 6 | Lazer |
3 | Moradia | . | 7 | Imprevistos |
4 | Transporte | . | 8 | Outros |
Relatórios
Método | Rotas | Ação |
---|---|---|
GET |
/relatorio | Lista Relatórios |
GET |
/relatorio/05/2023 | Busca por mês/ano |
Documentação Swagger
A documentação contém infomações de requisição e resposta de todas as rotas da aplicação. Nela você poderá interagir diretamente com a API em tempo real.
Acesse agora: http://3.83.226.180/api-docs/
Testes
Resultado dos testes
Foram realizados testes unitários nas rotas e funções importantes usando o Jest.
Acessando resultado dos testes pelo navegador:
/coverage/Icov-report/index.html
Logica de testes
A logica de testes simula um usuário se fazendo login, e em seguida fazendo interações com cada rota.
Foi configurado um servidor para testes na porta 8000 usando os Hooks do Jest, e o Supertest para acessar as rotas.
Segue abaixo o diretório de testes:
/api/test/
Executando testes
- Para executar os testes é necessário criar um schema de testes no banco de dados, desta forma o schema padrão não sofrerá nenhuma alteração.
CREATE SCHEMA `control_finan_test`;
- Fazendo as migrações das tabelas:
npx sequelize-cli db:migrate --env test
- Para fazer os seeders no bando de dados de teste:
Mude a variável de ambiente, no arquivo .env, alterar para "test" (NODE_ENV="test")
npx sequelize-cli db:seed:all
Após o termino, desfazer a alteração da variável de ambiente.
- Teste
No terminal, vá até o diretório raiz da API e digite o comando:
npm run test
Front-end
O framework Bootstrap para estilizar a aplicação.
A biblioteca Jquery foi usada nesta aplicação principalmente para manupulação com o DOM e para fazer requisições com Ajax.