'use strict';
const fs = require('fs');
const express = require('express');
const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');
const locks = require('locks');
const mutexSave = locks.createMutex();
const router = express.Router();
module.exports = router;
function saveConfig() {
return new Promise((resolve) => {
mutexSave.lock(() => {
fs.writeFile(global.KOMODO_SDK_CONFIG_FILENAME, JSON.stringify(config, null, 4), (err) => {
if (err) {
logger.warn(`APISERVER: ERROR writing config file. ${err.toString()}`);
}
mutexSave.unlock();
resolve();
});
});
});
}
function initConfig(req, res, next) {
if (typeof config.senders_imsi !== 'object') {
config.senders_imsi = {
prefix_names: {},
unknown_prefix: [],
default: [],
};
}
if (typeof config.senders_imsi.prefix_names !== 'object') {
config.senders_imsi.prefix_names = {};
}
if (!Array.isArray(config.senders_imsi.unknown_prefix)) {
config.senders_imsi.unknown_prefix = [];
}
if (!Array.isArray(config.senders_imsi.default)) {
config.senders_imsi.default = [];
}
next();
}
function pageIndex(req, res) {
res.json(config.senders_imsi);
}
async function delImsi(data, imsi, cleanup) {
const idx = data.indexOf(imsi);
if (idx < 0) return;
data.splice(idx, 1);
if (cleanup) {
Object.keys(config.senders_imsi.prefix_names).forEach((key) => {
if (!config.senders_imsi.prefix_names[key]) return;
if (!Array.isArray(config.senders_imsi.prefix_names[key])) return;
if (config.senders_imsi.prefix_names[key].length === 0) {
delete config.senders_imsi.prefix_names[key];
}
});
}
await saveConfig();
}
async function addImsi(data, imsi) {
if (data.indexOf(imsi) >= 0) {
return false;
}
data.push(imsi);
await saveConfig();
return true;
}
function addImsiResponse(req, res) {
if (res.locals.add_imsi_success) {
res.json({
status: 'OK',
message: 'IMSI berhasil didaftarkan',
});
} else {
res.json({
status: 'NOT OK',
message: 'IMSI sudah terdaftar',
});
}
}
/**
* Menambahkan IMSI pada list sender by prefix
*
* @param {object} req - Express request object
* @param {object} req.query - query string object
* @param {string} req.query.prefix - nama prefix
* @param {string} req.query.imsi - nomor imsi
* @param {object} res - Express result object
*/
async function pageAddForPrefix(req, res, next) {
if (!req.query.prefix) {
res.json({
status: 'NOT-OK',
message: 'Undefined prefix',
});
return;
}
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
req.query.prefix = req.query.prefix.toUpperCase();
if (!config.senders_imsi.prefix_names[req.query.prefix]) {
config.senders_imsi.prefix_names[req.query.prefix] = [];
}
res.locals.add_imsi_success = await addImsi(config.senders_imsi.prefix_names[req.query.prefix], req.query.imsi);
next();
}
async function pageDelForPrefix(req, res) {
if (!req.query.prefix) {
res.json({
status: 'NOT-OK',
message: 'Undefined prefix',
});
return;
}
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
await delImsi(config.senders_imsi.prefix_names[req.query.prefix], req.query.imsi, true);
res.json({
status: 'OK',
message: 'IMSI berhasil dihapus',
});
}
/**
* Menambahkan IMSI pada list sender untuk prefix tidak dikenal
*
* @param {object} req - Express request object
* @param {object} req.query - query string object
* @param {string} req.query.imsi - nomor imsi
* @param {object} res - Express result object
*/
async function pageAddForUnknownPrefix(req, res, next) {
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
res.locals.add_imsi_success = await addImsi(config.senders_imsi.unknown_prefix, req.query.imsi);
next();
}
async function pageDelForUnknownPrefix(req, res) {
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
await delImsi(config.senders_imsi.unknown_prefix, req.query.imsi);
res.json({
status: 'OK',
message: 'IMSI berhasil dihapus',
});
}
/**
* Menambahkan IMSI pada list sender default
*
* @param {object} req - Express request object
* @param {object} req.query - query string object
* @param {string} req.query.imsi - nomor imsi
* @param {object} res - Express result object
*/
async function pageAddForDefault(req, res, next) {
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
res.locals.add_imsi_success = await addImsi(config.senders_imsi.default, req.query.imsi);
next();
}
async function pageDelForDefault(req, res) {
if (!req.query.imsi) {
res.json({
status: 'NOT-OK',
message: 'Undefined IMSI',
});
return;
}
await delImsi(config.senders_imsi.default, req.query.imsi);
res.json({
status: 'OK',
message: 'IMSI berhasil dihapus',
});
}
router.use(initConfig);
router.get('/', initConfig, pageIndex);
router.get('/add-for-prefix', pageAddForPrefix, addImsiResponse);
router.get('/add-for-unknown-prefix', pageAddForUnknownPrefix, addImsiResponse);
router.get('/add-for-default', pageAddForDefault, addImsiResponse)
router.get('/del-for-prefix', pageDelForPrefix);
router.get('/del-for-unknown-prefix', pageDelForUnknownPrefix);
router.get('/del-for-default', pageDelForDefault);