From a10d3db01b26bbd8fafd9de8f4197b7412e222dc Mon Sep 17 00:00:00 2001 From: OldHawk Date: Thu, 24 May 2018 15:51:51 +0800 Subject: [PATCH] feat(score): write user score detail log --- config/env/torrents.js | 13 ++-- config/lib/cron-job.js | 64 ++++++++++++++++++- config/lib/data-log.js | 27 -------- config/lib/score.js | 18 ++++-- .../announces.server.controller.js | 17 ++--- .../server/models/score-log.server.model.js | 37 +++++++++++ .../controllers/admin.server.controller.js | 18 +++++- 7 files changed, 142 insertions(+), 52 deletions(-) create mode 100644 modules/data-logs/server/models/score-log.server.model.js diff --git a/config/env/torrents.js b/config/env/torrents.js index 4bb8a707..885aa31f 100644 --- a/config/env/torrents.js +++ b/config/env/torrents.js @@ -102,7 +102,7 @@ module.exports = { * @announceIdleTime: announce time over @announceInterval this value is inactive peer * @announcePrefix: prefix of torrent file name, is will auto add when user download the torrent files * @clientBlackListUrl: forbidden download client list url, user can view this list to check forbidden client software - * @announceLogMonths: setting of months to write announce log to db, because the data is too more too big, default value is 1 + * @announceLogDays: setting of days to write announce log to db, because the data is too more too big, do not to set a big value * @daysLogMonths: setting of months to write user days log * @seedingInFinishedCheck: settings to check whether can seeding an un-download finished torrent * @downloadCheck: announce download(leech) settings @@ -134,7 +134,7 @@ module.exports = { announcePrefix: '{MEAN}.', sourceInfo: '{MEAN.im} Present by meanTorrent.', clientBlackListUrl: '/about/black', - announceLogMonths: 1, + announceLogDays: 30, daysLogMonths: 12, seedingInFinishedCheck: true, downloadCheck: { @@ -429,6 +429,7 @@ module.exports = { * score system settings * * @levelStep: value of each level step, default 500 + * @scoreLogDays: setting of days to write score detail log to db, because the data is too more too big, do not to set a big value * @action: score change action list * @name: action name * @value: action score value @@ -437,8 +438,10 @@ module.exports = { */ score: { levelStep: 1000, + scoreLogDays: 10, action: { defaultAction: {name: 'defaultAction', value: 0, enable: true}, + adminModify: {name: 'adminModify', value: 0, enable: true}, uploadTorrent: {name: 'uploadTorrent', value: 50, enable: true}, uploadTorrentBeDeleted: {name: 'uploadTorrentBeDeleted', value: -50, enable: true}, @@ -648,14 +651,16 @@ module.exports = { * * system trace logs settings * + * @traceLogDays: setting trace log days, because data to more, do not to set a big value * @action: trace action list * @name: action name * @enable: action enable status, if false, system will not to trace log this action * * !IMPORTANT NOTE: - * @userAnnounceData AND @userScoreChange MAKE LARGEST NUMBER DATA RECORD, IF YOU RUNNING MEANTORRENT AT PROD MODE, MUST SET IT TO FALSE + * @userAnnounceData MAKE LARGEST NUMBER DATA RECORD, IF YOU RUNNING MEANTORRENT AT PROD MODE, MUST SET IT TO FALSE */ trace: { + traceLogDays: 10, action: { AdminUpdateUserRole: {name: 'AdminUpdateUserRole', enable: true}, AdminUpdateUserStatus: {name: 'AdminUpdateUserStatus', enable: true}, @@ -689,9 +694,7 @@ module.exports = { userSendInvitation: {name: 'userSendInvitation', enable: true}, adminSendOfficialInvitation: {name: 'adminSendOfficialInvitation', enable: true}, - userAnnounceData: {name: 'userAnnounceData', enable: false}, userAnnounceFinished: {name: 'userAnnounceFinished', enable: true}, - userScoreChange: {name: 'userScoreChange', enable: true}, forumDeleteTopic: {name: 'forumDeleteTopic', enable: true}, forumDeleteReply: {name: 'forumDeleteReply', enable: true} diff --git a/config/lib/cron-job.js b/config/lib/cron-job.js index 695c7b4f..0f2fd9b0 100644 --- a/config/lib/cron-job.js +++ b/config/lib/cron-job.js @@ -15,6 +15,11 @@ var path = require('path'), Complete = mongoose.model('Complete'), Message = mongoose.model('Message'), MailTicket = mongoose.model('MailTicket'), + AnnounceLog = mongoose.model('AnnounceLog'), + UserDaysLog = mongoose.model('UserDaysLog'), + UserMonthsLog = mongoose.model('UserMonthsLog'), + ScoreLog = mongoose.model('ScoreLog'), + Trace = mongoose.model('Trace'), backup = require('mongodb-backup'); var mtDebug = require(path.resolve('./config/lib/debug')); @@ -22,9 +27,11 @@ var appConfig = config.meanTorrentConfig.app; var supportConfig = config.meanTorrentConfig.support; var backupConfig = config.meanTorrentConfig.backup; var announceConfig = config.meanTorrentConfig.announce; +var scoreConfig = config.meanTorrentConfig.score; var signConfig = config.meanTorrentConfig.sign; var hnrConfig = config.meanTorrentConfig.hitAndRun; var messageConfig = config.meanTorrentConfig.messages; +var traceConfig = config.meanTorrentConfig.trace; var inbox = require('inbox'); var simpleParser = require('mailparser').simpleParser; @@ -75,6 +82,7 @@ module.exports = function (app) { cronJobs.push(removeGhostPeers()); cronJobs.push(removeOldServerMessages()); + cronJobs.push(removeOldLogData()); cronJobs.push(checkUserAccountIdleStatus()); if (hnrConfig.enable) { @@ -202,12 +210,66 @@ function removeOldServerMessages() { return cronJob; } +/** + * removeOldLogData + */ +function removeOldLogData() { + var cronJob = new CronJob({ + cronTime: '00 10 1 * * *', + onTick: function () { + logger.info(chalk.green('removeOldLogData: process!')); + + //remove announce-log old data + AnnounceLog.remove({ + createdAt: {$lt: moment().subtract(announceConfig.announceLogDays, 'days')} + }, function (err) { + if (err) { + logger.error(err); + } + }); + + //remove user-days-log old data + UserDaysLog.remove({ + createdAt: {$lt: moment().subtract(announceConfig.daysLogMonths, 'months')} + }, function (err) { + if (err) { + logger.error(err); + } + }); + + //remove score-log old data + ScoreLog.remove({ + createdAt: {$lt: moment().subtract(scoreConfig.scoreLogDays, 'days')} + }, function (err) { + if (err) { + logger.error(err); + } + }); + + //remove trace-log old data + Trace.remove({ + createdat: {$lt: moment().subtract(traceConfig.traceLogDays, 'days')} + }, function (err) { + if (err) { + logger.error(err); + } + }); + }, + start: false, + timeZone: appConfig.cronTimeZone + }); + + cronJob.start(); + + return cronJob; +} + /** * checkUserAccountIdleStatus */ function checkUserAccountIdleStatus() { var cronJob = new CronJob({ - cronTime: '00 10 1 * * *', + cronTime: '00 15 1 * * *', // cronTime: '*/30 * * * * *', onTick: function () { logger.info(chalk.green('checkUserAccountIdleStatus: process!')); diff --git a/config/lib/data-log.js b/config/lib/data-log.js index 12cc07c0..2fc18dd9 100644 --- a/config/lib/data-log.js +++ b/config/lib/data-log.js @@ -44,15 +44,6 @@ module.exports.announceLog = function (user, torrent, data) { } }); - //remove announce-log old data - AnnounceLog.remove({ - createdAt: {$lt: moment().subtract(announceConfig.announceLogMonths, 'months')} - }, function (err) { - if (err) { - logger.error(err); - } - }); - //write userDaysLog var mom = moment().utcOffset(appConfig.dbTimeZone); var y = mom.get('year'); @@ -80,15 +71,6 @@ module.exports.announceLog = function (user, torrent, data) { if (err) { logger.error(err); } else { - //remove user-days-log old data - UserDaysLog.remove({ - createdAt: {$lt: moment().subtract(announceConfig.daysLogMonths, 'months')} - }, function (err) { - if (err) { - logger.error(err); - } - }); - //write userMonthsLog UserMonthsLog.findOneAndUpdate( { @@ -146,15 +128,6 @@ module.exports.scoreLog = function (user, score) { if (err) { logger.error(err); } else { - //remove user-days-log old data - UserDaysLog.remove({ - createdAt: {$lt: moment().subtract(announceConfig.daysLogMonths, 'months')} - }, function (err) { - if (err) { - logger.error(err); - } - }); - //write userMonthsLog UserMonthsLog.findOneAndUpdate( { diff --git a/config/lib/score.js b/config/lib/score.js index da59a94d..88c97b6a 100644 --- a/config/lib/score.js +++ b/config/lib/score.js @@ -7,10 +7,8 @@ var path = require('path'), common = require(path.resolve('./config/lib/common')), mongoose = require('mongoose'), User = mongoose.model('User'), - traceLogCreate = require(path.resolve('./config/lib/tracelog')).create; + ScoreLog = mongoose.model('ScoreLog'); -var traceConfig = config.meanTorrentConfig.trace; -var examinationConfig = config.meanTorrentConfig.examination; var scoreConfig = config.meanTorrentConfig.score; var mtDebug = require(path.resolve('./config/lib/debug')); @@ -44,10 +42,18 @@ module.exports.update = function (req, user, action, value, writeLog = true) { if (err) { logger.error(err); } else { - traceLogCreate(req, traceConfig.action.userScoreChange, { - user: user._id, + var sl = new ScoreLog({ + user: user, score: v, - scoreActionName: action.name + reason: { + event: action.name, + params: action.params + } + }); + sl.save(function (err) { + if (err) { + logger.error(err); + } }); } }); diff --git a/modules/announce/server/controllers/announces.server.controller.js b/modules/announce/server/controllers/announces.server.controller.js index f3495bcd..a5500505 100644 --- a/modules/announce/server/controllers/announces.server.controller.js +++ b/modules/announce/server/controllers/announces.server.controller.js @@ -680,21 +680,14 @@ exports.announce = function (req, res) { downUnitScore: downUnitScore, seederUnit: seederUnit, lifeUnit: lifeUnit + }, + info: { + agent: req.get('User-Agent'), + ip: req.cf_ip, + port: query.port } }; dataLog.announceLog(req.passkeyuser, req.torrent, logData); - - //create trace log - var traceData = { - user: req.passkeyuser._id, - torrent: req.torrent._id, - agent: req.get('User-Agent'), - ip: req.cf_ip, - port: query.port, - traceData: logData - }; - - traceLogCreate(req, traceConfig.action.userAnnounceData, traceData); } } diff --git a/modules/data-logs/server/models/score-log.server.model.js b/modules/data-logs/server/models/score-log.server.model.js new file mode 100644 index 00000000..1f9e782d --- /dev/null +++ b/modules/data-logs/server/models/score-log.server.model.js @@ -0,0 +1,37 @@ +'use strict'; + +/** + * Module dependencies + */ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; + +/** + * Peer Schema + */ +var ScoreLogSchema = new Schema({ + user: { + type: Schema.Types.ObjectId, + ref: 'User' + }, + score: { + type: Schema.Types.Decimal128, + get: function (v) { + return parseFloat(parseFloat(v).toFixed(2)) || 0; + }, + default: 0 + }, + reason: { + event: {type: String, trim: true, default: ''}, + params: {type: Object} + }, + createdAt: { + type: Date, + default: Date.now + } +}, {usePushEach: true}); + + +ScoreLogSchema.index({user: 1, createdAt: -1}); + +mongoose.model('ScoreLog', ScoreLogSchema); diff --git a/modules/users/server/controllers/admin.server.controller.js b/modules/users/server/controllers/admin.server.controller.js index 947bc778..358b3ee3 100644 --- a/modules/users/server/controllers/admin.server.controller.js +++ b/modules/users/server/controllers/admin.server.controller.js @@ -14,6 +14,7 @@ var path = require('path'), Complete = mongoose.model('Complete'), moment = require('moment'), async = require('async'), + ScoreLog = mongoose.model('ScoreLog'), scoreUpdate = require(path.resolve('./config/lib/score')).update, errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')), traceLogCreate = require(path.resolve('./config/lib/tracelog')).create; @@ -305,11 +306,26 @@ exports.updateUserScore = function (req, res) { res.json(user); + //write score detail log + var sl = new ScoreLog({ + user: user, + score: sv, + reason: { + event: scoreConfig.action.adminModify.name, + params: undefined + } + }); + sl.save(function (err) { + if (err) { + mtDebug.debugError(err); + } + }); + //write score days/months log dataLog.scoreLog(user, sv); //create trace log traceLogCreate(req, traceConfig.action.AdminUpdateUserScore, { user: user._id, - score: req.body.userScore + score: sv }); }); };