{"id":17782177,"url":"https://github.com/santiagomorais/modulo-2-node-rocketseat","last_synced_at":"2026-04-12T00:40:30.322Z","repository":{"id":258417657,"uuid":"873888996","full_name":"SantiagoMorais/modulo-2-node-rocketseat","owner":"SantiagoMorais","description":"API Rest Node - Transações bancárias","archived":false,"fork":false,"pushed_at":"2024-10-24T17:07:25.000Z","size":413,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-07T13:18:53.851Z","etag":null,"topics":["fastify","nodejs","postgresql","sqlite","vitest","zod"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SantiagoMorais.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-16T22:30:06.000Z","updated_at":"2024-10-24T17:07:29.000Z","dependencies_parsed_at":"2024-10-22T19:22:05.429Z","dependency_job_id":null,"html_url":"https://github.com/SantiagoMorais/modulo-2-node-rocketseat","commit_stats":null,"previous_names":["santiagomorais/modulo-2-node-rocketseat"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SantiagoMorais%2Fmodulo-2-node-rocketseat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SantiagoMorais%2Fmodulo-2-node-rocketseat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SantiagoMorais%2Fmodulo-2-node-rocketseat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SantiagoMorais%2Fmodulo-2-node-rocketseat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SantiagoMorais","download_url":"https://codeload.github.com/SantiagoMorais/modulo-2-node-rocketseat/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246709932,"owners_count":20821297,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastify","nodejs","postgresql","sqlite","vitest","zod"],"created_at":"2024-10-27T05:04:08.105Z","updated_at":"2026-04-12T00:40:30.286Z","avatar_url":"https://github.com/SantiagoMorais.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API Rest Node.JS de Transações\n\n## Sumário\n\n- [Imagens](#imagens)\n- [Bibliotecas](#bibliotecas)\n- [Requisitos da aplicação](#requisitos-da-aplicação)\n- [Funcionalidades do projeto](#funcionalidades-do-projeto)\n  - [Criação do banco de dados utilizando `knex`](#criação-do-banco-de-dados-utilizando-knex)\n  - [Migration](#migration)\n  - [Configurando a migrations](#configurando-a-migrations)\n  - [Configurando .env com zod](#configurando-env-com-zod)\n- [Rotas](#rotas)\n  - [POST - criar nova transação](#post---criar-nova-transação)\n  - [GET - listar todas as transações](#get---listar-todas-as-transações)\n  - [GET - Retornar uma transação pelo ID](#get---retornar-uma-transação-pelo-id)\n  - [GET - Retornar resumo da conta](#get---retornar-resumo-da-conta)\n- [Como rodar o projeto](#como-rodar-o-projeto)\n- [Autor](#autor)\n\n## Imagens\n\n![conexão com banco de dados via insomnia](src/assets/imgs/banner.png)\n\n## Bibliotecas\n\n### Bibliotecas de produção\n\n- [Fastify](https://fastify.dev): Framework web para Node.js usado para criar APIs e servidores HTTP (similar ao Express.js) e possio suporte à tipagem TypeScript.\n\n- [Knex](https://knexjs.org): **SQL query builder** utilizado para simplificar a linguagem sql. É um construtor de queries, que facilita a escrita do código usando javascript. Similar a um ORM.\n\n- [dotenv](https://www.npmjs.com/package/dotenv): Dotenv carrega variáveis ambiente de um arquivo .env ao `process.env` em aplicações Node.js.\n\n- [zod](https://zod.dev/): Biblioteca de validação de esquemas e dados, garantindo a segurança dos dados.\n\n- [Fastify-type-provider-zod](https://github.com/turkerdev/fastify-type-provider-zod): Integra o **Zod** com o **Fastify**, permitindo validar e tipar dados das requisições HTTP para evitar erros. Usa validações do Zod para definir e validar o `body`, `params`, `query` e `headers` das requisições.\n\n- [@fastify/cookie](https://github.com/fastify/fastify-cookie): Um plugin para o Fastify que adiciona suporte para ler e definir cookies.\n\n- [pg](https://node-postgres.com): Driver do banco de dados do PostgreSQL.\n\n### Bibliotecas de desenvolvimento\n\n- [ESLint](https://eslint.org/): Ferramenta para análise de código, responsável por identificar erros e inconsistências, como variáveis não utilizadas ou não declaradas.\n\n- [Prettier](https://prettier.io/): Ferramenta de formatação de código como indentação, espaçamento, uso de aspas simples ou duplas, etc, garantindo consistência no estilo do código.\n\n- [Vitest](https://vitest.dev): Um framework de test nativo do vite, mas mais rápido que Jest. Apesar disso, a migração do Jest ao Vitest é simples, pois a sintaxe é extremamente similar.\n\n- [Supertest](https://www.npmjs.com/package/supertest): A motivação com este módulo é fornecer uma abstração de alto nível para testar HTTP, ao mesmo tempo que permite acessar a API de nível inferior fornecida pelo `superagent`. Ou seja, testar o servidor sem precisar rodá-lo em uma porta específica, evitando conflitos.\n\n- [@types/supertest](https://www.npmjs.com/package/@types/supertest): Vinculação do supertest ao Typescript, já que ele foi escrito exclusivamente com Javascript\n\n- [tsup](https://tsup.egoist.dev): Ferramenta para otimizar projetos TypeScript, permitindo realizar o build (converter TS em JS) de forma eficiente. Além disso, assim como Vitest e TSX, ele utiliza o **esbuild**, que acelera processos e facilita o desenvolvimento com TypeScript de maneira moderna.\n\n- [sqlite3](https://www.sqlite.org): Driver do banco de dados do SQLite.\n\n## Requisitos da aplicação\n\n- **RF (Requisitos funcionais)**\n\n  - [ X ] O usuário deve poder criar uma nova transação.\n  - [ X ] O usuário deve poder obter um resumo da sua conta.\n    - Valor total das somas e subtrações entre transações.\n  - [ X ] O usuário deve poder listar todas as transações que já ocorreram.\n  - [ X ] O usuário deve poder visualizar uma transação única\n\n- **RN (Regras de negócio)**\n\n  - [ X ] A transação pode ser do tipo .**crédito** que somará ao valor total, ou **débito** que irá subtrair.\n  - [ X ] Deve ser possível identificarmos o usuário entre as requisições;\n  - [ X ] O usuário só pode visualizar transações o qual ele criou.\n\n- **RNF (Requisitos não funcionais)**\n\n## Funcionalidades do projeto\n\n### Criação do banco de dados utilizando `knex`\n\n```ts\nimport setupKnex from \"knex\";\nimport type { Knex } from \"knex\";\n\nexport const config: Knex.Config = {\n  client: \"sqlite\",\n  connection: {\n    filename: \"db-url\",\n  },\n  migrations: {\n    extension: \"ts\",\n    directory: \"./db/migrations\",\n  },\n  useNullAsDefault: true,\n};\n\nexport const knex = setupKnex(config);\n```\n\nConfigurações iniciais do banco de dados e da migrations. Nossa config precisa ser separada, pois ela será usada para criarmos a migration. Já o `knex` será a conexão com o banco.\n\n### Migration\n\nCriar o arquivo `knexfile.ts` na raiz do projeto. Essa estrutura é importante para que o `knex` saiba quais são nossas configurações do banco.\n\n```ts\nimport { config } from \"./src/database.js\";\n\nexport default config;\n```\n\nCriar um script para usar o `tsx` junto do `knex`\n\n```json\n    \"knex\": \"tsx ./node_modules/knex/bin/cli.js --knexfile=knexfile.ts\"\n```\n\nAgora é possível criar a migration com `npm run knex -- migrate:make create-transactions`\nO nome da migration precisa fazer sentido com qual alteração quero fazer no banco de dados.\n\n### Configurando a migrations\n\n```ts\nimport type { Knex } from \"knex\";\n\nexport async function up(knex: Knex): Promise\u003cvoid\u003e {\n  await knex.schema.createTable(\"transactions\", (table) =\u003e {\n    table.uuid(\"id\").primary();\n    table.text(\"title\").notNullable();\n  });\n}\n\nexport async function down(knex: Knex): Promise\u003cvoid\u003e {\n  await knex.schema.dropTable(\"transactions\");\n}\n```\n\n- up: A função up define o que será feito no banco, assim como os campos da tabela, a criação das tabelas, etc.\n  - - Executar a criação da tabela: `npm run knex -- migrate:latest`.\n- down: Faz exatamente o oposto do up, para caso precisemos refazer uma ação gerada pelo up. Exemplo, se for criado uma tabela, o down a deleta.\n  - Refazer a ação da migration executada pelo up: `npm run knex -- migrate:rollback`.\n\n### Configurando .env com zod\n\nInstalar o `zod` e configurar o `envSchema` e utilizá-lo dentro do nosso banco de dados.\n\n```ts\nimport { z } from \"zod\";\nimport \"dotenv/config\";\n\nconst envSchema = z.object({\n  DATABASE_URL: z.string(),\n});\n\nexport const env = envSchema.parse(process.env);\n```\n\n## Rotas\n\n### POST - criar nova transação:\n\n- Rota: `\"/transactions\"`\n- Método: `POST`\n- Objetivo: Criar uma nova transação e registrá-la no banco de dados\n\n**Dados a serem enviados no corpo da requisição**\n\n```json\n{\n  \"title\": \"Freelancer\",\n  \"amount\": 2300,\n  \"type\": \"credit\"\n}\n```\n\n**Tipagem dos dados a serem enviados**\n\n```ts\n    {\n      schema: {\n        body: z.object({\n          title: z.string().min(2).max(30),\n          amount: z.number().min(0.1),\n          type: z.enum([\"credit\", \"debit\"]),\n        }),\n      },\n    },\n```\n\n### GET - listar todas as transações\n\n- Rota: `\"/transactions\"`\n- Método: `GET`\n- Objetivo: Listar as transações do usuário\n\n**Estrutura dos dados recebidos**\n\n```js\n{\n\t\"total\": 2,\n\t\"transactions\": [\n\t\t{\n\t\t\t\"id\": \"0490f1b9-4a84-439b-9c29-bbd33fc76447\",\n\t\t\t\"title\": \"Transação de teste\",\n\t\t\t\"amount\": 1000,\n\t\t\t\"created_at\": \"2024-10-17 22:14:05\",\n\t\t\t\"session_id\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": \"80ce5a74-4642-4fc3-b78e-00e3504fbdcc\",\n\t\t\t\"title\": \"Freelancer\",\n\t\t\t\"amount\": 2300,\n\t\t\t\"created_at\": \"2024-10-18 12:34:00\",\n\t\t\t\"session_id\": null\n\t\t}\n\t]\n}\n```\n\n### GET - retornar uma transação pelo ID\n\n- Rota: `\"/transactions/:id\"`\n- Método: `GET`\n- Objetivo: Retornar uma transação em específico pelo ID\n\n**Estrutura dos dados recebidos**\n\n```json\n{\n  \"transaction\": {\n    \"id\": \"0490f1b9-4a84-439b-9c29-bbd33fc76447\",\n    \"title\": \"Transação de teste\",\n    \"amount\": 1000,\n    \"created_at\": \"2024-10-17 22:14:05\",\n    \"session_id\": null\n  }\n}\n```\n\n### GET - retornar resumo da conta\n\n- Rota: `\"/transactions/summary\"`\n- Método: `GET`\n- Objetivo: Retornar o resumo do saldo do usuário\n\n**Estrutura dos dados recebida**\n\n```json\n{\n  \"summary\": {\n    \"amount\": 2511\n  }\n}\n```\n\n## Como rodar o projeto\n\n1. Instalar as dependências: `npm install`.\n2. Executar a criação da tabela executando as migrations: `npm run knex -- migrate:latest`.\n3. Acessar o arquivo `.env.example`, criar o arquivo `.env` e configurá-lo de acordo com os exemplos.\n4. Inicializar o servidor com `npm run server`.\n\n## Autor\n\n- GitHub - [Felipe Santiago Morais](https://github.com/SantiagoMorais)\n- Linkedin - [Felipe Santiago](https://www.linkedin.com/in/felipe-santiago-873025288/)\n- Instagram - [@felipe.santiago.morais](https://www.instagram.com/felipe.santiago.morais)\n- Email - \u003ca href=\"mailto:contatofelipesantiago@gmail.com\" target=\"blank\"\u003econtatofelipesantiago@gmail.com\u003c/a\u003e\n- \u003ca href=\"https://api.whatsapp.com/send?phone=5531996951033\u0026text=Hi%2C%20Felipe%21%20I%20got%20your%20contact%20from%20your%20portfolio.\"\u003eWhatsapp\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsantiagomorais%2Fmodulo-2-node-rocketseat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsantiagomorais%2Fmodulo-2-node-rocketseat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsantiagomorais%2Fmodulo-2-node-rocketseat/lists"}