const hash = require('object-hash'); const DBName = "EMI_SOCIAL"; postDB = (DB) => { DB.pathLogs = DB.db.db(DBName).collection("pathLogs"); DB.profileLogs = DB.db.db(DBName).collection("profileLogs"); let loggerPathData = {}; let loggerProfileData = {}; DB.logger = async (req, res, next) => { // hash should not include query parameters let hashIndx = hash(req.url.split('/')); // Log url based if (!loggerPathData[hashIndx]) { loggerPathData[hashIndx] = { url: req.url, urlParts: req.url.split('/'), count: 1 } } else { loggerPathData[hashIndx].count++; } // Log user based let profile_id = req.cookies?.profile_id; if (!profile_id) return next(); if (!loggerProfileData[profile_id]) { loggerProfileData[profile_id] = {} } if (!loggerProfileData[profile_id][hashIndx]) { loggerProfileData[profile_id][hashIndx] = { url: req.url, urlParts: req.url.split('/'), count: 1 } } else { loggerProfileData[profile_id][hashIndx].count++; } //console.log(loggerData); next(); }; // Update counters in DB setInterval(async () => { // Restart global counters let localPathData = loggerPathData; loggerPathData = {}; let localProfileData = loggerProfileData; loggerProfileData = {}; return 0; console.log('updating', localPathData); Object.keys(localPathData).forEach(key => { DB.pathLogs.findOne({ hash: key }).then(async (doc) => { if (doc) { //Update const update = { $inc: { count: localPathData[key].count } }; console.log('updating one ' + key) await DB.pathLogs.updateOne({ hash: key }, update); } else { //Insert const update = localPathData[key]; update.hash = key; console.log('inserting one ' + key) await DB.pathLogs.insertOne(update); } }).catch(console.error); }); //DB.pathLogs. Object.keys(localProfileData).forEach(key => { DB.profileLogs.findOne({profile_id: key}).then(async (doc) => { if (doc) { //Update for user log const update = { $inc: { //count: localPathData[key].count } }; loggerProfileData[key].forEach((hashIndx)=>{ //each hash has its counter. update.$inc['hashIndx'] = { count: loggerProfileData[key]['hashIndx'].count }; }); console.log('updating one user' + key) await DB.profileLogs.updateOne({ profile_id: key }, update); } else { //Insert const update = loggerProfileData[key]; update.profile_id = key; console.log('inserting one user' + key) await DB.profileLogs.insertOne(update); } }); }); }, 1000 * 60 * 1); //Each 10 mins } module.exports = postDB;