-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
152 lines (130 loc) · 5.62 KB
/
app.js
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
const databaseManager = require('./dbFiles/databaseManager');
const { createTables } = require('./dbFiles/queries');
const userTables = require('./dbFiles/creatingTables/userTables');
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser')
const { setupRoutesV1, routeapi } = require('../src/routes/routes');
const securityRoutes = require('../src/routes/securityRoutes');
const sentryConfig = require('./monitoring/sentryConfig');
const { supabaseConection } = require('../src/account/authSupabase');
const deleteUsersAuth = require('../src/account/deleteUsersAuth');
const refreshAccessToken = require('../src/account/tokenRefresh');
const redisManager = require('./dbFiles/redisManager');
const config = require('../config');
const app = express();
// Configura la aplicación para que confíe en el encabezado X-Forwarded-For establecido por el proxy.
app.set('trust proxy', 1);
// Configurar EJS para la configuracion del login y el registro como motor de plantillas
app.set('view engine', 'ejs')
// Establecer el directorio de vistas
app.set('views', './src/views');
// Inicializa Sentry
sentryConfig.initSentry();
const allowedOrigins = config.corsOrigin ? config.corsOrigin.split(',') : ['*'];
app.use(cors({
origin: (origin, callback) => {
if (allowedOrigins.indexOf(origin) !== -1 || allowedOrigins[0] === '*' || !origin) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept']
}));
app.use(express.json());
app.use(cookieParser());
app.use(refreshAccessToken);
// Middleware para verificar si la solicitud proviene de JMeter
const isJMeter = (req) => {
return req.headers['user-agent'] && req.headers['user-agent'].includes('Apache-HttpClient');
};
// Aplicar el limitador de API solo si no es una solicitud de JMeter
app.use((req, res, next) => {
if (!isJMeter(req)) {
securityRoutes.publicApiLimiter(req, res, next);
} else {
next(); // Si es JMeter, continúa sin aplicar el limitador
}
});
deleteUsersAuth.startScheduledTask();
// Determinar el entorno
const isProduction = config.nodeEnv === 'production';
// Configuración del puerto y host
const PORT = config.port || 3000;
const HOST = isProduction ? '0.0.0.0' : 'localhost';
const hostname = isProduction ? config.urlHost : `http://localhost:${PORT}`;
// Importa y configura las rutas
setupRoutesV1(app, hostname);
// Colores para mensajes en la terminal
const RESET = '\x1b[0m';
const RED = '\x1b[31m';
const GREEN = '\x1b[32m';
const YELLOW = '\x1b[33m';
const BLUE = '\x1b[96m';
const BOLD = '\x1b[1m';
// Verifica si la conexión a postgres está habilitada
const connectionps = config.connectPostgres === 'True' ? true : (config.connectPostgres === undefined ? false : false);
// Verifica si la conexión a redis está habilitada
const connectionredis = config.connectRedis === 'True' ? true : (config.connectRedis === undefined ? false : false);
async function createDatabaseTables() {
// Obtener todas las tablas y sus columnas desde userTables
const tables = Object.keys(userTables).map(key => {
return {
name: userTables[key].tableName,
columns: userTables[key].columns
};
});
for (const table of tables) {
await createTables(table.name, table.columns);
}
}
async function configureApp() {
try {
// Conectar a postgres
await databaseManager.connectToPostgres(connectionps);
// Conectar a redis
const redisConnection = await redisManager.connectToRedis(connectionredis);
if (databaseManager.isPostgresConnected()) {
await createDatabaseTables();
console.log(`${GREEN}${BOLD}✅ Tablas de la base de datos creadas con éxito.${RESET}`);
} else {
console.log(`${YELLOW}${BOLD}⚠️ La conexión a PostgreSQL está deshabilitada.${RESET}`);
}
// Comprobar si se conecto o no con la api de supabase
if (supabaseConection) {
console.log(`${GREEN}${BOLD}✅ Conexion con el cliente Supabase establecida exitosamente${RESET}`);
} else {
console.log(`${RED}${BOLD}❌ Falló la conexion con el cliente Supabase.${RESET}`);
}
// Mostrar mensajes en la terminal según el entorno
if (isProduction) {
console.log(`${RED}${BOLD}⚠️ Advertencia: ¡Estás en modo producción!${RESET}`);
app.listen(PORT, () => console.log(`${GREEN}${BOLD}🚀 Servidor en producción corriendo en el puerto: ${PORT}!`));
if (hostname == undefined){
console.log(`${YELLOW}${BOLD} ❗ Configura la variable de entorno *URLHOST* en tu host para poder ver la ruta de desplegue.${RESET}`);
} else {
console.log(`${BLUE}${BOLD} 🌐 Puedes acceder a traves de https://${hostname}${routeapi} ${RESET}`);
}
} else {
console.log(`${GREEN}${BOLD}🔧 Estás en modo desarrollo.${RESET}`);
app.listen(PORT, () => console.log(`${GREEN}${BOLD}🚀 Servidor de desarrollo corriendo en: http://${HOST}:${PORT}${RESET}`));
}
if (redisConnection) {
//await redisManager.getConnectionInfo();
}
} catch (error) {
console.error(`${RED}${BOLD}❌ Error: ${error.message}${RESET}`);
process.exit(1);
}
}
configureApp();
process.on('SIGINT', () => {
console.log('Shutting out the aplication...');
process.exit(0);
});
module.exports = {
app,
isProduction
};