API backend para sistema de mensagens em tempo real com autenticação GitHub OAuth e WebSocket.
Sistema de mensagens desenvolvido com Node.js, Express e Socket.IO que permite:
- 🔐 Autenticação via GitHub OAuth
- 💬 Envio de mensagens em tempo real
- 👥 Sistema de perfil de usuários
- 📡 Comunicação WebSocket para atualizações instantâneas
- 🗄️ Banco de dados PostgreSQL com Prisma ORM
- Node.js com TypeScript
- Express.js - Framework web
- Socket.IO - Comunicação em tempo real
- Prisma - ORM para PostgreSQL
- JWT - Autenticação e autorização
- Axios - Cliente HTTP para integração GitHub
- Docker - Containerização do banco de dados
- Node.js (v16 ou superior)
- Docker e Docker Compose
- Conta GitHub (para OAuth)
- npm ou yarn
git clone https://github.com/kevinmcruzp/messages-nodejs.git
cd messages-nodejsnpm install
# ou
yarn installCopie o arquivo de exemplo e configure suas credenciais:
cp .env.Example .envEdite o arquivo .env e configure:
# Database URLs - Para desenvolvimento local com Docker
POSTGRES_PRISMA_URL="postgresql://postgres:docker@localhost:5432/messages"
POSTGRES_URL_NON_POOLING="postgresql://postgres:docker@localhost:5432/messages"
# GitHub OAuth - Obtenha em https://github.com/settings/developers
GITHUB_CLIENT_ID="seu_client_id_aqui"
GITHUB_CLIENT_SECRET="seu_client_secret_aqui"
# JWT Secret - Use uma string aleatória e segura
JWT_SECRET="sua_chave_secreta_aqui"O projeto está configurado para usar PostgreSQL via Docker Compose:
# Inicia o container PostgreSQL em background
npm run docker:up
# Verificar se o container está rodando
docker psConfigurações do Container:
- Imagem:
postgres:15-alpine - Porta:
5432 - Usuário:
postgres - Senha:
docker - Database:
messages - Volume: Dados persistentes em
postgres_data
Comandos úteis do Docker:
# Parar o container
npm run docker:down
# Ver logs do PostgreSQL
npm run docker:logs
# Reiniciar o container
npm run docker:down && npm run docker:upApós o banco estar rodando, execute as migrations:
npm run prisma:migrateIsso criará as tabelas necessárias no banco de dados.
Para visualizar e gerenciar os dados do banco:
npm run prisma:studioAcesse em: http://localhost:5555
npm run devO servidor estará rodando em: http://localhost:4000
POST /authenticate
{
"code": "github_oauth_code"
}Resposta:
{
"token": "jwt_token",
"user": {
"id": "uuid",
"name": "Nome do Usuário",
"github_id": 123456,
"avatar_url": "https://...",
"login": "username"
}
}POST /messages (requer autenticação)
{
"message": "Texto da mensagem"
}Headers:
Authorization: Bearer {token}
GET /messages/last3
Retorna as últimas 3 mensagens.
GET /profile (requer autenticação)
Headers:
Authorization: Bearer {token}
GET /github
Redireciona para página de autenticação do GitHub.
GET /signin/callback
Callback do GitHub OAuth.
O servidor Socket.IO está configurado na porta 4000.
Eventos:
connection- Cliente conectadonew_message- Nova mensagem enviada
Exemplo de payload:
{
"id": "uuid",
"text": "Mensagem",
"user_id": "uuid",
"created_at": "2025-11-06T...",
"user": {
"name": "Nome",
"avatar_url": "https://..."
}
}model User {
id String @id @default(uuid())
name String
github_id Int
avatar_url String
login String
messages Message[]
}model Message {
id String @id @default(uuid())
text String
created_at DateTime @default(now())
user_id String
user User @relation(fields: [user_id], references: [id])
}messages-nodejs/
├── prisma/
│ ├── schema.prisma # Schema do banco de dados
│ └── migrations/ # Migrations do Prisma
├── src/
│ ├── @types/ # Definições de tipos TypeScript
│ ├── controllers/ # Controllers da aplicação
│ ├── errors/ # Classes de erro customizadas
│ ├── middleware/ # Middlewares (auth, errorHandler)
│ ├── prisma/ # Cliente Prisma
│ ├── services/ # Lógica de negócio
│ ├── utils/ # Utilitários
│ ├── app.ts # Configuração do Express e Socket.IO
│ ├── routes.ts # Definição de rotas
│ └── server.ts # Entrada da aplicação
├── docker-compose.yml # Configuração Docker
├── tsconfig.json # Configuração TypeScript
└── package.json # Dependências e scripts
# Desenvolvimento
npm run dev # Inicia servidor em modo dev
# Docker
npm run docker:up # Inicia PostgreSQL
npm run docker:down # Para PostgreSQL
npm run docker:logs # Ver logs do container
# Prisma
npm run prisma:migrate # Executa migrations
npm run prisma:studio # Abre Prisma Studio
# Produção (Vercel)
npm run vercel-build # Deploy das migrationsO projeto está configurado para deploy na Vercel:
- Configure as variáveis de ambiente no painel da Vercel
- O comando
vercel-buildexecutará as migrations automaticamente - Use PostgreSQL em produção (Vercel Postgres, Supabase, etc.)
- ✅ Tratamento de erros centralizado
- ✅ Validação de inputs
- ✅ Autenticação JWT
- ✅ Middleware de autenticação
- ✅ Variáveis de ambiente para dados sensíveis
- ✅ CORS configurado
- ✅ Middleware global de tratamento de erros
- ✅ Classe
AppErrorpara erros customizados - ✅ Validação de mensagens (tamanho máximo: 500 caracteres)
- ✅ Verificação de usuário existente
- ✅ Tratamento de erros assíncronos
- ✅ Logs de erro para debugging
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/MinhaFeature) - Commit suas mudanças (
git commit -m 'Adiciona MinhaFeature') - Push para a branch (
git push origin feature/MinhaFeature) - Abra um Pull Request
Este projeto está sob a licença MIT.
Kevin Cruz
- GitHub: @kevinmcruzp
Desenvolvido com ❤️ usando Node.js e TypeScript