API RESTful de um blog pessoal desenvolvida com NestJS, TypeORM e PostgreSQL. Permite gerenciar usuários, postagens e temas com autenticação segura via JWT.
API de blog pessoal com operações CRUD completas para usuários, postagens e temas. A aplicação conta com autenticação via JWT, criptografia de senhas com Bcrypt, documentação interativa com Swagger e banco de dados PostgreSQL hospedado no Neon.
- Usuários — cadastro, login, atualização e listagem
- Postagens — criação, edição, remoção e busca por título
- Temas — categorização de postagens, busca por descrição
- Autenticação — login com JWT, rotas protegidas por guards
- Segurança — senhas criptografadas com Bcrypt
- Relacionamentos — postagens vinculadas a temas e usuários
- Documentação — Swagger UI disponível em
/swagger - Deploy — hospedado no Render com banco de dados no Neon
src/
├── auth/ # Autenticação e segurança
│ ├── bcrypt/ # Criptografia de senhas
│ ├── constants/ # Chave secreta do JWT
│ ├── controllers/ # Endpoint de login
│ ├── entities/ # Entidade de login
│ ├── guard/ # Guards JWT e Local
│ ├── services/ # Lógica de autenticação
│ ├── strategy/ # Estratégias Passport (JWT e Local)
│ └── auth.module.ts
│
├── data/services/ # Configuração do banco de dados
│ ├── dev.service.ts # Configuração para desenvolvimento
│ └── prod.service.ts # Configuração para produção
│
├── postagem/ # Módulo de postagens
│ ├── controllers/
│ ├── entities/
│ ├── services/
│ └── postagem.module.ts
│
├── tema/ # Módulo de temas
│ ├── controllers/
│ ├── entities/
│ ├── services/
│ └── tema.module.ts
│
├── usuario/ # Módulo de usuários
│ ├── controllers/
│ ├── entities/
│ ├── services/
│ └── usuario.module.ts
│
├── app.module.ts
└── main.ts
Usuario 1 ──────────── N Postagem
Tema 1 ──────────── N Postagem
Um usuário pode ter várias postagens. Um tema pode estar associado a várias postagens.
| Tecnologia | Versão | Finalidade |
|---|---|---|
| NestJS | ^10.x | Framework principal |
| TypeScript | ^5.x | Linguagem de programação |
| TypeORM | ^0.3.x | ORM para banco de dados |
| PostgreSQL | — | Banco de dados relacional |
| Passport.js | ^0.6.x | Autenticação |
| JWT | ^10.x | Tokens de acesso |
| Bcrypt | ^5.x | Criptografia de senhas |
| Swagger | ^7.x | Documentação da API |
| Neon | — | Banco de dados serverless (produção) |
| Render | — | Plataforma de deploy |
# Clone o repositório
git clone https://github.com/seu-usuario/blogpessoal.git
# Acesse a pasta do projeto
cd blogpessoal
# Instale as dependências
npm installCrie um arquivo .env na raiz do projeto:
# Banco de dados (desenvolvimento)
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=seu_usuario
DB_PASSWORD=sua_senha
DB_DATABASE=blogpessoal
# JWT
JWT_SECRET=sua_chave_secreta# Modo desenvolvimento
npm run start:dev
# Modo produção
npm run start:prod
# Build
npm run buildA API estará disponível em: http://localhost:4000
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| POST | /auth/login |
Login do usuário | ❌ |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /usuarios |
Lista todos os usuários | ✅ |
| GET | /usuarios/:id |
Busca usuário por ID | ✅ |
| POST | /usuarios/cadastrar |
Cadastra novo usuário | ❌ |
| PUT | /usuarios/atualizar |
Atualiza usuário | ✅ |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /postagens |
Lista todas as postagens | ✅ |
| GET | /postagens/:id |
Busca postagem por ID | ✅ |
| GET | /postagens/titulo/:titulo |
Busca por título | ✅ |
| POST | /postagens |
Cria nova postagem | ✅ |
| PUT | /postagens |
Atualiza postagem | ✅ |
| DELETE | /postagens/:id |
Remove postagem | ✅ |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
| GET | /temas |
Lista todos os temas | ✅ |
| GET | /temas/:id |
Busca tema por ID | ✅ |
| GET | /temas/descricao/:descricao |
Busca por descrição | ✅ |
| POST | /temas |
Cria novo tema | ✅ |
| PUT | /temas |
Atualiza tema | ✅ |
| DELETE | /temas/:id |
Remove tema | ✅ |
✅ = Requer token JWT no header
Authorization: Bearer <token>
A API utiliza JWT (JSON Web Token) para proteger as rotas. Após realizar o login, utilize o token retornado no header de todas as requisições autenticadas:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
As senhas são armazenadas com hash Bcrypt, garantindo que nunca sejam salvas em texto puro no banco de dados.
A documentação interativa da API está disponível em:
- Local:
http://localhost:4000/swagger - Produção:
https://blogpessoal-generation-66yb.onrender.com/swagger
A aplicação possui testes End-to-End (E2E) utilizando Supertest + Jest, com banco de dados SQLite em memória para garantir um ambiente isolado e limpo a cada execução.
| # | Descrição | Método | Rota | Status esperado |
|---|---|---|---|---|
| 01 | Deve cadastrar um novo usuário | POST | /usuarios/cadastrar |
201 |
| 02 | Não deve cadastrar um usuário já existente | POST | /usuarios/cadastrar |
400 |
| 03 | Deve autenticar um usuário cadastrado (login) | POST | /usuarios/logar |
200 |
| 04 | Deve listar todos os usuários 🔒 | GET | /usuarios/all |
200 |
| 05 | Deve atualizar os dados de um usuário 🔒 | PUT | /usuarios/atualizar |
200 |
| 06 | Deve buscar um usuário pelo ID 🔒 | GET | /usuarios/:id |
200 |
🔒 Rotas que exigem token JWT no header
Authorization
- Banco de dados SQLite em memória — criado antes dos testes e destruído ao final
- O token JWT obtido no teste 03 é reutilizado nos testes protegidos (04, 05 e 06)
- O ID do usuário criado no teste 01 é reutilizado nos testes 05 e 06
ValidationPipeglobal ativado para validar os dados nos testes
# Rodar todos os testes E2E
npm run test:e2e
# Rodar com cobertura
npm run test:cov
# Modo watch
npm run test:watchtest/
└── app.e2e-spec.ts # Testes E2E com Supertest
A aplicação está hospedada no Render com banco de dados PostgreSQL serverless pelo Neon.
URL da API em produção:
https://blogpessoal-generation-66yb.onrender.com
⚠️ Por ser um serviço gratuito, o servidor pode demorar alguns segundos para responder na primeira requisição (cold start).