Files
freeplanet_serverside/src/server/models/stat.js
Surya Paolo ce51c87365 - Statistiche
- Menu e Sottomenu
- Lista ultimi Movimenti
2024-09-26 02:14:33 +02:00

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 };