Plataforma de estudo colaborativo com arquitetura de microserviços baseada em GraphQL Federation.
O Glasser Study é uma plataforma educacional composta por múltiplos microserviços que trabalham em conjunto através de GraphQL Federation e Apollo Gateway. O sistema permite que usuários compartilhem materiais de estudo, interajam através de posts, comentários, chats e notificações em tempo real.
┌─────────────────────────────────────────────────────────────┐
│ Router (API Gateway) │
│ Port: 3000 (Gateway) │
│ JWT Auth | Context Propagation │
└───────────────────────┬─────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ Client │ │ Admin │ │ External │
│ App │ │ App │ │ Clients │
└─────────┘ └───────────┘ └──────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────▼─────┐ ┌─────▼────┐ ┌──────▼─────┐
│ RabbitMQ │ │ MongoDB │ │ AWS S3 │
│ Message │ │ Database │ │ Storage │
│ Broker │ │ │ │ Images │
└──────────┘ └──────────┘ └───────────┘
Responsabilidade: Gerenciamento de usuários, autenticação e goals.
Funcionalidades:
- Cadastro e login com JWT
- Upload de imagens de perfil via AWS S3
- Recuperação de senha por email
- Gerenciamento de goals e tarefas
- Controle de acesso (admin/usuário)
Tecnologias: NestJS, GraphQL, JWT, bcrypt, AWS S3, Nodemailer
Responsabilidade: Gerenciamento de posts, comentários e curtidas.
Funcionalidades:
- CRUD de posts com materiais de estudo
- Sistema de comentários
- Sistema de curtidas (toggle)
- Busca avançada por título, tags, assunto, tipo de material
- Notificações via RabbitMQ (novo comentário/curtida)
Tecnologias: NestJS, GraphQL, MongoDB, RabbitMQ
Responsabilidade: Gerenciamento de chats e mensagens.
Funcionalidades:
- Criação e gerenciamento de chats em grupo
- Sistema de convites e aceitação
- Envio de mensagens em tempo real
- Rastreamento de leitura
- Notificações via RabbitMQ (nova mensagem/chat)
Tecnologias: NestJS, GraphQL, MongoDB, RabbitMQ
Responsabilidade: Notificações em tempo real via GraphQL Subscriptions.
Funcionalidades:
- Consumo de mensagens do RabbitMQ
- Distribuição de notificações em tempo real
- Status de leitura
- WebSocket subscriptions
Tecnologias: NestJS, GraphQL Subscriptions, MongoDB, RabbitMQ, WebSocket
Tipos de Notificação:
NEW_MESSAGE- Nova mensagem no chatNEW_CHAT- Novo chat criadoNEW_COMMENT- Novo comentário no postNEW_LIKE- Nova curtida no post
Responsabilidade: Sistema de denúncias e moderação.
Funcionalidades:
- Criação de denúncias
- Status de denúncia (PENDING, RESOLVED, REJECTED)
- Resolução de denúncias (apenas admin)
- Relatórios para administradores
Tecnologias: NestJS, GraphQL, MongoDB
Responsabilidade: API Gateway federado que orquestra todos os serviços.
Funcionalidades:
- Apollo Federation Gateway
- Autenticação JWT centralizada
- Propagação de contexto (userId, isAdmin, origin)
- CORS para múltiplos clients
- Health check de serviços
Tecnologias: NestJS, Apollo Gateway, JWT
Client → Router (JWT verification) → User Service → JWT Token
Post/Comment/Like Action
→ RabbitMQ Message
→ Notification Service
→ GraphQL Subscription
→ Client
Client Request
→ Router (extract JWT)
→ Adds headers: user-id, is-admin, from
→ Forwards to appropriate service
- NestJS - Framework Node.js
- GraphQL - Query language e runtime
- Apollo Federation - Federated GraphQL
- MongoDB - Banco de dados NoSQL
- RabbitMQ - Message broker para notificações
- JWT - Autenticação
- bcrypt - Hash de senhas
- AWS S3 - Armazenamento de imagens
- Nodemailer - Envio de emails
- Docker - Containerização
- Docker Compose - Orquestração de containers
- Node.js (v18 ou superior)
- Docker e Docker Compose
- MongoDB
- RabbitMQ
- AWS S3 (para upload de imagens)
- Clone o repositório
cd glasser-study-back- Configure as variáveis de ambiente
Crie um arquivo .env em cada serviço com as configurações necessárias:
Router Service:
PORT=3000
JWT_SECRET=your-secret-key
MONGO_PORT=27017
MONGO_USERNAME=admin
MONGO_PASSWORD=adminUser Service:
PORT=4000
MONGO_URI=mongodb://admin:admin@localhost:27017/user_db?authSource=admin
JWT_SECRET=your-secret-key
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_S3_BUCKET_NAME=your-bucket
EMAIL_USERNAME=your-email
EMAIL_PASSWORD=your-passwordPost Service:
PORT=4001
MONGO_URI=mongodb://admin:admin@localhost:27017/post_db?authSource=admin
RABBITMQ_URI=amqp://guest:guest@localhost:5672Message Service:
PORT=4002
MONGO_URI=mongodb://admin:admin@localhost:27017/message_db?authSource=admin
RABBITMQ_URI=amqp://guest:guest@localhost:5672Notification Service:
PORT=4000
MONGO_URI=mongodb://admin:admin@localhost:27017/notification_db?authSource=admin
JWT_SECRET=your-secret-key
RABBITMQ_URI=amqp://guest:guest@localhost:5672Report Service:
PORT=4005
MONGO_URI=mongodb://admin:admin@localhost:27017/report_db?authSource=admin- Instale as dependências de cada serviço
cd user-service && npm install
cd post-service && npm install
cd message-service && npm install
cd notification-service && npm install
cd report-service && npm install
cd router && npm install- Inicie a infraestrutura:
cd router
node start-containers.js- Inicie cada serviço em terminais separados:
# Terminal 1
cd user-service
npm run start:dev
# Terminal 2
cd post-service
npm run start:dev
# Terminal 3
cd message-service
npm run start:dev
# Terminal 4
cd notification-service
npm run start:dev
# Terminal 5
cd report-service
npm run start:dev
# Terminal 6
cd router
npm run start:dev# Na raiz do projeto backend
docker-compose up -dVerifique se todos os serviços estão rodando:
cd router
node check-services.jsEste script verifica se todos os microserviços estão respondendo nas portas corretas.
| Serviço | URL | Health Check | Description |
|---|---|---|---|
| Router | http://localhost:3000 | / |
Gateway principal |
| User | http://localhost:4000 | /health |
Usuários e autenticação |
| Post | http://localhost:4001 | /health |
Posts e comentários |
| Message | http://localhost:4002 | /health |
Chats e mensagens |
| Notification | http://localhost:4000 | /health |
Notificações |
| Report | http://localhost:4005 | /health |
Denúncias |
| RabbitMQ | http://localhost:15672 | - | Management UI |
| MongoDB | mongodb://localhost:27017 | - | Database |
O sistema utiliza JWT para autenticação. Todas as requisições devem incluir o token no header:
Authorization: Bearer <jwt-token>O Router extrai automaticamente:
userIddo tokenisAdmindo token- Propaga via headers HTTP para os subgrafos
- Ação no serviço (ex: novo comentário)
- Serviço publica mensagem no RabbitMQ
- Notification Service consome a mensagem
- Notificação é persistida no MongoDB
- Subscription GraphQL distribui em tempo real
- Cliente recebe a notificação
- NEW_MESSAGE - Nova mensagem no chat
- NEW_CHAT - Novo chat criado
- NEW_COMMENT - Novo comentário no post
- NEW_LIKE - Nova curtida no post
Cada serviço possui suas próprias collections:
User Service:
users- Dados dos usuáriosgoals- Goals dos usuários
Post Service:
posts- Posts publicadoscomments- Comentários nos postslikes- Curtidas nos posts
Message Service:
chats- Grupos de chatmessages- Mensagens enviadas
Notification Service:
notifications- Notificações dos usuários
Report Service:
reports- Denúncias criadas
Cada serviço expõe um subgraph GraphQL que é combinado pelo Router:
# Schema unificado após federation
type Query {
# User Service
me: User
myGoals: [Goal]
# Post Service
posts: [Post]
myPosts: [Post]
# Message Service
myChats: [Chat]
chatMessages(chatId: ID!): [Message]
# Notification Service
myNotifications: [Notification]
countMyUnreadNotifications: Int
}O Router propaga automaticamente o contexto para os subgrafos via headers:
user-id: <ObjectId>
is-admin: true/false
from: client|admin- MongoDB - Banco de dados na porta 27017
- RabbitMQ - Message broker na porta 5672
- RabbitMQ Management - UI na porta 15672
# Build de cada serviço
docker build -t user-service ./user-service
docker build -t post-service ./post-service
docker build -t message-service ./message-service
docker build -t notification-service ./notification-service
docker build -t report-service ./report-service
docker build -t router ./router
# Executar
docker-compose up -dExecute testes em cada serviço:
# Testes unitários
npm run test
# Testes com coverage
npm run test:cov
# Testes em watch mode
npm run test:watch
# Testes e2e
npm run test:e2eTodos os serviços compartilham os seguintes scripts:
npm run start # Produção
npm run start:dev # Desenvolvimento
npm run start:debug # Debug mode
npm run build # Compilar
npm run lint # Linter
npm run format # Formatar código| Variável | Descrição | Onde |
|---|---|---|
PORT |
Porta do serviço | Todos |
MONGO_URI |
Conexão MongoDB | Todos |
JWT_SECRET |
Chave secreta JWT | User, Notification, Router |
RABBITMQ_URI |
Conexão RabbitMQ | Post, Message, Notification |
AWS_* |
Credenciais AWS S3 | User Service |
EMAIL_* |
Credenciais SMTP | User Service |
- Verifique se MongoDB e RabbitMQ estão rodando
- Confirme que as portas não estão em uso
- Verifique os logs com
docker-compose logs
- Verifique se o
JWT_SECRETestá configurado corretamente - Confirme que o token JWT é válido
- Verifique expiração do token
- Verifique conexão com RabbitMQ
- Confirme que o Notification Service está rodando
- Verifique logs do RabbitMQ Management UI
glasser-study-back/
├── user-service/ # Usuários e autenticação
├── post-service/ # Posts e comentários
├── message-service/ # Chats e mensagens
├── notification-service/ # Notificações em tempo real
├── report-service/ # Denúncias e moderação
└── router/ # API Gateway (Apollo Federation)
- Faça fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
UNLICENSED - Proprietário
Glasser Study Team