Skip to content

andersonaguia/expenses-api

Repository files navigation

Nest Logo

API-Expenses

Descrição

Backend para cadastramento e verificação das despesas de um condomínio misto (Residencial/Comercial) de acordo com a planilha orçamentária anual (POA).


Funcionalidades

  • Cadastro de usuários no sistema
  • Login
  • Criação de Categorias para despesas
  • Busca de todas as Categorias disponíveis
  • Atualizar uma categoria pelo ID
  • Excluir uma categoria pelo ID
  • Criação de Subcategorias para despesas
  • Busca de todas as Subcategorias disponíveis
  • Atualizar uma Subcategoria pelo ID
  • Excluir uma Subcategoria pelo ID
  • Cadastro de novas despesas
  • Busca de todas as despesas cadastradas
  • Atualizar uma categoria pelo ID
  • Excluir comentário de uma despesa pelo ID
  • Excluir uma despesa cadastrada pelo ID
  • Criação de lançamento para uma despesa
  • Busca por lançamentos de despesas por categoria
  • Busca de todos os lançamentos das despesas

Pré-requisitos

  • Ter o MySQL instalado na máquina

  • Ter o NodeJS instalado na máquina

  • Ter o NestJS instalado na máquina

  • Possuir um editor de código. Recomendo o VSCode

  • Possuir um software para realizar requisições para API. Recomendo o Insomnia


Configurando o projeto

Acesse o servidor MySQL através do terminal ou por alguma ferramenta de gerenciamento de banco de dados e crie um banco de dados utilizando o comando abaixo:

$ CREATE DATABASE expenses CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Clone este repositório
$ git clone https://github.com/andersonaguia/expenses-api.git

Renomeie o arquivo .env.example da raiz do projeto para .env e substitua os dados necessários para acessar o banco que você acabou de criar

# MYSQL
DB_DIALECT=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USER="your username"
DB_PASS="your password"
DB_NAME="expenses"

JWT_SECRET='your_jwt_secret'

Instale as dependências

$ npm install

Instale as migrations

$ npm run migration:run

Rodando a aplicação

# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod

Teste

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

Endpoints Disponíveis

Para realizar chamadas para os endpoints você pode utilizar o Insomnia importando o arquivo /public/insomnia/insomnia.json

Cadastrar Usuário

POST: http://localhost:3000/auth/signup
Headers: {
	"Content-Type": "application/json"
}

Body: {
  "name": "Anderson Aguiar",
	"occupation": "Técnico em Automação",
	"email": "email@email.com",
	"password": "12A345a#",
	"passwordConfirmation": "12A345a#",
	"role": "admin"
}

*O parâmetro role é opcional e por default preenche o dado no banco como USER. Os valores disponíveis para esse parâmetro são:

ADMIN = 'admin',
TRUSTEE = 'sindico',
MANAGER = 'gerente',
SUPERVISOR = 'supervisor',
USER = 'usuario',

Retorno

{
	"statusCode": 201,
	"message": "Cadastro realizado com sucesso!"
}

Login

POST: http://localhost:3000/auth/signin
Headers: {
	"Content-Type": "application/json"
}

Body: {
  "email": "email@email.com",
	"password": "12A345a#"	
}

Retorno

{
	"statusCode": 200,
	"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkFuZGVyc29uIEFndWlhciIsInJvbGUiOiJhZG1pbiIsImVtYWlsIjoibWFudXRlbmNhb0Bjb25kb21pbmlvc29sYXJ0YW1iYXUuY29tLmJyIiwiaWF0IjoxNjgzMzAwNzc2LCJleHAiOjE2ODMzMjIzNzZ9.kF4G3f8rYA2jdkMuAMQq2tHnJEPQ6R_V-Y5eidsWI-w"
}

Criar Categoria

POST: http://localhost:3000/category/create
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "name": "DESPESAS BANCÁRIAS",
	"monthlyCost": 100,
	"annualCost": 1200
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**O parâmetro name está configurado no banco de dados como unique então nunca poderá ser duplicado.

Retorno

{
	"statusCode": 201,
	"message": "Categoria criada com sucesso"
}

Buscar todas as categorias

POST: http://localhost:3000/category/findall
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint está acessível para todos os usuários cadastrados.

Retorno

[
	{
		"id": 1,
		"name": "DESPESAS BANCÁRIAS",
		"monthlyCost": 100,
		"annualCost": 1200,
		"createdAt": "2023-05-05T15:14:03.248Z",
		"modifiedBy": "Anderson Aguiar"
	}
]

Atualizar uma categoria

POST: http://localhost:3000/category/update/1
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "name": "",
	"monthlyCost": 36147.76,
	"annualCost": 433773.15
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da categoria como PARAM da requisição.

***Todos os parâmetros do Body estão definidos como IsOptional então você pode enviar individualmente apenas o dado que deseja atualizar.

Retorno

{
	"statusCode": 200,
  "message": "Dados atualizados com sucesso"
}

Excluir uma categoria

POST: http://localhost:3000/category/delete/1
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da categoria como PARAM da requisição.

***Só será possível realizar a exclusão de uma categoria se não houverem despesas cadastradas que referenciem esta categoria.

Retorno

{
	"statusCode": 200,
	"message": "Dados excluídos com sucesso"
}

Criar subcategoria

POST: http://localhost:3000/subcategory/create
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "name": "remuneração",
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**O parâmetro name está configurado no banco de dados como unique então nunca poderá ser duplicado.

Retorno

{
	"statusCode": 201,
	"message": "Subcategoria criada com sucesso"
}

Buscar todas as subcategorias

POST: http://localhost:3000/subcategory/findall
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint está acessível para todos os usuários cadastrados.

Retorno

[
	{
		"id": 1,
		"name": "REMUNERAÇÃO",
		"createdAt": "2023-05-05T16:04:24.127Z",
		"modifiedBy": "Anderson Aguiar"
	}
]

Atualizar uma subcategoria

POST: http://localhost:3000/subcategory/update/1
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "name": "salário",
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da subcategoria como PARAM da requisição.

***É obrigatório o preenchimento do campo name para atualização de uma subcategoria.

Retorno

{
	"statusCode": 200,
  "message": "Dados atualizados com sucesso"
}

Excluir uma subcategoria

POST: http://localhost:3000/subcategory/delete/1
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da subcategoria como PARAM da requisição.

***Só será possível realizar a exclusão de uma subcategoria se não houverem despesas cadastradas que referenciem esta subcategoria.

Retorno

{
	"statusCode": 200,
	"message": "Dados excluídos com sucesso"
}

Cadastrar uma nova despesa

POST: http://localhost:3000/expense/create
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "currentYear": 2023,
	"name": "Salário",
	"categoryId": 1,
	"subcategoryId": null,
	"comments": "Comentário opcional",
	"residentialPercentage": 90,
	"commercialPercentage": 10,
	"monthlyExpense": 20710,
	"annualExpense": 248520,
	"residentialMonthExpense": 18639,
	"commercialMonthExpense": 2071
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**O parâmetro name está configurado no banco de dados como unique então nunca poderá ser duplicado. ***O parâmetro comments é opcional. ****O parâmetro subcategoryId deve ser preenchido como null caso a despesa cadastrada não possua uma subcategoria.

Retorno

{
	"statusCode": 201,
	"message": "Despesa criada com sucesso"
}

Buscar todas as despesas cadastradas

POST: http://localhost:3000/expense/findall
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint está acessível para todos os usuários cadastrados.

Retorno

[
	{
		"id": 1,
		"currentYear": 2023,
		"name": "Salário",
		"comments": "Comentário opcional",
		"residentialPercentage": 90,
		"commercialPercentage": 10,
		"monthlyExpense": 20710,
		"annualExpense": 248520,
		"residentialMonthExpense": 18639,
		"commercialMonthExpense": 2071,
		"category": {
			"id": 1,
			"name": "DESPESAS BANCÁRIAS"
		},
		"subcategory": null,
		"createdAt": "2023-05-05T15:14:35.964Z",
		"modifiedBy": "Anderson Aguiar"
	},
]

Atualizar uma despesa

POST: http://localhost:3000/expense/update/3
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "comments": "Este é um comentário atual sobre a despesa",
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da despesa como PARAM da requisição.

***É obrigatório o preenchimento do campo comments para atualização de uma despesa.

Retorno

{
	"statusCode": 200,
  "message": "Dados atualizados com sucesso"
}

Excluir uma despesa

POST: http://localhost:3000/expense/delete/3
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER.

**É obrigatório o envio do ID da despesa como PARAM da requisição.

***Só será possível realizar a exclusão de uma despesa se não houverem lançamentos cadastrados que referenciem esta despesa.

Retorno

{
	"statusCode": 200,
	"message": "Dados excluídos com sucesso"
}

Realizar um novo lançamento

POST: http://localhost:3000/evolution/create
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

Body: {
  "expenseId": 1,
	"lastPayment": 12.50,
	"currentMonthlyCash": 90,
	"currentAnnualCash": 1000
}

*Este endpoint só pode ser acessado por usuários cadastrados como ADMIN, TRUSTEE e MANAGER. **Todos os campos do Body são obrigatórios.

Retorno

{
	"statusCode": 201,
	"message": "Dados adicionados com sucesso"
}

Buscar todas os lançamentos cadastrados

POST: http://localhost:3000/evolution/findall
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint está acessível para todos os usuários cadastrados.

Retorno

[
	{
		"id": 1,
		"createdAt": "2023-05-05T15:16:03.491Z",
		"lastPayment": 12.5,
		"currentAnnualCash": 1000,
		"currentMonthlyCash": 90,
		"expense": {
			"id": 1,
			"currentYear": 2023,
			"name": "Salário",
			"monthlyExpense": 20710,
			"annualExpense": 248520,
			"category": {
				"id": 1,
				"name": "DESPESAS BANCÁRIAS"
			},
			"subcategory": null
		},
		"modifiedBy": {
			"id": 1,
			"name": "Anderson Aguiar"
		}
	}
]

Buscar todas os lançamentos pela categoria

POST: http://localhost:3000/evolution/find/1
Headers: {
	"Content-Type": "application/json"
  "Authorization: "Bearer token"
}

*Este endpoint está acessível para todos os usuários cadastrados. **É obrigatório o envio do ID da categoria como PARAM da requisição.

Retorno

[
	{
		"id": 1,
		"createdAt": "2023-05-05T15:16:03.491Z",
		"lastPayment": 12.5,
		"currentAnnualCash": 1000,
		"currentMonthlyCash": 90,
		"expense": {
			"id": 1,
			"currentYear": 2023,
			"name": "Salário",
			"monthlyExpense": 20710,
			"annualExpense": 248520,
			"category": {
				"id": 1,
				"name": "DESPESAS BANCÁRIAS"
			},
			"subcategory": null
		},
		"modifiedBy": {
			"id": 1,
			"name": "Anderson Aguiar"
		}
	}
]

Autor

Anderson Aguiar

logo Linkedin logo Gmail logo Instagram

Licença

API-Expenses está sob licença MIT.

About

Api para controle de despesas

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published