API RESTful desenvolvida com NestJS para cadastro de usuarios, autenticacao com JWT e gestao de lembretes pessoais.
- NestJS
- TypeScript
- PostgreSQL
- TypeORM
- JWT
- Passport
- bcryptjs
- class-validator
- Helmet
- @nestjs/throttler
- Docker
- Cadastro de usuarios
- Login com geracao de JWT
- Hash de senha com bcryptjs
- Rotas protegidas com JWT
- Rate limiting nas rotas de autenticacao
- Criacao de lembretes
- Listagem de lembretes do usuario autenticado
- Edicao de lembretes
- Marcacao de lembrete como concluido
- Remocao de lembretes
- Relacionamento entre usuarios e lembretes
- Node.js 22+
- npm
- Docker
- Docker Compose
Instale as dependencias:
npm installCrie o arquivo .env com base no exemplo:
cp .env.example .envPreencha o .env com seus valores reais:
# ======= app =======
NODE_ENV=development
ALLOWED_ORIGINS=http://localhost:5173
PORT=3000
# ======= jwt =======
JWT_SECRET=troque_por_um_valor_secreto_longo
JWT_EXPIRES_IN=1d
# ======= database =======
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=troque_por_uma_senha_forte
DB_DATABASE=app_reminderO arquivo
.envesta no.gitignoree nunca deve ser commitado. Use.env.examplecomo referencia.
Use esta opcao durante o desenvolvimento local da API:
docker compose up -d postgresDepois rode a aplicacao em modo desenvolvimento:
npm run start:devA API ficara disponivel em:
http://localhost:3000/api
Para subir a aplicacao completa em containers:
docker compose up --buildNesse caso, o Docker Compose carrega as variaveis do .env automaticamente via env_file.
npm run start:dev
npm run build
npm run start:prod
npm run lint
npm run format
npm run testTodas as rotas usam o prefixo:
/api
POST /api/auth/register
Body:
{
"name": "Ryu Sakazaki",
"email": "sakazaki@email.com",
"password": "123456"
}POST /api/auth/login
Body:
{
"email": "sakazaki@email.com",
"password": "123456"
}Resposta:
{
"access_token": "jwt-token"
}Rate limiting ativo: maximo de 5 tentativas por minuto nesta rota.
GET /api/auth/profile
Authorization: Bearer <token>
Resposta:
{
"userId": 1,
"email": "sakazaki@email.com"
}Todas as rotas de lembretes exigem autenticacao:
Authorization: Bearer <token>
POST /api/reminders
Body:
{
"title": "Estudar NestJS",
"description": "Criar API de lembretes com TypeORM",
"dueDate": "2026-06-20T10:00:00.000Z"
}GET /api/reminders
PATCH /api/reminders/:id/complete
PUT /api/reminders/:id
Body:
{
"title": "Estudar NestJS e PostgreSQL",
"description": "Atualizar lembrete",
"dueDate": "2026-06-21T10:00:00.000Z"
}DELETE /api/reminders/:id
A API utiliza class-validator e ValidationPipe global para validar os dados de entrada.
Exemplos de validacao:
namee obrigatorio no cadastroemaildeve ser valido e unicopassworddeve ter no minimo 6 caracterestitlee obrigatorio ao criar lembretedueDatedeve ser uma data valida- Campos nao permitidos sao rejeitados
- Senhas armazenadas com hash via
bcryptjs - Autenticacao via JWT com expiracao configuravel
- Rotas privadas protegidas por
JwtAuthGuard - Usuarios so podem acessar, editar ou remover os proprios lembretes
- A senha nao e retornada nas respostas da API
- Email com constraint
uniqueno banco de dados - Rate limiting nas rotas de autenticacao via
@nestjs/throttler - Headers HTTP de seguranca via
helmet - CORS configurado para permitir apenas origens definidas em
ALLOWED_ORIGINS - Variaveis de ambiente sensiveis isoladas no
.env(fora do controle de versao) synchronizedo TypeORM desativado automaticamente emNODE_ENV=production
O projeto utiliza PostgreSQL com TypeORM.
O synchronize esta habilitado apenas em ambiente de desenvolvimento (NODE_ENV=development), criando e atualizando tabelas automaticamente a partir das entities.
Em producao, o recomendado e substituir essa configuracao por migrations.
src/
auth/
decorators/
dto/
types/
auth.controller.ts
auth.module.ts
auth.service.ts
jwt-auth.guard.ts
jwt.strategy.ts
users/
user.entity.ts
users.module.ts
users.service.ts
reminders/
dto/
reminder.entity.ts
reminders.controller.ts
reminders.module.ts
reminders.service.ts
app.module.ts
main.ts
Este projeto foi desenvolvido como uma API de estudo e pratica com NestJS, aplicando conceitos como modulos, controllers, services, DTOs, guards, strategies, entities, repositories, autenticacao JWT e boas praticas de seguranca.