function update_res_with_hit()

in lambda/es-proxy-layer/lib/query.js [376:479]


function update_res_with_hit(req, res, hit) {
    res.result = hit;
    res.type = "PlainText";
    res.message = res.result.a;
    res.plainMessage = res.result.a;

    // add question defined session attributes to res with the exception of qnabotcontext and appContext
    if (_.get(hit, "sa")){
        hit.sa.map(obj=>{
            _.set(res, `session.${obj.text}`, obj.value);
        })
    }

    // Add tags to the res object
    const tags = _.get(hit, "tags");
    if (tags){
        _.set(res, 'tags', tags);
    }

    // Add answerSource for query hits
    var ansSource = _.get(hit, "answersource", "unknown");
    if (ansSource==="Kendra FAQ") { // kendra fallback sets answerSource directly
        res.answerSource = "KENDRA FAQ";
    } else if (ansSource==="ElasticSearch" || ansSource==="ElasticSearch Fallback") {
        res.answerSource = "ELASTICSEARCH";
    } else {
        res.answerSource = ansSource;
    }

    // Add alt messages to appContext session attribute JSON value (for lex-web-ui)
    var tmp;
    try {
        tmp=JSON.parse(_.get(res,"session.appContext","{}"));
    } catch(e) {
        tmp=_.get(res,"session.appContext","{}");
    }
    tmp.altMessages=_.get(res, "result.alt", {});
    _.set(res, "session.appContext",tmp);

    // Add reprompt 
    var rp = _.get(res, "result.rp");
    if (rp) {
        var type = 'PlainText';
        
        if (rp.includes("<speak>")) {
            type = 'SSML';
            rp = rp.replace(/\r?\n|\r/g, ' ');
        }
        _.set(res, "reprompt",{type, text : rp });
    }

    if (req._preferredResponseType == "SSML") {
        if (_.get(res, "result.alt.ssml")) {
            res.type = "SSML";
            res.message = res.result.alt.ssml.replace(/\r?\n|\r/g, ' ');
        }
    }
    qnabot.log(res.message);
    var card = _.get(res, "result.r.title") ? res.result.r : null;

    if (card) {
        if (res.card === undefined) {
            res.card = {};
        }
        res.card.send = true;
        res.card.title = _.get(card, 'title');
        res.card.subTitle = _.get(card, 'subTitle');
        res.card.imageUrl = _.get(card, 'imageUrl');
        res.card.buttons = _.get(card, 'buttons');
    }

    var previousQid = _.get(res, "session.qnabotcontext.previous.qid", false);
    var navigationJson = _.get(res, "session.qnabotcontext.navigation", false);
    var previousArray = _.get(res, "session.qnabotcontext.navigation.previous", []);
    if (
        previousQid != _.get(res.result, "qid") &&
        _.get(navigationJson, "hasParent", true) == false &&
        req._info.es.type == 'qna') {
        if (previousArray.length == 0) {
            previousArray.push(previousQid);
        } else if (previousArray[previousArray.length - 1] != previousQid) {
            previousArray.push(previousQid);
        }
    }
    if (previousArray.length > 10) {
        previousArray.shift();
    }
    var hasParent = true;
    if ("next" in res.result) {
        hasParent = false;
    }
    _.set(res,"session.qnabotcontext.previous", {
        qid: _.get(res.result, "qid"),
        q: req.question
        }) ;
     _.set(res,"session.qnabotcontext.navigation", {
        next: _.get(res.result, "next", _.get(res, "session.qnabotcontext.navigation.next", "")),
        previous: previousArray,
        hasParent: hasParent
        }) ;
    res.session.qnabot_qid = _.get(res.result, "qid", "") ;
    res.session.qnabot_gotanswer = (res['got_hits'] > 0) ? true : false ;
    return res;
}