diff --git a/apis/enterprise.js b/apis/enterprise.js index 7d39502..ce82f61 100644 --- a/apis/enterprise.js +++ b/apis/enterprise.js @@ -6,6 +6,7 @@ const config = require('config') const db = require('../models/mongodb') const { addFileToXinfinIpfs } = require('../helpers/ipfs') +const kycLogger = require('../middlewares/kycLogger') function unauthorized (res, reason) { return res.status(401).json({ @@ -51,7 +52,7 @@ router.post('/keys', async (req, res) => { }) // Enterprise addKYC endpoint -router.post('/addKYC', async (req, res) => { +router.post('/addKYC', kycLogger, async (req, res) => { try { const apiKey = req.headers['x-api-key'] const apiTimestamp = req.headers['x-api-timestamp'] diff --git a/apis/ipfs.js b/apis/ipfs.js index c98d843..a7ec9d1 100644 --- a/apis/ipfs.js +++ b/apis/ipfs.js @@ -7,6 +7,7 @@ const web3 = require('../models/blockchain/web3rpc').Web3RpcInternal() const { recoverPersonalSignAddress, isValidEIP1271Signature } = require('../helpers/personalSign') const { addFileToXinfinIpfs } = require('../helpers/ipfs') +const kycLogger = require('../middlewares/kycLogger') function toHexAddress (address) { if (!address || typeof address !== 'string') return '' @@ -42,7 +43,7 @@ if (!fs.existsSync(path.join(__dirname, '../tmp/'))) { fs.mkdirSync(path.join(__dirname, '../tmp/')) } -router.post('/addKYC', async function (req, res, next) { +router.post('/addKYC', kycLogger, async function (req, res, next) { const account = normalizeValue( req.body.account || req.headers['x-kyc-account'] || diff --git a/middlewares/kycLogger.js b/middlewares/kycLogger.js new file mode 100644 index 0000000..e70c364 --- /dev/null +++ b/middlewares/kycLogger.js @@ -0,0 +1,51 @@ +'use strict' + +const db = require('../models/mongodb') + +async function kycLogger (req, res, next) { + const originalJson = res.json + const originalSend = res.send + let responseSent = false + + const logEntry = new db.KycLog({ + endpoint: req.originalUrl, + method: req.method, + headers: req.headers, + body: req.body, + query: req.query, + ip: req.ip + }) + + if (req.files) { + logEntry.files = Object.keys(req.files).map(k => ({ + fieldname: k, + name: req.files[k].name, + size: req.files[k].size, + mimetype: req.files[k].mimetype + })) + } + + const saveLog = (data, statusCode) => { + if (!responseSent) { + responseSent = true + logEntry.responseStatus = statusCode || res.statusCode + logEntry.responseData = data + logEntry.success = logEntry.responseStatus >= 200 && logEntry.responseStatus < 300 + logEntry.save().catch(err => console.error('KycLog save error:', err)) + } + } + + res.json = function (data) { + saveLog(data, res.statusCode) + return originalJson.call(this, data) + } + + res.send = function (data) { + saveLog(typeof data === 'string' ? data : data ? data.toString() : data, res.statusCode) + return originalSend.call(this, data) + } + + next() +} + +module.exports = kycLogger diff --git a/models/mongodb/kycLog.js b/models/mongodb/kycLog.js new file mode 100644 index 0000000..1ba195a --- /dev/null +++ b/models/mongodb/kycLog.js @@ -0,0 +1,21 @@ +'use strict' + +const mongoose = require('mongoose') +const Schema = mongoose.Schema + +const KycLogSchema = new Schema({ + endpoint: String, + method: String, + headers: Schema.Types.Mixed, + body: Schema.Types.Mixed, + query: Schema.Types.Mixed, + ip: String, + files: [Schema.Types.Mixed], + responseStatus: Number, + responseData: Schema.Types.Mixed, + success: Boolean +}, { + timestamps: true +}) + +module.exports = mongoose.model('KycLog', KycLogSchema)