-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
119 lines (99 loc) · 3.62 KB
/
Copy pathserver.js
File metadata and controls
119 lines (99 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// server.js
const express = require('express');
const axios = require('axios');
const nodemailer = require('nodemailer');
const path = require('path');
require('dotenv').config();
const app = express();
// =========================
// 1. Configurar HTTP + Socket.IO
// =========================
const http = require('http').createServer(app);
const { Server } = require('socket.io');
const io = new Server(http);
// Middleware Express
app.use(express.json());
// Servir ficheiros estáticos (pasta “public”)
app.use(express.static('public'));
// =========================
// 2. Lógica de chat em tempo real
// =========================
/**
* Fluxo:
* - Cada sala identifica um par tutor⇄aluno.
* Por exemplo: room = `chat_TUTORID_ALUNOID`.
* - Quando um cliente (tutor ou aluno) se liga, envia “join_room” com:
* { room: 'chat_123_456', userType: 'tutor' | 'aluno', userName: 'Beatriz Sousa' }
* - O servidor associa o socket àquela sala (socket.join(room)).
* - Quando o cliente envia “send_message” com:
* { room: 'chat_123_456', text: 'Olá, prof!', userType: 'aluno', timestamp: '12:45' }
* O servidor faz io.to(room).emit('receive_message', mesma_payload) para todos na sala.
*/
io.on('connection', (socket) => {
console.log('🔌 Novo socket conectado:', socket.id);
// O frontend chama socket.emit('join_room', {...});
socket.on('join_room', ({ room, userType, userName }) => {
socket.join(room);
console.log(`👥 ${userType} "${userName}" entrou na sala "${room}"`);
});
// O frontend chama socket.emit('send_message', {...});
socket.on('send_message', (msgData) => {
// msgData = { room, text, userType, userName, timestamp }
const { room } = msgData;
// Retransmitir para todos na sala (incluindo quem enviou)
io.to(room).emit('receive_message', msgData);
});
socket.on('disconnect', () => {
console.log('🔌 Socket desconectado:', socket.id);
});
});
// =========================
// 3. Rotas HTTP originais (Zoom, email, etc.)
// — Sem alterações substanciais, só adicionámos Socket.IO acima.
// =========================
// Variáveis de ambiente (Zoom e email)
const {
ZOOM_CLIENT_ID,
ZOOM_CLIENT_SECRET,
ZOOM_ACCOUNT_ID,
EMAIL_USER,
EMAIL_PASS,
EMAIL_HOST,
EMAIL_PORT
} = process.env;
// Configuração do transporte de email (igual ao original)
const emailTransporter = nodemailer.createTransport({
host: EMAIL_HOST || 'smtp.gmail.com',
port: parseInt(EMAIL_PORT) || 587,
secure: false,
auth: { user: EMAIL_USER, pass: EMAIL_PASS }
});
emailTransporter.verify((error, success) => {
if (error) {
console.log('❌ Erro configuração email:', error.message);
} else {
console.log('✅ Email server pronto');
}
});
// Funções getZoomAccessToken, createZoomMeeting, sendMeetingEmails...
// (copiar do server.js original, sem alterar)
// Rota para criar-meeting: app.post('/api/create-meeting', ...) (igual ao original)
app.get('/api/health', (req, res) => {
res.json({ status: 'OK', timestamp: new Date().toISOString() });
});
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public/index.html'));
});
app.use((req, res) => {
res.status(404).json({ success: false, message: 'Endpoint não encontrado' });
});
app.use((error, req, res, next) => {
console.error('❌ Unhandled error:', error);
res.status(500).json({ success: false, message: 'Erro interno do servidor' });
});
// Em vez de app.listen, usamos http.listen para incluir Socket.IO
const PORT = process.env.PORT || 3000;
http.listen(PORT, () => {
console.log('🚀 EduLink Server (com Socket.IO) a correr na porta', PORT);
});
module.exports = http;