UNPKG

lexica-dialog-core

Version:
147 lines 6.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const immutable_1 = require("immutable"); const lodash_1 = require("lodash"); const Api_1 = require("../Api"); const Issue_1 = require("lexica-dialog-model/dist/Issue"); const Message_1 = require("lexica-dialog-model/dist/Message"); const updateLog = async (messageRepository, requestMessage, issue) => { requestMessage.issueId = issue.id; await messageRepository.save(requestMessage); }; const sortMessage = (messages) => { const sortedMessages = messages.slice(); sortedMessages.sort((a, b) => a.date.getTime() - b.date.getTime()); return sortedMessages; }; const findFirstLibrarianMessage = (messages) => { const sortedMessages = sortMessage(messages).filter(message => lodash_1.isNil(message.sessionId)); if (sortedMessages.length === 0) { return null; } return sortedMessages[0]; }; const getLastMessageTimeGap = (messages) => { if (messages.length <= 1) { return 0; } const sortedMessages = sortMessage(messages); const lastMessage = sortedMessages.pop(); const last2Message = sortedMessages.pop(); return lastMessage.date.getTime() - last2Message.date.getTime(); }; const suspendAutoReplyMiddleware = async (context, next) => { const { uni, uniConfigs, request, messenger, issueRepository, messageRepository, requestMessage, intentRepository, logger, } = context; if (!lodash_1.isNil(request)) { const { senderId } = request; const issues = await issueRepository.findByUniAndSenderIdAndStatus(uni, senderId, Issue_1.Status.OPEN); let issue; if (uniConfigs.has(Api_1.RunTimeConfig.SUSPEND_AUTO_REPLY) && uniConfigs.get(Api_1.RunTimeConfig.SUSPEND_AUTO_REPLY).value) { if (issues.length === 0) { const date = new Date(); issue = await issueRepository.create({ lastUpdatedDate: date, messenger: messenger.name, openDate: date, senderId, status: Issue_1.Status.OPEN, uni, }); if (!lodash_1.isNil(requestMessage)) { await updateLog(messageRepository, requestMessage, issue); } context.issue = issue; return; } } if (issues.length === 0) { await next(); } else { const workingIssue = issues[0]; const messages = sortMessage(await messageRepository.findByUniAndSenderIdAndIssueId(uni, senderId, workingIssue.id)); const firstLibrarianMessage = findFirstLibrarianMessage(messages); if (lodash_1.isNil(firstLibrarianMessage)) { await next(); } else { const timeGap = getLastMessageTimeGap(messages); const commandNameConfig = uniConfigs.get(Api_1.RunTimeConfig.CONFIRM_CLOSE_ISSUE_COMMAND_NAME); const timeGapConfig = uniConfigs.get(Api_1.RunTimeConfig.TIME_GAP_IN_MS_TRIGGER_CONFIRM_CLOSE_ISSUE); const recreateIssueConfig = uniConfigs.get(Api_1.RunTimeConfig.RECREATE_ISSUE_KEY_WORD); let goToNext = false; if (lodash_1.isNil(commandNameConfig)) { logger.warn('Config not found: [%s]', Api_1.RunTimeConfig.CONFIRM_CLOSE_ISSUE_COMMAND_NAME); } if (lodash_1.isNil(timeGapConfig)) { logger.warn('Config not found: [%s]', Api_1.RunTimeConfig.TIME_GAP_IN_MS_TRIGGER_CONFIRM_CLOSE_ISSUE); } if (lodash_1.isNil(recreateIssueConfig)) { logger.warn('Config not found: [%s]', Api_1.RunTimeConfig.RECREATE_ISSUE_KEY_WORD); } const recreateIssueWords = lodash_1.isNil(recreateIssueConfig) ? '' : recreateIssueConfig.value.toLowerCase(); const requestText = lodash_1.isNil(request.message) ? undefined : request.message.toLowerCase(); if (!goToNext && recreateIssueWords === requestText) { const date = new Date(); const newIssue = { lastUpdatedDate: date, messenger: messenger.name, openDate: date, senderId, status: Issue_1.Status.OPEN, uni, }; workingIssue.status = Issue_1.Status.CLOSED; workingIssue.closedDate = date; workingIssue.lastUpdatedDate = date; await issueRepository.save(workingIssue); context.issue = await issueRepository.create(newIssue); if (!lodash_1.isNil(requestMessage)) { await updateLog(messageRepository, requestMessage, workingIssue); } goToNext = true; } if (!goToNext && !lodash_1.isNil(commandNameConfig) && !lodash_1.isNil(timeGapConfig) && timeGap >= timeGapConfig.value) { const commandName = commandNameConfig.value; context.commands = context.commands.clear().push({ attributes: immutable_1.Map(), botResponses: immutable_1.List(), features: immutable_1.Map(), name: commandName, processedFeatures: immutable_1.Map(), }); if (!lodash_1.isNil(requestMessage)) { requestMessage.commands.push(commandName); context.requestMessage = (await messageRepository.save(requestMessage)); } goToNext = true; } if (!goToNext && !lodash_1.isNil(commandNameConfig)) { const commandName = commandNameConfig.value; goToNext = messages .filter(message => message.type === Message_1.MessageType.REQUEST) .some(message => { if (!lodash_1.isNil(message.commands) && message.commands.indexOf(commandName) !== -1) { return true; } return false; }); } if (goToNext) { await next(); } } } } else { await next(); } }; exports.default = suspendAutoReplyMiddleware; //# sourceMappingURL=SuspendAutoReplyMiddleware.js.map