https://github.com/aszurar/dtmoney-back
O objetivo desse projeto é começarmos a usar micro-frameworks para criação de APIs Rest, e entendermos como podemos aplicar os conceitos básicos de APIs com essas ferramentas.
https://github.com/aszurar/dtmoney-back
fastify javascript knex knexjs node nodejs postgres postgresql sqlite sqlite3 typescript
Last synced: 2 months ago
JSON representation
O objetivo desse projeto é começarmos a usar micro-frameworks para criação de APIs Rest, e entendermos como podemos aplicar os conceitos básicos de APIs com essas ferramentas.
- Host: GitHub
- URL: https://github.com/aszurar/dtmoney-back
- Owner: Aszurar
- Created: 2024-11-25T17:36:56.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-17T15:45:55.000Z (over 1 year ago)
- Last Synced: 2025-04-04T09:45:54.558Z (about 1 year ago)
- Topics: fastify, javascript, knex, knexjs, node, nodejs, postgres, postgresql, sqlite, sqlite3, typescript
- Language: TypeScript
- Homepage: https://dtmoney-back.onrender.com
- Size: 282 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# #03 - Node
## Rotas e HTTP
- Esse projeto foi feito a partir do 2º módulo do curso de Formação Node.js da Rocketseat.
[](https://nodejs.org/pt) [](https://www.typescriptlang.org/) [](https://fastify.dev/) [](https://render.com/) [](https://insomnia.rest/)
---
https://github.com/user-attachments/assets/465d7143-6778-464f-8201-08019b67a470
**[Vídeo no Youtube](https://www.youtube.com/watch?v=znaEYHAKSW4)**
---
## :information_source: Sobre
- Esse é o 2º projeto do curso Formação Node.js da Rocketseat, onde devemos criar uma API simples de criação, atualização e remoção de transações financeiras.
- O objetivo desse projeto é começarmos a usar **micro-frameworks para criação de APIs Rest**, e entendermos como podemos aplicar os conceitos básicos de APIs com essas ferramentas.
- Assim, nesse projeto usamos o **Fastify em conjunto com o knex para conexão com um banco de dados SQLite**, criamos rotas para manipulação de transações financeiras com persistência de dados e realizamos o deploy da aplicação.
- Além disso, abordamos as formas de conexões com banco de dados que podemos utilizar como:
1. Drives Nativos
2. Query Builders
3. ORMs
- Acabamos por escolher o **Query Builder Knex**, é o Query builder mais famoso do ambiente NodeJS, permite **escrever queries SQL de forma mais simples e mais próxima do JavaScript**, sendo uma porta de entrada fácil para lidar com conexão com Banco de dados, além de ser uma ferramenta que nos permite mudar de banco de dados sem muita complexidade, e com isso, usamos o SQLite para desenvolvimento e o Postgres para o ambiente de produção/deploy.
- Por fim, nesse projeto, também abordamos **testes End to End com o auxílio do Vitest e Supertest**, para testarmos todas nossas rotas e garantirmos que elas estão funcionando corretamente.
- Tecnologias principais:
1. Fastify:
- Ferramenta que **auxilia** na **criação de rotas**, não **vai opinar sobre qual banco de dados usar**, qual **template engine usar**, ou **qual estrutura de pastas vamos usar**, etc. Ele é focado em ser totalmente **flexível** e em **facilitar** a criação de rotas para uma API Rest.
- Além disso, ele naturalmente entende o TypeScript e lida muito bem com assincronismo do JavaScript.
2. Knex:
- Realiza a **conexão** com **Banco de dado** e nos permite escrever queries SQL de forma mais **simples** e mais **próxima** do JavaScript.
- Conexão feita com **SQLite** para desenvolvimento e **Postgres** para produção/deploy.
3. Bancos de dados
1. SQLite:
- Banco de dados utilizado para **desenvolvimento**, muito simples e fácil de se lidar para pequenos projetos, além de **simular** um banco de dados **relacional**.
2. Postgres:
- Banco de dados utilizado para **produção**/**deploy**, muito robusto e escalável, além de ser um **banco de dados relacional**.
4. Render:
- Publicarmos nossa API na plataforma **[Render](https://render.com/)**, que é uma plataforma de deploy que nos permite publicar aplicações de forma **simples** e **rápida**, além de ser **gratuita** para **pequenos projetos**.
---
## :dizzy: Funcionalidades
1. Criamos um servidor HTTP com o **Fastify**;
2. Configuramos o Knex no projeto para conexão com o banco de dados SQLite e Postgres;
3. Criamos as estruturas dos Bancos por maio das Migrations com o Knex.
4. Com a instância do Fastify, criamos rotas para manipulação das transações em conjunto com plugins, com os seguintes métodos:
1. **```GET - /transactions```** => Listagem de todas transações.
2. **```GET - /transactions/:id```** => Busca da transação pelo id.
3. **```GET - /transactions/balance```** => Cálculo do saldo do usuário.
4. **```POST - /transactions```** => Criação de uma nova transação recebendo **title**, **amount** e **type** no corpo da requisição, e adicionando os campos **```id```**, **```created_at```** e **```session_id```**.
5. **```DELETE - /transactions/:id```** => Remoção de uma transação de acordo com o id enviado via route params.
6. **```DELETE - /transactions/```** => Exclusão de **todas** transações.
5. Todas as transações acima, **realizam suas ações de acordo com o session_id**, que é um **identificador único para cada sessão**, simulando um usuário logado que vai estar aplicado nos Cookies das requisições.
1. Caso o usuário **não** tenha um **session_id**, ele é criado **automaticamente com a requisição de cadastrar uma nova transação**, e já é aplicado nos Cookies para as próximas requisições.
6. Em todas transações que **dependem de algum parâmetro** seja pelo **corpo** ou **route params**, temos **validações feitas pelo ZOD**, para garantir que os dados estão sendo enviados corretamente.
7. Além disso, criamos um **middleware** para **validar** o **```session_id```** em todas rotas, garantindo **acessar** os dados de acordo com o "usuário logado".
8. Realizamos testes End to End em todas as rotas por meio do Vitest e Supertest, garantindo que todas as rotas estão funcionando corretamente.
---
## :seedling: Requisitos Mínimos
1. NodeJS
2. PostgreSQL
---
## :rocket: Tecnologias Utilizadas
- O projeto foi desenvolvido utilizando as seguintes tecnologias:
1. **[dotenv](https://www.npmjs.com/package/dotenv)**
2. **[Fastify](https://fastify.dev/)**
3. **[Knex](http://knexjs.org/)**
4. **[NodeJS](https://nodejs.org/pt)**
5. **[Postgres](https://www.postgresql.org/)**
6. **[SQLite](https://www.sqlite.org/index.html)**
7. **[Supertest](https://www.npmjs.com/package/supertest)**
8. **[tsx](https://www.npmjs.com/package/tsx)**
9. **[tsup](https://tsup.egoist.dev)**
10. **[TypeScript](https://www.typescriptlang.org/)**
11. **[Vitest](https://www.npmjs.com/package/vitest)**
12. **[Zod](https://zod.dev/)**
---
## :package: Como baixar e executar o projeto
### Baixar
- Clonar o projeto:
```bash
git clone https://github.com/Aszurar/dtmoney-back.git
```
- É necessário ter o Node.js instalado na máquina assim como todas **tecnologias**/**dependências** citadas acima.
- [Instalação do NodeJS](https://nodejs.org/en/)
### Instalação das dependências
```bash
pnpm i
```
### Variáveis de ambiente
- Lembre-se de configurar a .env(**variáveis de ambiente**) antes de rodar o projeto
### Execução das migrations
- Lembre-se de executar as migrations antes de rodar o projeto
```bash
pnpm knex -- migrate:latest
```
### Execução
- Caso tudo tenha sido instalado com sucesso, basta executar na raiz do projeto:
```bash
pnpm dev
```
- Após isso, basta realizar requisições de acordo com as rotas definidas no arquivo `src/routes.js` utilizando o **[Insomnia](https://insomnia.rest/)**, **[Postman](https://www.postman.com/)** ou via terminal com **[httpie](https://httpie.io/)**
Desenvolvido por :star2: Lucas de Lima Martins de Souza.