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).
- 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
-
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
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;$ git clone https://github.com/andersonaguia/expenses-api.gitRenomeie 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'
$ npm install$ npm run migration:run# development
$ npm run start
# watch mode
$ npm run start:dev
# production mode
$ npm run start:prod# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:covPara realizar chamadas para os endpoints você pode utilizar o Insomnia importando o arquivo /public/insomnia/insomnia.json
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!"
}
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"
}
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"
}
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"
}
]
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"
}
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"
}
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"
}
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"
}
]
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"
}
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"
}
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"
}
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"
},
]
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"
}
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"
}
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"
}
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"
}
}
]
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"
}
}
]
API-Expenses está sob licença MIT.