Files
2026-04-07 14:50:23 +09:00

365 lines
15 KiB
JavaScript

var express = require('express');
var router = express.Router();
var utils = require('../../../../src/utils');
var crossCtl = require('../../../../src/crossCtl');
var localHandler = require('../../');
// operation
/*
router.use(function (req, res, next) {
next()
})
*/
function response4000WithHint(req, hint) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 4000,
Message: 'Bad request',
Description: hint,
},
},
{}
);
}
const request = require('request');
function handleCallbackOrNot(req, response) {
if (req.body.callback == undefined) {
localHandler.handleApiFinalResponse(req, response, {});
} else {
let options = {
uri: req.body.callback,
method: 'POST',
body: response,
json: true,
};
request.post(options, function (error, response, body) {
var logTag = crossCtl.sConfig.type + '.callback';
var logData = {
error: error,
response: response,
body: body,
};
crossCtl.logDebugInfo(logTag, req, logData);
localHandler.handleApiFinalResponse(req, response, {
error: error,
response: response,
body: body,
});
});
}
}
function handleRestOfFilterWork(req, mode, startTime) {
let trackingId = utils.rawuuid();
if (req.body.callback != undefined) {
localHandler.handleApiFinalResponse(
req,
{
TrackingId: trackingId,
Status: {
Code: 2020,
Message: 'Accepted',
Description:
'Filter work created with trackingId ' + trackingId,
},
},
{}
);
}
let options = { quick: false, longest: true };
if (mode == 'quick') {
options.quick = true;
}
localHandler.doSearchWithLevel(
req.keyInfo.level,
req.body.text ? req.body.text : '',
options,
function (err, result) {
if (err) {
handleCallbackOrNot(req, {
Status: {
Code: 5000,
Message: 'Internal service error',
Description:
'Error occurred during filtering text. error = ' +
err,
},
});
} else {
if (req.body.mode == 'filter') {
let filteredText = req.body.text;
for (var i = 0; i < result.length; i++) {
filteredText = localHandler.splice(
filteredText,
result[i][0],
result[i][1].length,
'*'.repeat(result[i][1].length)
);
}
handleCallbackOrNot(req, {
TrackingId: trackingId,
Status: {
Code: 2000,
Message: 'OK',
Description: '',
},
Detected: result,
Filtered: filteredText,
});
} else {
handleCallbackOrNot(req, {
TrackingId: trackingId,
Status: {
Code: 2000,
Message: 'OK',
Description: '',
},
Detected: result,
});
}
}
}
);
}
router.post('/status', function (req, res) {
req.workTag
.res()
.status(200)
.send({ status: 'ok', data: localHandler.getDashboardData() });
});
router.post('/dummycallback', function (req, res) {
var hero = req.body;
console.log('in dummycallback, hero=', hero);
req.workTag.res().status(200).send({ body: req.body });
});
router.post('/filter', function (req, res) {
req.startTime = process.hrtime();
let clientIP = utils.getIPFromReq(req);
let noBurstIPKey = 'noBurstIP_' + clientIP;
crossCtl.redis.doEasyIncrWithExpireAt(noBurstIPKey, 1, function (
err,
currentCount
) {
if (err) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 5000,
Message: 'Internal service error',
Description:
'Error occurred during check throttle limit for IP. error = ' +
err,
},
},
{}
);
} else {
if (currentCount > Number.MAX_SAFE_INTEGER) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 4290,
Message: 'Too many requests',
Description:
'Throttle limit exceeded. IP = ' +
clientIP +
', Count = ' +
currentCount,
},
},
{}
);
} else {
if (req.headers['x-api-key'] == undefined) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 4010,
Message: 'Unauthorized',
Description:
'This service requires an API key.',
},
},
{}
);
} else {
let apiKey = req.headers['x-api-key'];
localHandler.getAPIKeyInfo(apiKey, function (err, info) {
if (err) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 5000,
Message: 'Internal service error',
Description:
'Error occurred during retrive API Key Info. API key = ' +
apiKey +
', error = ' +
err,
},
},
{}
);
} else {
if (info == null) {
localHandler.handleApiFinalResponse(
req,
{
Status: {
Code: 4030,
Message: 'Unauthorized',
Description:
'Invalid API Key. Please verify your API key is valid. API key = ' +
apiKey,
},
},
{}
);
} else {
req.keyInfo = info;
if (req.body.text == undefined) {
response4000WithHint(
req,
'Missing field : text'
);
} else {
let mode = req.body.mode
? req.body.mode
: 'normal';
if (
mode != 'quick' &&
mode != 'normal' &&
mode != 'filter'
) {
response4000WithHint(
req,
'Bad field value. mode = ' + mode
);
} else {
if (info['checksum_timeout'] != 0) {
if (
req.body.checksum ==
undefined ||
req.body.ts == undefined
) {
response4000WithHint(
req,
'Missing field : checksum, ts'
);
} else {
let nowTS = Date.now();
let tsAge = parseInt(
(nowTS - req.body.ts) /
(1000 * 60)
);
if (
tsAge >
info['checksum_timeout']
) {
response4000WithHint(
req,
'Checksum Expired.'
);
} else {
// do checksum work
let serverChecksum = utils.getSHA256Hash(
info['secret'] +
'_' +
req.body.ts
);
if (
serverChecksum !=
req.body.checksum
) {
response4000WithHint(
req,
'Bad field value. checksum = ' +
req.body
.checksum
);
} else {
handleRestOfFilterWork(
req,
mode,
req.startTime
);
}
}
}
} else {
if (
req.body.checksum !=
undefined &&
req.body.ts != undefined
) {
// do checksum work
let serverChecksum = utils.getSHA256Hash(
info['secret'] +
'_' +
req.body.ts
);
if (
serverChecksum !=
req.body.checksum
) {
response4000WithHint(
req,
'Bad field value. checksum = ' +
req.body.checksum
);
} else {
handleRestOfFilterWork(
req,
mode,
req.startTime
);
}
} else {
handleRestOfFilterWork(
req,
mode,
req.startTime
);
}
}
}
}
}
}
});
}
}
}
});
});
module.exports = router;