{"id":27430952,"url":"https://github.com/joschonarth/refund-api","last_synced_at":"2026-04-11T03:03:26.786Z","repository":{"id":287096837,"uuid":"956235609","full_name":"joschonarth/refund-api","owner":"joschonarth","description":"💸 A RESTful API for controlling and managing refund requests, built with Node.js, TypeScript, and Express.","archived":false,"fork":false,"pushed_at":"2025-04-10T19:05:15.000Z","size":276,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-03T13:16:35.466Z","etag":null,"topics":["bcrypt","cors","dotenv","eslint","express","jwt","multer","nodejs","prisma","refund","sqlite","typescript","zod"],"latest_commit_sha":null,"homepage":"https://github.com/joschonarth/refund-web","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/joschonarth.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,"zenodo":null}},"created_at":"2025-03-27T23:17:51.000Z","updated_at":"2025-04-10T19:05:20.000Z","dependencies_parsed_at":"2025-04-14T15:17:22.468Z","dependency_job_id":"08811659-bb85-47b3-8ed6-fba4f86df746","html_url":"https://github.com/joschonarth/refund-api","commit_stats":null,"previous_names":["joschonarth/refund-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/joschonarth/refund-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Frefund-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Frefund-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Frefund-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Frefund-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joschonarth","download_url":"https://codeload.github.com/joschonarth/refund-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Frefund-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31667034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["bcrypt","cors","dotenv","eslint","express","jwt","multer","nodejs","prisma","refund","sqlite","typescript","zod"],"created_at":"2025-04-14T15:17:16.965Z","updated_at":"2026-04-11T03:03:26.754Z","avatar_url":"https://github.com/joschonarth.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003cimg src=\"./assets/icon.svg\" width=\"22\" /\u003e Refund API\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e💸 Uma API RESTful para controle e gerenciamento de pedidos de reembolso, construída com Node.js, TypeScript e Express.\n  \u003cbr/\u003e\u003cbr/\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/joschonarth/refund-api?style=for-the-badge\u0026color=1F8459\u0026labelColor=1C1E26\" alt=\"last-commit\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/top/joschonarth/refund-api?style=for-the-badge\u0026color=1F8459\u0026labelColor=1C1E26\" alt=\"top-language\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/count/joschonarth/refund-api?style=for-the-badge\u0026color=1F8459\u0026labelColor=1C1E26\" alt=\"languages-count\"\u003e\n\u003c/p\u003e\n\n## 📑 Índice\n\n- [📖 Visão Geral](#-visão-geral)\n- [🛠️ Tecnologias Utilizadas](#️-tecnologias-utilizadas)\n- [⚙️ Funcionalidades](#️-funcionalidades)\n- [🚀 Como Executar o Projeto](#-como-executar-o-projeto)\n  - [📋 Pré-requisitos](#-pré-requisitos)\n  - [🔧 Instalação](#-instalação)\n  - [▶️ Execução](#️-execução)\n- [📡 Rotas da Aplicação](#-rotas-da-aplicação)\n- [🌐 Front-End](#-front-end)\n- [🤝 Contribuições](#-contribuições)\n- [⭐ Apoie este Projeto](#-apoie-este-projeto)\n- [📞 Contato](#-contato)\n\n## 📖 Visão Geral\n\nRefund é uma aplicação completa para gerenciamento de pedidos de reembolso, permitindo que usuários façam upload de comprovantes e acompanhem seus pedidos. Este repositório contém o back-end da aplicação, uma API RESTful robusta e segura, construída com Node.js e TypeScript, utilizando uma stack moderna e modularizada.\n\n## 🛠️ Tecnologias Utilizadas\n\n- 🟩 Node.js - Ambiente de execução JavaScript no servidor.\n- 🟦 TypeScript - Superset do JavaScript com tipagem estática.\n- ⚙️ Express - Framework web minimalista e flexível.\n- 🧩 Prisma - ORM moderno para manipulação de banco de dados.\n- 🗃️ SQLite - Banco de dados leve e embutido.\n- 💎 Zod - Validação de esquemas de dados.\n- 🔐 JWT - Autenticação via tokens seguros.\n- 🔑 Bcrypt - Criptografia de senhas.\n- 🌐 CORS - Compartilhamento de recursos entre origens.\n- 📤 Multer - Upload de arquivos multipart/form-data.\n- 🌱 Dotenv - Gerenciamento de variáveis de ambiente.\n- 🧹 ESLint - Padronização e análise de código.\n\n## ⚙️ Funcionalidades\n\n- **👤 Criar usuário**: Registra um novo usuário na aplicação.\n- **🔐 Login**: Autentica um usuário e retorna um token JWT.\n\n- **💸 Criar pedido de reembolso**: Cadastra uma nova solicitação com dados e comprovante.\n- **📋 Listar reembolsos**: Retorna todos os reembolsos solicitados pelo usuário.\n- **🔎 Visualizar reembolso**: Detalha um reembolso específico.\n\n- **📤 Enviar comprovante**: Realiza upload de arquivos como comprovantes de reembolso.\n- **🧾 Buscar comprovante**: Retorna o arquivo enviado.\n\n## 🚀 Como Executar o Projeto\n\n### 📋 Pré-requisitos\n\n- 🟩 [Node.js 20](https://nodejs.org/en/download/)\n- 📦 [npm 10](https://www.npmjs.com/)\n\n### 🔧 Instalação\n\n1. Clone o repositório:\n\n    ```bash\n    git clone https://github.com/joschonarth/refund-api.git\n    ```\n\n2. Acesse o diretório do projeto:\n\n    ```bash\n    cd refund-api\n    ```\n\n3. Instale as dependências:\n\n    ```bash\n    npm install\n    ```\n\n### ▶️ Execução\n\n1. Crie um arquivo `.env` a partir do exemplo:\n\n    ```bash\n    cp .env.example .env\n    ```\n\n    Edite o arquivo `.env` para configurar as variáveis de ambiente necessárias.\n\n2. Execute as migrações do Prisma:\n\n    ```bash\n    npx prisma migrate dev\n    ```\n\n3. Inicie a API:\n\n    ```bash\n    npm run dev\n    ```\n\nA aplicação estará disponível em: [http://localhost:3333](http://localhost:3333)\n\n## 📡 Rotas da Aplicação\n\n### 👤 Criar Usuário\n\nRegistra um novo usuário no sistema.\n\n- **Método:** ``POST``  \n- **URL:** `/users`\n- **Role:** `employee`\n\n- **Exemplo de Requisição:**\n\n```json\n{\n  \"name\": \"John Doe\",\n  \"email\": \"johndoe@example.com\",\n  \"password\": \"123456\"\n}\n```\n\n### 🔐 Login\n\nAutentica o usuário e retorna um token JWT.\n\n- **Método:** ``POST``  \n- **URL:** `/sessions`\n- **Role:** `employee`\n\n- **Exemplo de Requisição:**\n\n```json\n{\n  \"email\": \"johndoe@example.com\",\n  \"password\": \"123456\"\n}\n```\n\n- **Exemplo de Resposta:**\n\n```json\n{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"user\": {\n    \"id\": \"eac522fb-6c33-4676-9925-22fd483e45bf\",\n    \"name\": \"John Doe\",\n    \"email\": \"johndoe@example.com\",\n    \"role\": \"employee\",\n    \"createdAt\": \"2025-03-29T19:27:29.365Z\",\n    \"updatedAt\": \"2025-03-29T19:27:29.365Z\"\n  }\n}\n```\n\n### 💸 Criar Reembolso\n\nCadastra uma nova solicitação de reembolso.\n\n- **Método:** ``POST``  \n- **URL:** `/refunds`  \n- **Autenticação:** Requer token JWT no header `Authorization: Bearer`\n- **Role:** `employee`\n\n- **Exemplo de Requisição:**\n\n```json\n{\n  \"name\": \"Reembolso Uber\",\n  \"category\": \"transport\",\n  \"amount\": 45.90,\n  \"filename\": \"8a744cc981b36e5c2734-comprovante.png\"\n}\n```\n\n- **Exemplo de Resposta:**\n\n```json\n{\n  \"id\": \"65cc4911-0868-4954-aef8-f058e410d513\",\n  \"name\": \"Reembolso Uber\",\n  \"amount\": 45.9,\n  \"category\": \"transport\",\n  \"filename\": \"8a744cc981b36e5c2734-comprovante.png\",\n  \"userId\": \"de837ea6-8080-4506-9e5a-0f7e6df7d1cf\",\n  \"createdAt\": \"2025-04-09T22:21:51.700Z\",\n  \"updatedAt\": \"2025-04-09T22:21:51.700Z\"\n}\n```\n\n### 📋 Listar Reembolsos\n\nRetorna todos os reembolsos do usuário autenticado.\n\n- **Método:** ``GET``  \n- **URL:** `/refunds`  \n- **Autenticação:** Requer token JWT no header `Authorization: Bearer`\n- **Role:** `manager`\n\n- **Exemplo de Resposta:**\n\n```json\n{\n  \"refunds\": [\n    {\n      \"id\": \"65cc4911-0868-4954-aef8-f058e410d513\",\n      \"name\": \"Reembolso Uber\",\n      \"amount\": 45.9,\n      \"category\": \"transport\",\n      \"filename\": \"8a744cc981b36e5c2734-comprovante.png\",\n      \"userId\": \"de837ea6-8080-4506-9e5a-0f7e6df7d1cf\",\n      \"createdAt\": \"2025-04-09T22:21:51.700Z\",\n      \"updatedAt\": \"2025-04-09T22:21:51.700Z\",\n      \"user\": {\n        \"id\": \"eac522fb-6c33-4676-9925-22fd483e45bf\",\n        \"name\": \"John Doe\",\n        \"email\": \"johndoe@example.com\",\n        \"role\": \"employee\",\n        \"createdAt\": \"2025-03-29T19:27:29.365Z\",\n        \"updatedAt\": \"2025-03-29T19:27:29.365Z\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"page\": 1,\n    \"perPage\": 10,\n    \"totalRecords\": 1,\n    \"totalPages\": 1\n  }\n}\n```\n\n### 🔎 Ver Reembolso\n\nExibe detalhes de um reembolso específico.\n\n- **Método:** GET  \n- **URL:** `/refund/:id`  \n- **Autenticação:** Requer token JWT no header `Authorization: Bearer`\n- **Role:** `manager`\n\n- **Exemplo de Resposta:**\n\n```json\n{\n  \"id\": \"65cc4911-0868-4954-aef8-f058e410d513\",\n  \"name\": \"Reembolso Uber\",\n  \"amount\": 45.9,\n  \"category\": \"transport\",\n  \"filename\": \"8a744cc981b36e5c2734-comprovante.png\",\n  \"userId\": \"de837ea6-8080-4506-9e5a-0f7e6df7d1cf\",\n  \"createdAt\": \"2025-04-09T22:21:51.700Z\",\n  \"updatedAt\": \"2025-04-09T22:21:51.700Z\",\n  \"user\": {\n    \"id\": \"eac522fb-6c33-4676-9925-22fd483e45bf\",\n    \"name\": \"John Doe\",\n    \"email\": \"johndoe@example.com\",\n    \"role\": \"employee\",\n    \"createdAt\": \"2025-03-29T19:27:29.365Z\",\n    \"updatedAt\": \"2025-03-29T19:27:29.365Z\"\n  }\n}\n```\n\n### 📤 Enviar Comprovante\n\nFaz upload de um comprovante de reembolso.\n\n- **Método:** POST  \n- **URL:** `/uploads`  \n- **Formato:** `multipart/form-data` com campo `file`\n- **Autenticação:** Requer token JWT no header `Authorization: Bearer`\n- **Role:** `employee`\n\n- **Exemplo de Resposta:**\n\n```json\n{\n  \"filename\": \"8a744cc981b36e5c2734-comprovante.png\"\n}\n```\n\n### 📁 Buscar Comprovante\n\nBusca e retorna um comprovante pelo seu ID.\n\n- **Método:** GET  \n- **URL:** `/uploads/:id`\n- **Autenticação:** Requer token JWT no header `Authorization: Bearer`\n- **Role:** `manager`\n\n## 🌐 Front-End\n\nA interface web do Refund oferece uma experiência intuitiva, permitindo que usuários realizem solicitações de reembolso e que gerentes acompanhem e gerenciem as solicitações com facilidade.\n\n👉 Acesse o repositório do front-end [aqui](https://github.com/joschonarth/refund-web).\n\n## 🤝 Contribuições\n\nContribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests com melhorias ou correções.\n\n## ⭐ Apoie este Projeto\n\nSe este projeto te ajudou ou te inspirou de alguma forma, não esqueça de deixar uma ⭐ no repositório! Isso faz toda a diferença! 🚀\n\n## 📞 Contato\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/joschonarth/)\n[![Gmail](https://img.shields.io/badge/Gmail-D14836?style=for-the-badge\u0026logo=gmail\u0026logoColor=white)](mailto:joschonarth@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoschonarth%2Frefund-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoschonarth%2Frefund-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoschonarth%2Frefund-api/lists"}