| Camada | Stack |
|---|---|
| Backend | Node.js · Express · TypeScript · Prisma ORM |
| Frontend | Next.js 15 · React 18 · TypeScript · Tailwind CSS · shadcn/ui |
| Banco de dados | PostgreSQL (Neon) |
| Bot | Discord.js v14 |
| Deploy | Railway (backend) · Vercel (frontend) |
- Node.js 18+
- PostgreSQL (ou conta no Neon)
- Aplicação Discord criada no Discord Developer Portal
git clone https://github.com/Waldevv/eduhub.git
cd eduhubcd backend
cp .env.example .envEdite o .env com suas variáveis (veja a seção Variáveis de Ambiente).
npm install
npx prisma migrate dev # cria as tabelas no banco
npm run dev # inicia em http://localhost:3001cd ../frontendCrie um arquivo .env.local:
NEXT_PUBLIC_API_URL=http://localhost:3001npm install
npm run dev # inicia em http://localhost:3000| Variável | Descrição | Exemplo |
|---|---|---|
DATABASE_URL |
String de conexão PostgreSQL | postgresql://user:pass@host/eduhub?sslmode=require |
PORT |
Porta do servidor | 3001 |
JWT_SECRET |
Segredo para assinatura dos tokens JWT | uma_string_aleatoria_longa |
DISCORD_CLIENT_ID |
ID do cliente OAuth da aplicação Discord | 123456789012345678 |
DISCORD_CLIENT_SECRET |
Secret do cliente OAuth | abc123... |
DISCORD_REDIRECT_URI |
URI de callback OAuth | http://localhost:3001/api/auth/discord/callback |
DISCORD_BOT_TOKEN |
Token do bot Discord | Bot abc123... |
FRONTEND_URL |
URL do frontend (usado em redirects e anúncios) | http://localhost:3000 |
| Variável | Descrição | Exemplo |
|---|---|---|
NEXT_PUBLIC_API_URL |
URL base da API backend | http://localhost:3001 |
Base URL:
http://localhost:3001Todos os endpoints (exceto os marcados como público) exigem header
Authorization: Bearer <token>.
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/discord |
Redireciona para login OAuth do Discord | Público |
GET |
/discord/callback |
Callback OAuth — gera o JWT da sessão | Público |
POST |
/complete-profile |
Completa perfil após primeiro login (define papel: professor/estudante) | Sim |
GET |
/me |
Retorna dados do usuário autenticado | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/join/:code |
Busca informações de um curso pelo código de convite | Público |
POST |
/join/:code |
Estudante entra no curso com código de convite | Sim |
GET |
/ |
Lista cursos do professor autenticado | Sim |
GET |
/:id |
Retorna detalhes de um curso | Sim |
POST |
/ |
Cria um novo curso | Sim |
PATCH |
/:id |
Atualiza dados de um curso | Sim |
DELETE |
/:id |
Remove um curso | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/course/:courseId |
Lista unidades de um curso | Sim |
GET |
/:id |
Retorna detalhes de uma unidade com blocos | Sim |
POST |
/ |
Cria uma nova unidade | Sim |
PATCH |
/reorder |
Reordena unidades em lote | Sim |
PATCH |
/:id |
Atualiza dados de uma unidade | Sim |
DELETE |
/:id |
Remove uma unidade (e canais Discord vinculados) | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/unit/:unitId |
Lista blocos de uma unidade | Sim |
POST |
/ |
Cria um novo bloco | Sim |
PATCH |
/reorder |
Reordena blocos em lote | Sim |
PATCH |
/:id |
Atualiza configurações de um bloco | Sim |
DELETE |
/:id |
Remove um bloco | Sim |
Tipos de bloco: content · activity · exam · interaction · consolidation · evaluation
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/ |
Lista quizzes criados pelo professor | Sim |
GET |
/:id |
Retorna quiz com questões e opções | Sim |
POST |
/ |
Cria um quiz | Sim |
PATCH |
/:id |
Atualiza título/descrição do quiz | Sim |
DELETE |
/:id |
Remove um quiz | Sim |
POST |
/:quizId/questions |
Adiciona questão ao quiz | Sim |
PATCH |
/questions/:id |
Atualiza uma questão | Sim |
DELETE |
/questions/:id |
Remove uma questão | Sim |
PATCH |
/:quizId/questions/reorder |
Reordena questões | Sim |
POST |
/questions/:questionId/options |
Adiciona opção a uma questão | Sim |
PATCH |
/options/:id |
Atualiza uma opção | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/courses |
Lista cursos nos quais o estudante está matriculado | Sim |
GET |
/courses/:id |
Detalhes do curso com progresso das unidades | Sim |
GET |
/units/:id |
Unidade com blocos e status de progresso/desbloqueio | Sim |
POST |
/units/:id/sync-discord |
Ressincroniza permissões Discord do estudante na unidade | Sim |
GET |
/discord-membership/:courseId |
Verifica se o estudante está no servidor Discord do curso | Sim |
POST |
/discord-leave/:courseId |
Remove o estudante do servidor Discord do curso | Sim |
POST |
/blocks/:id/complete |
Marca um bloco como concluído manualmente | Sim |
POST |
/blocks/:id/quiz |
Envia respostas de quiz e registra progresso | Sim |
POST |
/blocks/:id/assignment |
Envia tarefa (arquivo, texto ou link) | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/units/:unitId/progress |
Visão geral do progresso de todos os estudantes na unidade | Sim |
GET |
/units/:unitId/students/:studentId |
Progresso detalhado de um estudante em uma unidade | Sim |
GET |
/courses/:courseId/students-progress |
Progresso de todos os estudantes em todas as unidades do curso | Sim |
POST |
/submissions/:id/grade |
Corrige uma submissão (atribui nota e aprovação) | Sim |
POST |
/blocks/:blockId/students/:studentId/grade |
Atribui nota manual a um estudante em um bloco | Sim |
| Método | Rota | Descrição | Auth |
|---|---|---|---|
GET |
/user-guilds |
Lista servidores Discord que o professor administra | Sim |
GET |
/bot-status/:guildId |
Verifica se o bot está no servidor e se tem Community ativo | Sim |
GET |
/channels/:guildId |
Lista canais do servidor Discord | Sim |
GET |
/server/:courseId |
Retorna servidor Discord vinculado ao curso | Sim |
POST |
/server |
Vincula um servidor Discord a um curso | Sim |
DELETE |
/server/:courseId |
Desvincula o servidor Discord do curso | Sim |
POST |
/server/:courseId/regenerate-invite |
Gera novo link de convite permanente para o servidor | Sim |
POST |
/publish-lesson/:unitId |
Cria canais Discord para uma unidade (texto, fórum, voz, anúncios) | Sim |
eduhub/
├── backend/
│ ├── prisma/
│ │ └── schema.prisma # Modelos do banco de dados
│ └── src/
│ ├── lib/
│ │ ├── discord-bot.ts # Bot Discord (canais, eventos, permissões)
│ │ └── prisma.ts # Cliente Prisma singleton
│ ├── middleware/
│ │ └── auth.ts # Middleware JWT
│ └── routes/ # Rotas da API
└── frontend/
└── src/
├── app/
│ ├── student/ # Páginas do estudante
│ └── teacher/ # Páginas do professor
├── modules/lessons/ # Componentes de aula
└── lib/api.ts # Cliente HTTP para o backend
