-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
183 lines (157 loc) · 5.37 KB
/
server.js
File metadata and controls
183 lines (157 loc) · 5.37 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
require('dotenv').config();
const express = require('express');
const path = require('path');
const mongoose = require('mongoose');
const hostname = process.env.HOST || '0.0.0.0';
const PORT = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== "production";
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/sostenibilidadgenerativa';
const CONTEXT_PATH = process.env.CONTEXT_PATH || '/sostenibilidadgenerativa';
const ALLOW_CONTINUE_AFTER_GAME_OVER = process.env.ALLOW_CONTINUE_AFTER_GAME_OVER === 'true' || process.env.ALLOW_CONTINUE_AFTER_GAME_OVER === true || false;
const IFRAME_URL = process.env.IFRAME_URL || 'http://localhost:3000/agentes';
const WEB_PRINCIPAL_URL = process.env.WEB_PRINCIPAL_URL || ''
const rooms = require('./room.json');
const fs = require('fs').promises;
const app = express();
// Configurar EJS
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.use((req, res, next) => {
res.locals.WEB_PRINCIPAL_URL = WEB_PRINCIPAL_URL;
next();
});
// Diccionario de códigos correctos
const codigos = {
escape_1: ['1310', "P"],
escape_2: ['3197', "1"],
escape_3: ['6934', "A"],
escape_4: ['11829', "4"],
};
// Conexión a MongoDB
mongoose.connect(MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('Conectado a MongoDB'))
.catch(err => console.error('Error de conexión a MongoDB:', err));
const ResultSchema = new mongoose.Schema({
date: { type: Date, default: Date.now },
escapp_email: String,
assistant_id: String,
thread_id: String,
run_id: String,
completed: Boolean,
room: String,
remaining_time: Number,
remaining_energy: Number,
code: String
});
const Result = mongoose.model('Result', ResultSchema);
app.use(express.json());
app.use(CONTEXT_PATH, express.static(path.join(__dirname, 'public')));
// Routes
// Redirigir la raíz al index con EJS
app.get(CONTEXT_PATH, async (req, res) => {
res.render('index', { rooms, CONTEXT_PATH });
});
app.get(CONTEXT_PATH + '/:room', async (req, res) => {
const room = req.params.room;
const { escapp_email } = req.query;
const cssPath = path.join(__dirname, 'public', 'css', 'iframe.css');
let newCSSIframe = '';
try {
const cssContent = await fs.readFile(cssPath, 'utf-8');
newCSSIframe = cssContent;
} catch (err) {
console.error('Error leyendo el CSS:', err);
}
if (!rooms[room]) return res.status(404).send('Sala no encontrada');
res.render('escape_room', {
...rooms[room],
room,
allowContinueAfterGameOver: ALLOW_CONTINUE_AFTER_GAME_OVER,
CONTEXT_PATH,
IFRAME_URL,
escapp_email: escapp_email || '',
newCSSIframe
});
});
// API
app.get(CONTEXT_PATH + '/api/completedRooms', async (req, res) => {
const { escapp_email } = req.query;
if (!escapp_email) return res.status(400).json({ error: 'Falta escapp_email' });
let completedRooms = [];
try {
const results = await Result.find({ escapp_email, completed: true }).select('room -_id');
completedRooms = [...new Set(results.map(r => r.room))];
} catch (err) {
console.error('Error consultando la base de datos:', err);
completedRooms = [];
}
res.json({ completedRooms });
});
// API para validar códigos
app.post(CONTEXT_PATH + '/api/validate', async (req, res) => {
const { room, code, escapp_email, assistant_id, thread_id, run_id, remaining_time, remaining_energy } = req.body;
let completed = false;
if (codigos[room] && codigos[room][0] === code) {
completed = true;
}
// Log para control
console.log(`[VALIDACIÓN] Email: ${escapp_email || 'N/A'} | Room: ${room} | Code: ${code} | Completed: ${completed} |
Remaining time: ${remaining_time} | Remaining energy: ${remaining_energy}
| Thread id: ${thread_id} | Run id: ${run_id} | Run id: ${run_id}`);
// Guardar MongoDB
try {
await Result.create({
date: new Date(),
escapp_email,
assistant_id,
thread_id,
run_id,
completed,
room,
remaining_time,
remaining_energy,
code
});
console.log('Resultado guardado en MongoDB');
} catch (err) {
console.error('Error guardando en MongoDB:', err);
}
const finalCode = completed ? codigos[room][1] : "";
res.json({ completed, room, finalCode });
});
// API para validar códigos
app.post(CONTEXT_PATH + '/api/validateAlreadyCompleted', async (req, res) => {
console.log(req.body)
const { room, escapp_email } = req.body;
// Guardar MongoDB
let completed = false;
let finalCode = "";
try {
const result = await Result.findOne({
escapp_email,
completed: true,
room
});
completed = !!result;
finalCode = completed ? codigos[room][1] : "";
} catch (err) {
console.error('Error consultando en MongoDB:', err);
}
res.json({ completed, finalCode });
});
// API para validar códigos
app.post(CONTEXT_PATH + '/api/validateFinalCode', async (req, res) => {
const { final_code } = req.body;
console.log("Trying final code:", final_code);
let completed = false;
const finalCodeReal = Object.values(codigos)
.map(c => c[1])
.join('');
if (final_code.toLowerCase() === finalCodeReal.toLowerCase()) {
completed = true;
}
res.json({ completed });
});
app.listen(PORT, () => {
console.log(`Servidor escuchando en http://localhost:${PORT}${CONTEXT_PATH}`);
});