ыввы
This commit is contained in:
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "node --env-file=.env --watch-path=./src src/index.js",
|
"dev": "node --env-file=.env --unhandled-rejections=warn --watch src/index.js",
|
||||||
"dev:classic": "node --watch src/index.js",
|
"dev:classic": "node --watch src/index.js",
|
||||||
"start": "node src/index.js",
|
"start": "node src/index.js",
|
||||||
"db:migrate": "prisma migrate dev",
|
"db:migrate": "prisma migrate dev",
|
||||||
|
|||||||
Binary file not shown.
+24
-2
@@ -141,10 +141,24 @@ await registerUserNotificationRoutes(fastify)
|
|||||||
await registerOAuthSocialRoutes(fastify)
|
await registerOAuthSocialRoutes(fastify)
|
||||||
await registerYookassaWebhookRoute(fastify)
|
await registerYookassaWebhookRoute(fastify)
|
||||||
await registerApiRoutes(fastify)
|
await registerApiRoutes(fastify)
|
||||||
await ensureAdminUser()
|
|
||||||
await getOrCreateUnspecifiedCategory()
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
await ensureAdminUser()
|
||||||
|
} catch (err) {
|
||||||
|
fastify.log.error({ err }, 'ensureAdminUser failed — continuing startup')
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await getOrCreateUnspecifiedCategory()
|
||||||
|
} catch (err) {
|
||||||
|
fastify.log.error({ err }, 'getOrCreateUnspecifiedCategory failed — continuing startup')
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
await notificationQueue.flushPendingOnStartup()
|
await notificationQueue.flushPendingOnStartup()
|
||||||
|
} catch (err) {
|
||||||
|
fastify.log.error({ err }, 'notificationQueue.flushPendingOnStartup failed')
|
||||||
|
}
|
||||||
notificationQueue.start()
|
notificationQueue.start()
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -158,6 +172,7 @@ const {
|
|||||||
} = NOTIFICATION_EVENTS
|
} = NOTIFICATION_EVENTS
|
||||||
|
|
||||||
async function dispatchNotification(eventType, payload) {
|
async function dispatchNotification(eventType, payload) {
|
||||||
|
try {
|
||||||
if (eventType === AUTH_CODE_REQUESTED) {
|
if (eventType === AUTH_CODE_REQUESTED) {
|
||||||
const targets = await resolveAuthCodeTargets(eventType, payload)
|
const targets = await resolveAuthCodeTargets(eventType, payload)
|
||||||
for (const target of targets.filter((t) => t.channel === 'telegram')) {
|
for (const target of targets.filter((t) => t.channel === 'telegram')) {
|
||||||
@@ -201,6 +216,9 @@ async function dispatchNotification(eventType, payload) {
|
|||||||
})
|
})
|
||||||
notificationQueue.enqueue({ ...target, eventType, payload, logId: log.id })
|
notificationQueue.enqueue({ ...target, eventType, payload, logId: log.id })
|
||||||
}
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`[notification] Error dispatching ${eventType}:`, err.message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eventBus.on(ORDER_CREATED, (payload) => dispatchNotification(ORDER_CREATED, payload))
|
eventBus.on(ORDER_CREATED, (payload) => dispatchNotification(ORDER_CREATED, payload))
|
||||||
@@ -221,6 +239,10 @@ async function shutdown() {
|
|||||||
process.on('SIGINT', shutdown)
|
process.on('SIGINT', shutdown)
|
||||||
process.on('SIGTERM', shutdown)
|
process.on('SIGTERM', shutdown)
|
||||||
|
|
||||||
|
process.on('unhandledRejection', (reason) => {
|
||||||
|
console.error('[process] Unhandled rejection:', reason?.message || reason)
|
||||||
|
})
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await fastify.listen({ port, host: '0.0.0.0' })
|
await fastify.listen({ port, host: '0.0.0.0' })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ function createTransporter() {
|
|||||||
host: process.env.SMTP_HOST,
|
host: process.env.SMTP_HOST,
|
||||||
port: Number(process.env.SMTP_PORT),
|
port: Number(process.env.SMTP_PORT),
|
||||||
secure: process.env.SMTP_SECURE === 'true',
|
secure: process.env.SMTP_SECURE === 'true',
|
||||||
|
connectionTimeout: 5000,
|
||||||
|
greetingTimeout: 5000,
|
||||||
|
socketTimeout: 5000,
|
||||||
auth: {
|
auth: {
|
||||||
user: process.env.SMTP_USER,
|
user: process.env.SMTP_USER,
|
||||||
pass: process.env.SMTP_PASS,
|
pass: process.env.SMTP_PASS,
|
||||||
@@ -22,6 +25,7 @@ export async function sendLoginCodeEmail({ to, code }) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
const transporter = createTransporter()
|
const transporter = createTransporter()
|
||||||
const from = process.env.MAIL_FROM || process.env.SMTP_USER
|
const from = process.env.MAIL_FROM || process.env.SMTP_USER
|
||||||
|
|
||||||
@@ -31,6 +35,10 @@ export async function sendLoginCodeEmail({ to, code }) {
|
|||||||
subject: 'Код входа',
|
subject: 'Код входа',
|
||||||
text: `Ваш код: ${code}\n\nЕсли это были не вы — просто проигнорируйте письмо.`,
|
text: `Ваш код: ${code}\n\nЕсли это были не вы — просто проигнорируйте письмо.`,
|
||||||
})
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`[email] Failed to send login code to ${to}: ${err.message}`)
|
||||||
|
console.info(`[DEV] login code for ${to}: ${code}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function sendNotificationEmail({ to, subject, html }) {
|
export async function sendNotificationEmail({ to, subject, html }) {
|
||||||
|
|||||||
Reference in New Issue
Block a user