182 lines
5.0 KiB
JavaScript
Executable File
182 lines
5.0 KiB
JavaScript
Executable File
const mongoose = require('mongoose').set('debug', false);
|
|
const Schema = mongoose.Schema;
|
|
|
|
mongoose.Promise = global.Promise;
|
|
mongoose.level = 'F';
|
|
|
|
const tools = require('../tools/general');
|
|
|
|
const { User } = require('../models/user');
|
|
const { Movement } = require('../models/movement');
|
|
const { Circuit } = require('../models/circuit');
|
|
const { MyGroup } = require('../models/mygroup');
|
|
const { Settings } = require('../models/settings');
|
|
|
|
const shared_consts = require('../tools/shared_nodejs');
|
|
const { ObjectID } = require('mongodb');
|
|
|
|
// Resolving error Unknown modifier: $pushAll
|
|
mongoose.plugin(schema => {
|
|
schema.options.usePushEach = true;
|
|
});
|
|
|
|
const StatSchema = new Schema({
|
|
...{
|
|
_id: {
|
|
type: String,
|
|
},
|
|
idapp: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
num_reg: {
|
|
type: Number,
|
|
},
|
|
date_created: {
|
|
type: Date,
|
|
default: Date.now,
|
|
},
|
|
num_reg: Number,
|
|
num_reg_today: Number,
|
|
online_today: Number,
|
|
activeusers: Number,
|
|
num_teleg_attivo: Number,
|
|
num_autorizzati: Number,
|
|
num_autorizzare: Number,
|
|
num_teleg_pending: Number,
|
|
arr_nations: [],
|
|
numreg_untilday: Number,
|
|
reg_daily: [],
|
|
reg_weekly: [],
|
|
lastsreg: [],
|
|
lastsonline: [],
|
|
lastssharedlink: [],
|
|
diffusorilist: [],
|
|
receiveRislist: [],
|
|
receiveRislistgroup: [],
|
|
strettelist: [],
|
|
num_transaz_tot: Number,
|
|
tot_RIS_transati: Number,
|
|
num_circuiti: Number,
|
|
num_circuiti_attivi: Number,
|
|
num_annunci: Number,
|
|
last_transactions: [],
|
|
},
|
|
});
|
|
|
|
StatSchema.statics.updateStats = async function (datastat) {
|
|
|
|
datastat.last_transactions.forEach(function (mov) {
|
|
let ris = tools.getStringaConto(mov)
|
|
mov.myfrom = ris.myfrom
|
|
mov.myto = ris.myto
|
|
mov.tipocontofrom = ris.tipocontofrom
|
|
mov.tipocontoto = ris.tipocontoto
|
|
});
|
|
|
|
|
|
return datastat;
|
|
};
|
|
|
|
StatSchema.statics.calculateStats = async function (idapp) {
|
|
const Stat = this;
|
|
|
|
try {
|
|
|
|
let datastat = {
|
|
idapp,
|
|
num_reg: await User.getUsersRegistered(idapp),
|
|
num_reg_today: await User.getUsersRegisteredToday(idapp),
|
|
online_today: await User.getUsersOnLineToday(idapp),
|
|
activeusers: await User.getUsersOnLineActive(idapp),
|
|
num_teleg_attivo: await User.getUsersTelegramAttivo(idapp),
|
|
num_autorizzati: await User.getUsersAutorizzati(idapp),
|
|
num_autorizzare: await User.getUsersAutorizzare(idapp),
|
|
num_teleg_pending: await User.getUsersTelegramPending(idapp),
|
|
arr_nations: await User.findAllDistinctNationality(idapp),
|
|
numreg_untilday: await User.calcnumRegUntilDay(idapp),
|
|
reg_daily: await User.calcRegDaily(idapp),
|
|
reg_weekly: await User.calcRegWeekly(idapp),
|
|
lastsreg: await User.getLastUsers(idapp),
|
|
lastsonline: await User.getLastOnlineUsers(idapp),
|
|
lastssharedlink: await User.getLastSharedLink(idapp),
|
|
diffusorilist: await User.getDiffusoriUsers(idapp),
|
|
receiveRislist: await User.getReceiveRISUsers(idapp),
|
|
receiveRislistgroup: await MyGroup.getReceiveRISGroups(idapp),
|
|
strettelist: await User.getBestStretteDiManoUsers(idapp),
|
|
num_transaz_tot: await Movement.getTotal_Transactions(idapp),
|
|
tot_RIS_transati: await Movement.getTot_RIS_Transati(idapp),
|
|
num_circuiti: await Circuit.getnumCircuits(idapp),
|
|
num_circuiti_attivi: await Circuit.getnumActiveCircuits(idapp),
|
|
num_annunci: await User.getnumAnnunci(idapp),
|
|
last_transactions: await Movement.getLastN_Transactions(idapp, 10),
|
|
};
|
|
|
|
// Trova il record di oggi:
|
|
const trova_se_oggi = await Stat.findOne({ idapp, date_created: { $gte: new Date(new Date().setHours(0, 0, 0, 0)) } });
|
|
|
|
if (trova_se_oggi) {
|
|
// Aggiorna il record di oggi:
|
|
await Stat.updateOne({ _id: trova_se_oggi._id }, { $set: datastat });
|
|
} else {
|
|
// Aggiungi un nuovo record:
|
|
await Stat.insertMany([datastat]);
|
|
}
|
|
|
|
return datastat;
|
|
|
|
} catch (e) {
|
|
console.error('Error', e);
|
|
return null;
|
|
}
|
|
|
|
};
|
|
|
|
StatSchema.statics.getStats = async function (idapp) {
|
|
const Stat = this;
|
|
|
|
const minuti = await Settings.getValDbSettings(idapp, 'NUMMINUTI_STAT', 30);
|
|
|
|
// Ottieni l'ultimo record salvato:
|
|
const rec = await Stat.findOne({ idapp })
|
|
.sort({ date_created: -1 })
|
|
.lean();
|
|
|
|
let isOld = true;
|
|
|
|
if (rec) {
|
|
// se rec.date_created è più vecchio di minuti fa, allora ricalcola.
|
|
const dateCreated = new Date(rec.date_created);
|
|
const now = new Date();
|
|
|
|
// Calcola la differenza in millisecondi
|
|
const difference = now - dateCreated; // Differenza in millisecondi
|
|
|
|
// Controlla se la differenza è maggiore di 10 minuti (10 * 60 * 1000 ms)
|
|
isOld = (difference > minuti * 60 * 1000);
|
|
}
|
|
|
|
let datastat = null;
|
|
|
|
if (isOld) {
|
|
datastat = await Stat.calculateStats(idapp);
|
|
|
|
} else {
|
|
datastat = rec;
|
|
}
|
|
|
|
datastat = await Stat.updateStats(datastat);
|
|
|
|
return datastat;
|
|
|
|
};
|
|
|
|
|
|
const Stat = mongoose.model('Stat', StatSchema);
|
|
|
|
Stat.createIndexes((err) => {
|
|
if (err) throw err;
|
|
});
|
|
|
|
module.exports = { Stat };
|