diff --git a/core/stat_log.js b/core/stat_log.js index 9bf46a66..60e9e77f 100644 --- a/core/stat_log.js +++ b/core/stat_log.js @@ -50,6 +50,15 @@ class StatLog { }; } + get KeepType() { + return { + Forever : 'forever', + Days : 'days', + Max : 'max', + Count : 'max', + }; + } + get Order() { return { Timestamp : 'timestamp_asc', @@ -57,7 +66,7 @@ class StatLog { TimestampDesc : 'timestamp_desc', Random : 'random', }; - } + } setNonPeristentSystemStat(statName, statValue) { this.systemStats[statName] = statValue; @@ -129,33 +138,64 @@ class StatLog { // the time "now" in the ISO format we use and love :) get now() { return moment().format('YYYY-MM-DDTHH:mm:ss.SSSZ'); } - appendSystemLogEntry(logName, logValue, keepDays, cb) { + appendSystemLogEntry(logName, logValue, keep, keepType, cb) { sysDb.run( `INSERT INTO system_event_log (timestamp, log_name, log_value) VALUES (?, ?, ?);`, [ this.now, logName, logValue ], () => { // - // Handle keepDays + // Handle keep // - if(-1 === keepDays) { + if(-1 === keep) { if(cb) { return cb(null); } return; } - sysDb.run( - `DELETE FROM system_event_log - WHERE log_name = ? AND timestamp <= DATETIME("now", "-${keepDays} day");`, - [ logName ], - err => { - // cb optional - callers may fire & forget - if(cb) { - return cb(err); - } - } - ); + switch(keepType) { + // keep # of days + case 'days' : + sysDb.run( + `DELETE FROM system_event_log + WHERE log_name = ? AND timestamp <= DATETIME("now", "-${keep} day");`, + [ logName ], + err => { + // cb optional - callers may fire & forget + if(cb) { + return cb(err); + } + } + ); + break; + + case 'count': + case 'max' : + // keep max of N/count + sysDb.run( + `DELETE FROM system_event_log + WHERE id IN( + SELECT id + FROM system_event_log + WHERE log_name = ? + ORDER BY id DESC + LIMIT -1 OFFSET ${keep} + );`, + [ logName ], + err => { + if(cb) { + return cb(err); + } + } + ); + break; + + case 'forever' : + default : + // nop + break; + } } ); } diff --git a/core/user_login.js b/core/user_login.js index 4c3cfcc6..038a0a4b 100644 --- a/core/user_login.js +++ b/core/user_login.js @@ -73,7 +73,8 @@ function userLogin(client, username, password, cb) { StatLog.incrementUserStat(user, 'login_count', 1, callback); }, function recordLoginHistory(callback) { - StatLog.appendSystemLogEntry('user_login_history', user.userId, 30, callback); + const LOGIN_HISTORY_MAX = 200; // history of up to last 200 callers + StatLog.appendSystemLogEntry('user_login_history', user.userId, LOGIN_HISTORY_MAX, StatLog.KeepType.Max, callback); } ], function complete(err) { diff --git a/mods/rumorz.js b/mods/rumorz.js index abc88886..45656ddf 100644 --- a/mods/rumorz.js +++ b/mods/rumorz.js @@ -52,7 +52,7 @@ exports.getModule = class RumorzModule extends MenuModule { if(_.isString(formData.value.rumor) && renderStringLength(formData.value.rumor) > 0) { const rumor = formData.value.rumor.trim(); // remove any trailing ws - StatLog.appendSystemLogEntry(STATLOG_KEY_RUMORZ, rumor, StatLog.KeepDays.Forever, () => { + StatLog.appendSystemLogEntry(STATLOG_KEY_RUMORZ, rumor, StatLog.KeepDays.Forever, StatLog.KeepType.Forever, () => { this.clearAddForm(); return this.displayViewScreen(true, cb); // true=cls });