messages-archive.js 2.58 KB
const redis = require('redis');

const config = require('komodo-sdk/config');
const logger = require('tektrans-logger');
const db = require('./db-mysql');

const DIRECTION_INCOMING = 0;
const DIRECTION_OUTGOING = 1;

let redisClient;

if (!config.redis) {
    logger.warn('Undefined config.redis, messages counter will not work! #05A778E21D7E');
} else {
    redisClient = redis.createClient(config.redis);
}

if (!redisClient) {
    logger.warn('Undefined redisClient, messages counter will not work! #1D3EC165E8D9');
}

function composeRedisCounterKeyword(origin, direction) {
    const directionLabel = Number(direction) === DIRECTION_OUTGOING ? 'OUT' : 'IN';
    return `CALMA_MESSAGE_COUNTER_${origin}_${directionLabel}`;
}

function incrementCounter(origin, direction) {
    if (!redisClient) {
        logger.warn('Undefined redisClient, not incrementing messages counter! #FF8E765E12E2');
    } else {
        redisClient.INCR(composeRedisCounterKeyword(origin, direction), () => {});
    }
}

/**
 * Menyimpan pesan ke dalam archive histori pesan di database
 *
 * @param  {object} params - objek pesan yang akan disimpan
 * @param  {string} [params.origin_label] - label origin
 * @param  {string} [params.origin=UNKNOWN] - digunakan sebagai label origin jika tdk ditentukan
 * @param  {string} [params.origin_transport=UNKNOWN] - transport, misal SMS, TELEGRAM
 * @param  {string} params.partner - pengirim / penerima
 * @param  {string} [params.msg] - isi pesan
 * @param  {string} [params.message] - isi pesan, jika params.msg tidak terdefinisi
 * @param  {number} direction - 0: incoming, 1: outgoing
 */
function insert(xid, params, direction) {
    incrementCounter(
        params.origin_label || params.origin,
        direction,
    );

    if (!db.pool) {
        logger.warn('MESSAGE-ARCHIVE: DB POOL is not ready to insert message history', { xid });
        return;
    }

    const query = 'INSERT INTO messages SET ?';
    const values = [{
        origin_label: (params.origin_label || params.origin || 'UNKNOWN').trim(),
        origin_transport: (params.origin_transport || 'UNKNOWN').trim(),
        direction,
        partner: params.partner.trim(),
        message: (params.msg || params.message).trim(),
    }];

    db.pool.query(query, values, async (err) => {
        if (err) {
            const fullQuery = await db.format(query, values);
            logger.warn(`MESSAGES-ARCHIVE: DB ERROR on inserting message. ${err.toString()}`, { xid, query: fullQuery });
        }
    });
}

exports.insert = insert;
exports.DIRECTION_INCOMING = DIRECTION_INCOMING;
exports.DIRECTION_OUTGOING = DIRECTION_OUTGOING;