lexica-dialog-core
Version:
Core server for Lexica dialog agent.
147 lines • 6.87 kB
JavaScript
;
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