TgRouting/deamon/router/session.js

86 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// session.js
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
/**
* Получить запись ChatState для пары (userId, externalBotId).
* @param {string} userId
* @param {string} externalBotId
* @returns {Promise<import('@prisma/client').ChatState|null>}
*/
export async function getSessionState(userId, externalBotId) {
return prisma.chatState.findUnique({
where: {
userId_externalBotId: { userId, externalBotId }
}
})
}
/**
* Узнать, какой внутренний бот сейчас держит сессию.
* @param {string} userId
* @param {string} externalBotId
* @returns {Promise<string|null>} — возвращает botId или null
*/
export async function getLockingBot(userId, externalBotId) {
const state = await getSessionState(userId, externalBotId)
return state ? state.lockedByBot : null
}
/**
* Захватить внимание пользователя этим внутренним ботом.
* Запишет в lockedByBot = botId.
* @param {string} userId
* @param {string} externalBotId
* @param {string} botId — id внутреннего Bot
*/
export async function lockSessionToBot(userId, externalBotId, botId) {
await prisma.chatState.upsert({
where: {
userId_externalBotId: { userId, externalBotId }
},
update: {
lockedByBot: botId,
updatedAt: new Date()
},
create: {
userId,
externalBotId,
stateJson: {},
lockedByBot: botId
}
})
}
/**
* Освободить сессию у пользователя для данного внешнего бота.
* Запишет lockedByBot = null.
* @param {string} userId
* @param {string} externalBotId
*/
export async function unlockSession(userId, externalBotId) {
await prisma.chatState.updateMany({
where: {
userId,
externalBotId,
// только если была блокировка
lockedByBot: { not: null }
},
data: {
lockedByBot: null
}
})
}
/**
* Проверить, захватил ли сессию конкретный внутренний бот.
* @param {string} userId
* @param {string} externalBotId
* @param {string} botId
* @returns {Promise<boolean>}
*/
export async function isSessionLockedByBot(userId, externalBotId, botId) {
const state = await getSessionState(userId, externalBotId)
return !!state && state.lockedByBot === botId
}