-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
112 lines (100 loc) · 3.9 KB
/
Copy pathapp.js
File metadata and controls
112 lines (100 loc) · 3.9 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
import './config/env.js'
import mongoose from 'mongoose'
import {
bot,
webhookCallback,
WEBHOOK_PATH,
registerWebhook
} from './config/telegraf/telegraf.js'
import { createApp } from './config/express/createApp.js'
import { startReminderScheduler } from './services/schedulers/reminderScheduler.js'
import { startPendingDeletionScheduler } from './services/schedulers/pendingDeletionScheduler.js'
import { startCalendarSyncScheduler } from './services/schedulers/calendarSyncScheduler.js'
import { getCalendarStatus } from './services/google/calendarClient.js'
import { menuCommands } from './helpers/menu/mainMenu.js'
import { pruneUnauthorizedSessions } from './middlewares/session/localSession.js'
const DAY_MS = 24 * 60 * 60 * 1000
// La colección sessions solo debe guardar sesiones de usuarios autorizados
const pruneSessions = () =>
pruneUnauthorizedSessions()
.then((removed) => {
if (removed > 0) {
console.info(
`🧹 ${removed} sesiones de usuarios no autorizados eliminadas`
)
}
})
.catch((err) => console.error('😵💫 Error al purgar sesiones:', err.message))
// ====================================
// 🔰 Verifico .env
// ====================================
const mongoURI = process.env.MONGO_URI
const port = process.env.PORT || 3000
const domain = process.env.WEBHOOK_DOMAIN
if (!mongoURI) {
throw new Error('🪧 MONGO_URI no está definido en el archivo .env')
}
if (!domain) {
throw new Error('🪧 WEBHOOK_DOMAIN no está definido en el archivo .env')
}
// =====================
// 🔰 Conecto a MongoDB
// =====================
mongoose
.connect(mongoURI)
.then(() => {
console.info('👾 Conectado a MongoDB correctamente')
// ======================
// 🔰 Inicializo Schedulers
// ======================
startReminderScheduler()
pruneSessions()
setInterval(pruneSessions, DAY_MS).unref()
// Google Calendar es opcional: sin credenciales no hay nada que sincronizar.
// Si están mal, se avisa aquí (visible en los logs de Render) y no se arranca
const calendar = getCalendarStatus()
if (calendar.state === 'ready') {
console.info(
`🗓️ Google Calendar activo con la cuenta de servicio ${calendar.serviceAccount}`
)
startCalendarSyncScheduler()
} else if (calendar.state === 'misconfigured') {
console.error(`🦽 Google Calendar mal configurado: ${calendar.reason}`)
} else {
console.info('🗓️ Google Calendar no configurado (es opcional)')
}
// Recupera y rearma los borrados de mensajes que quedaron pendientes
// antes de una caída, y vigila el resto por si alguno se escapa
startPendingDeletionScheduler(bot).catch((err) =>
console.error('😵💫 Error al recuperar borrados pendientes:', err.message)
)
// Desplegable "/" de Telegram: las mismas órdenes que el menú principal
bot.telegram
.setMyCommands(menuCommands())
.catch((err) =>
console.error('🦽 Error al publicar los comandos:', err.message)
)
// ==========================================
// 🔰 Inicializo Express (webhook + ruta raíz)
// ==========================================
const app = createApp({ webhookPath: WEBHOOK_PATH, webhookCallback })
// Sin webhook registrado el bot no recibe nada: mejor caer y que Render reinicie
registerWebhook(domain)
.then(() => {
console.info(`🤖 Webhook activo en: ${domain}${WEBHOOK_PATH}`)
})
.catch((err) => {
console.error('🦽 Error al registrar el webhook:', err.message)
process.exit(1)
})
// =======================
// 🔰 Levanto el servidor
// =======================
app.listen(port, () => {
console.info(`🛫 Servidor escuchando en http://localhost:${port}`)
})
})
.catch((err) => {
console.error('🦽 Error al conectar a MongoDB:', err.message)
process.exit(1)
})