{"id":26126227,"url":"https://github.com/danielmeloalencar/backend-base-fastify-docker","last_synced_at":"2026-04-11T12:03:24.449Z","repository":{"id":281680897,"uuid":"946061431","full_name":"danielmeloalencar/backend-base-fastify-docker","owner":"danielmeloalencar","description":"API backend TypeScript com Fastify, Prisma e Zod. Implementa Repository Pattern, DI, JWT, e documentação Swagger. Pronto para Docker, escalável e bem estruturado para desenvolvimento produtivo.","archived":false,"fork":false,"pushed_at":"2025-03-10T15:18:40.000Z","size":0,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-10T15:44:24.888Z","etag":null,"topics":["commit-message","commitizen","docker","documentation","fastify","fastify-swagger","fastify-swagger-ui","jwt-authentication","padronizacao","postgresql","prisma","produtividade","sqlite","standardization","supabase","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielmeloalencar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":"2025-03-10T14:50:09.000Z","updated_at":"2025-03-10T15:43:12.000Z","dependencies_parsed_at":"2025-03-11T23:15:38.879Z","dependency_job_id":null,"html_url":"https://github.com/danielmeloalencar/backend-base-fastify-docker","commit_stats":null,"previous_names":["danielmeloalencar/backend-base-fastify-docker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danielmeloalencar/backend-base-fastify-docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielmeloalencar%2Fbackend-base-fastify-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielmeloalencar%2Fbackend-base-fastify-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielmeloalencar%2Fbackend-base-fastify-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielmeloalencar%2Fbackend-base-fastify-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielmeloalencar","download_url":"https://codeload.github.com/danielmeloalencar/backend-base-fastify-docker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielmeloalencar%2Fbackend-base-fastify-docker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265402833,"owners_count":23759237,"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":["commit-message","commitizen","docker","documentation","fastify","fastify-swagger","fastify-swagger-ui","jwt-authentication","padronizacao","postgresql","prisma","produtividade","sqlite","standardization","supabase","typescript"],"created_at":"2025-03-10T17:47:15.905Z","updated_at":"2026-04-11T12:03:24.400Z","avatar_url":"https://github.com/danielmeloalencar.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Backend Produtivo Banner](/assets/header.png)\n\n  \u003cp align=\"center\"\u003e\n    \u003cimg alt=\"Last commit\" src=\"https://img.shields.io/github/last-commit/danielmeloalencar/backend-base-fastify-docker\"\u003e\n    \u003cimg alt=\"stars\" src=\"https://img.shields.io/github/stars/danielmeloalencar/backend-base-fastify-docker?logo=github\"\u003e\n    \u003cimg alt=\"size\" src=\"https://img.shields.io/github/repo-size/danielmeloalencar/backend-base-fastify-docker\"\u003e\n    \u003cimg alt=\"license\" src=\"https://img.shields.io/github/license/danielmeloalencar/backend-base-fastify-docker?\"\u003e\n  \u003c/p\u003e\n\n\u003e :pushpin:\n\u003e\n\u003e ## Uma API backend **ROBUSTA**, porém **PRODUTIVA**\n\u003e\n\u003e Construída com **Fastify**, **Prisma**, **TypeScript**, e **Zod** para validação de esquemas. Este projeto segue padrões modernos de desenvolvimento como **Dependency Injection**, **Repository Pattern**, e inclui documentação automática com **Swagger**.\n\u003e .\n\n## 📋 Índice\n\n- [Tecnologias](#-tecnologias)\n- [Instalação](#-instalação)\n- [Docker](#-docker)\n- [Qualidade de Código](#-qualidade-de-código)\n- [Configuração](#-configuração)\n- [Estrutura do Projeto](#-estrutura-do-projeto)\n- [Scripts Disponíveis](#-scripts-disponíveis)\n- [Desenvolvimento](#-desenvolvimento)\n  - [Adicionando Novas Rotas](#adicionando-novas-rotas)\n  - [Adicionando Novas Tabelas](#adicionando-novas-tabelas)\n  - [Relacionamentos no Prisma](#relacionamentos-no-prisma)\n- [Documentação da API](#-documentação-da-api)\n- [Contribuindo](#-contribuindo)\n\n## 🚀 Tecnologias\n\n- **[Fastify](https://www.fastify.io/)**: Framework web rápido e eficiente\n- **[Prisma](https://www.prisma.io/)**: ORM moderno para acesso ao banco de dados\n- **[TypeScript](https://www.typescriptlang.org/)**: Superset tipado de JavaScript\n- **[Zod](https://zod.dev/)**: Validação de esquemas com tipagem TypeScript\n- **[JWT](https://jwt.io/)**: Autenticação baseada em tokens\n- **[Husky](https://typicode.github.io/husky/)**: Hooks Git para automação\n- **[Commitizen](https://commitizen-tools.github.io/commitizen/)**: Padronização de commits\n- **[Jest](https://jestjs.io/)**: Framework de testes\n- **[Swagger](https://swagger.io/)**: Documentação automática da API\n\n## 🔧 Instalação\n\n1. Clone o repositório:\n\n```bash\ngit clone https://github.com/seunome/ApifyCloneV2.git\ncd ApifyCloneV2/backend\n```\n\n\u003e ⚠️ **Importante**: Este projeto funcionará melhor com **`YARN`** para rodar os scripts automáticos de **padronização de commit**, **padronização de código** e **formatação**.\n\nPara instalar o YARN execute no seu terminal o comando abaixo\n\n```bash\nnpm install yarn -g\n```\n\n2. Instale as dependências:\n\n```bash\nyarn install # ou apenas yarn\n```\n\n3. Configure o Husky (importante!):\n\n```bash\nyarn prepare\n```\n\n\u003e ⚠️ **Importante**: O comando `prepare` configura o Husky, que gerencia os hooks Git para garantir qualidade do código e padronização de commits.\n\n4. Configure o arquivo `.env` na raiz do projeto:\n   Renomeie o arquivo .env.example para .env e configure de acordo com suas informações\n\n```env\nDATABASE_URL=\"file:./backendApiFy.db\"\nJWT_SECRET=\"sua_chave_jwt_secreta_aqui\"\n```\n\n5. Execute as migrações do banco de dados:\n\n```bash\nyarn db:migrate\n```\n\n6. Gere o cliente Prisma:\n\n```bash\nyarn run db:generate\n```\n\n## 🔧 Docker\n\nSe desejar usar docker, execute o comando abaixo na raiz do projeto.\n\n```bash\ndocker compose up -d\n```\n\n## ✅ Qualidade de Código\n\nPara garantir que seu código e mensagens de commit sempre seguirão o padrão do projeto, use sempre o comando abaixo quando for commitar alterações, caso contrário será retornado um erro.\n\n```bash\nyarn commit\n```\n\n## 🛠 Configuração\n\n### Banco de Dados\n\nO projeto está configurado para usar SQLite por padrão, mas você pode mudar para PostgreSQL ou qualquer outro banco suportado pelo Prisma alterando o provider no arquivo `prisma/schema.prisma`.\n\n```prisma\ndatasource db {\n  provider = \"postgresql\" // Altere de \"sqlite\" para \"postgresql\"\n  url      = env(\"DATABASE_URL\")\n}\n```\n\nEm seguida, atualize sua variável de ambiente `DATABASE_URL` no arquivo `.env`:\n\n```env\nDATABASE_URL=\"postgresql://user:password@localhost:5432/mydatabase\"\n```\n\n## 📁 Estrutura do Projeto\n\n```\nsrc/\n  ├── config/         # Configurações do projeto\n  ├── middlewares/    # Middlewares como autenticação\n  ├── repositories/   # Camada de acesso a dados\n  ├── routes/         # Definição de rotas da API\n  ├── services/       # Lógica de negócios\n  ├── utils/          # Funções utilitárias\n  ├── schemas.ts      # Schemas Zod para validação\n  ├── server.ts       # Ponto de entrada do servidor\n  └── types.ts        # Tipos TypeScript\n```\n\n## 📜 Scripts Disponíveis\n\n- **`npm run dev`**: Inicia o servidor de desenvolvimento\n- **`npm run db:migrate`**: Executa migrações do Prisma\n- **`npm run db:studio`**: Abre o Prisma Studio para visualizar o banco de dados\n- **`npm run db:generate`**: Gera o cliente Prisma\n- **`npm run test`**: Executa os testes\n- **`npm run prepare`**: Configura o Husky\n- **`npm run check`**: Executa o ESLint para verificar o código\n- **`npm run check:fix`**: Corrige automaticamente problemas de linting\n- **`npm run prettier`**: Formata o código com Prettier\n- **`npm run commit`**: Adiciona e comita alterações\n\n## 💻 Desenvolvimento\n\n### Adicionando Novas Rotas\n\n1. Crie um novo arquivo em `src/routes/` para o recurso (ex: `productRoutes.ts`):\n\n```typescript\n// filepath: src/routes/productRoutes.ts\nimport { FastifyTypedInstance } from '../types';\nimport { ProductService } from '../services/productService';\nimport { authenticate } from '../middlewares/authenticate';\n\nexport async function productRoutes(fastify: FastifyTypedInstance) {\n  const productService = new ProductService();\n\n  // Rota pública\n  fastify.get(\n    '/products',\n    {\n      schema: {\n        description: 'List all products',\n        tags: ['products'],\n        response: {\n          200: /* seu schema Zod aqui */\n        }\n      }\n    },\n    async (request, reply) =\u003e {\n      const products = await productService.getAllProducts();\n      return reply.send(products);\n    }\n  );\n\n  // Rota protegida\n  fastify.post(\n    '/products',\n    {\n      schema: {\n        description: 'Create a new product',\n        tags: ['products'],\n        security: [{ bearerAuth: [] }], // Indica que requer autenticação\n        body: /* seu schema Zod aqui */,\n        response: {\n          201: /* seu schema Zod aqui */\n        }\n      },\n      preHandler: authenticate, // Middleware de autenticação\n    },\n    async (request, reply) =\u003e {\n      // Implementação da rota\n    }\n  );\n}\n```\n\n2. Registre as novas rotas em `src/routes/index.ts`:\n\n```typescript\n// filepath: src/routes/index.ts\nimport { FastifyTypedInstance } from '../types';\nimport { userRoutes } from './userRoutes';\nimport { productRoutes } from './productRoutes';\n\nexport async function routes(fastify: FastifyTypedInstance) {\n  await userRoutes(fastify);\n  await productRoutes(fastify);\n}\n```\n\n### Adicionando Novas Tabelas\n\n1. Edite o arquivo `prisma/schema.prisma` para adicionar seu novo modelo:\n\n```prisma\n// filepath: prisma/schema.prisma\nmodel Product {\n  id          String   @id @default(uuid())\n  name        String\n  description String\n  price       Float\n  createdAt   DateTime @default(now())\n  updatedAt   DateTime @updatedAt\n  userId      String\n  user        User     @relation(fields: [userId], references: [id])\n}\n```\n\n2. Atualize o modelo `User` para incluir o relacionamento:\n\n```prisma\n// filepath: prisma/schema.prisma\nmodel User {\n  id        String    @id @default(uuid())\n  name      String\n  email     String    @unique\n  password  String\n  createdAt DateTime  @default(now())\n  updatedAt DateTime  @updatedAt\n  products  Product[]\n}\n```\n\n3. Execute o comando de migração:\n\n```bash\nyarn db:migrate\n```\n\n4. Crie um repositório para o novo modelo:\n\n```typescript\n// filepath: src/repositories/productRepository.ts\nimport { PrismaClient, Product } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\nexport interface CreateProductData {\n  name: string;\n  description: string;\n  price: number;\n  userId: string;\n}\n\nexport class ProductRepository {\n  async findAll(): Promise\u003cProduct[]\u003e {\n    return prisma.product.findMany();\n  }\n\n  async create(data: CreateProductData): Promise\u003cProduct\u003e {\n    return prisma.product.create({\n      data,\n    });\n  }\n\n  async findById(id: string): Promise\u003cProduct | null\u003e {\n    return prisma.product.findUnique({\n      where: { id },\n    });\n  }\n\n  async findByUser(userId: string): Promise\u003cProduct[]\u003e {\n    return prisma.product.findMany({\n      where: { userId },\n    });\n  }\n}\n```\n\n### Relacionamentos no Prisma\n\nO Prisma suporta vários tipos de relacionamentos:\n\n1. **Um para Um (1:1)**:\n\n```prisma\n// filepath: prisma/schema.prisma\nmodel User {\n  id       String    @id @default(uuid())\n  profile  Profile?\n}\n\nmodel Profile {\n  id       String    @id @default(uuid())\n  bio      String\n  userId   String    @unique\n  user     User      @relation(fields: [userId], references: [id])\n}\n```\n\n2. **Um para Muitos (1:N)**:\n\n```prisma\n// filepath: prisma/schema.prisma\nmodel User {\n  id       String    @id @default(uuid())\n  posts    Post[]\n}\n\nmodel Post {\n  id       String    @id @default(uuid())\n  title    String\n  content  String\n  userId   String\n  user     User      @relation(fields: [userId], references: [id])\n}\n```\n\n3. **Muitos para Muitos (N:M)**:\n\n```prisma\n// filepath: prisma/schema.prisma\nmodel Post {\n  id        String     @id @default(uuid())\n  title     String\n  categories Category[] @relation(\"PostToCategory\")\n}\n\nmodel Category {\n  id    String  @id @default(uuid())\n  name  String\n  posts Post[]  @relation(\"PostToCategory\")\n}\n```\n\n## 📖 Documentação da API\n\nA documentação da API é gerada automaticamente usando Swagger. Após iniciar o servidor, acesse:\n\n```\nhttp://localhost:3333/docs\n```\n\nA interface do Swagger mostrará todas as rotas disponíveis, seus parâmetros, corpo de requisição e respostas.\n\n## 🤝 Contribuindo\n\n1. Faça o fork do projeto\n2. Crie sua feature branch (`git checkout -b feature/minha-feature`)\n3. Execute `yarn prepare` para configurar o Husky\n4. Faça suas alterações\n5. Execute os testes (`yarn test`)\n6. Use `yarn commit` para fazer commits padronizados\n7. Envie para o branch (`git push origin feature/minha-feature`)\n8. Abra um Pull Request\n\n---\n\nDesenvolvido por [Daniel Alencar](https://github.com/danielmeloAlencar)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielmeloalencar%2Fbackend-base-fastify-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielmeloalencar%2Fbackend-base-fastify-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielmeloalencar%2Fbackend-base-fastify-docker/lists"}