total posts+ active total users + refactor = parallel with promise.all for some stuff

merge-requests/208/head
fatchan 5 years ago
parent b10b7135dd
commit 6dd5eceb73
  1. 41
      db/boards.js
  2. 24
      db/files.js
  3. 71
      db/posts.js
  4. 88
      helpers/build.js
  5. 1
      schedules.js
  6. 8
      views/pages/home.pug

@ -1,34 +1,34 @@
'use strict';
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan');
, db = Mongo.client.db('jschan').collection('boards');
module.exports = {
db: db.collection('boards'),
db,
findOne: (name) => {
return db.collection('boards').findOne({ '_id': name });
return db.findOne({ '_id': name });
},
find: () => {
return db.collection('boards').find({}).toArray();
return db.find({}).toArray();
},
insertOne: (data) => {
return db.collection('boards').insertOne(data);
return db.insertOne(data);
},
deleteOne: (board) => {
return db.collection('boards').deleteOne({ '_id': board });
return db.deleteOne({ '_id': board });
},
deleteAll: (board) => {
return db.collection('boards').deleteMany({});
return db.deleteMany({});
},
removeBanners: (board, filenames) => {
return db.collection('boards').updateOne(
return db.updateOne(
{
'_id': board,
}, {
@ -40,7 +40,7 @@ module.exports = {
},
addBanners: (board, filenames) => {
return db.collection('boards').updateOne(
return db.updateOne(
{
'_id': board,
}, {
@ -53,6 +53,27 @@ module.exports = {
);
},
frontPageSortLimit: () => {
return db.find({}).sort({
'ips': -1,
'pph': -1,
'sequence_value': -1,
}).limit(20).toArray();
},
totalPosts: () => {
return db.aggregate([
{
'$group': {
'_id': null,
'total': {
'$sum': '$sequence_value'
}
}
}
]).toArray().then(res => res[0].total);
},
exists: async (req, res, next) => {
const board = await module.exports.findOne(req.params.board);
@ -66,7 +87,7 @@ module.exports = {
getNextId: async (board) => {
const increment = await db.collection('boards').findOneAndUpdate(
const increment = await db.findOneAndUpdate(
{
'_id': board
},

@ -2,6 +2,7 @@
const Mongo = require(__dirname+'/db.js')
, Boards = require(__dirname+'/boards.js')
, formatSize = require(__dirname+'/../helpers/files/formatsize.js')
, db = Mongo.client.db('jschan').collection('files')
module.exports = {
@ -37,6 +38,29 @@ module.exports = {
});
},
activeContent: () => {
return db.aggregate([
{
'$group': {
'_id': null,
'count': {
'$sum': 1
},
'size': {
'$sum': '$size'
}
}
}
]).toArray().then(res => {
const stats = res[0];
return {
count: stats.count,
totalSize: stats.size,
totalSizeString: formatSize(stats.size)
}
});
},
deleteAll: () => {
return db.deleteMany({});
}

@ -2,6 +2,7 @@
const Mongo = require(__dirname+'/db.js')
, Boards = require(__dirname+'/boards.js')
, msTime = require(__dirname+'/../helpers/mstime.js')
, db = Mongo.client.db('jschan').collection('posts')
module.exports = {
@ -394,6 +395,76 @@ module.exports = {
return oldThreads.concat(early404Threads);
},
activeUsers: () => {
return db.aggregate([
{
'$match': {
'_id': {
'$gt': Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.day*3)/1000))
}
}
},
{
'$facet': {
'boardActiveUsers': [
{
'$group': {
'_id': '$board',
'ips': {
'$addToSet': '$ip'
}
}
},
{
'$project': {
'ips': {
'$size': '$ips'
}
}
}
],
'totalActiveUsers': [
{
'$group': {
'_id': null,
'ips': {
'$addToSet': '$ip'
}
}
},
{
'$project': {
'ips': {
'$size': '$ips'
}
}
}
],
}
}
]).toArray().then(res => res[0]);
},
postsPerHour: () => {
return db.aggregate([
{
'$match': {
'_id': {
'$gt': Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.hour)/1000))
}
}
},
{
'$group': {
'_id': '$board',
'pph': {
'$sum': 1
}
}
}
]).toArray();
},
deleteMany: (ids) => {
return db.deleteMany({
'_id': {

@ -6,8 +6,6 @@ const Mongo = require(__dirname+'/../db/db.js')
, Files = require(__dirname+'/../db/files.js')
, Boards = require(__dirname+'/../db/boards.js')
, News = require(__dirname+'/../db/news.js')
, formatSize = require(__dirname+'/files/formatsize.js')
, uploadDirectory = require(__dirname+'/files/uploadDirectory.js')
, render = require(__dirname+'/render.js');
module.exports = {
@ -117,50 +115,11 @@ module.exports = {
const label = '/index.html';
console.time(label);
const [ activeUsers, postsPerHour ] = await Promise.all([
Posts.db.aggregate([
{
'$match': {
'_id': {
'$gt': Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.day*3)/1000))
}
}
},
{
'$group': {
'_id': '$board',
'ips': {
'$addToSet': '$ip'
}
}
},
{
'$project': {
'ips': {
'$size': '$ips'
}
}
}
]).toArray(),
Posts.db.aggregate([
{
'$match': {
'_id': {
'$gt': Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.hour)/1000))
}
}
},
{
'$group': {
'_id': '$board',
'pph': {
'$sum': 1
}
}
}
]).toArray()
Posts.activeUsers(),
Posts.postsPerHour()
]);
for (let i = 0; i < activeUsers.length; i++) {
const userboard = activeUsers[i];
for (let i = 0; i < activeUsers.boardActiveUsers.length; i++) {
const userboard = activeUsers.boardActiveUsers[i];
const pphboard = postsPerHour.find(b => b._id === userboard._id);
if (pphboard != null) {
userboard.pph = pphboard.pph;
@ -168,8 +127,8 @@ module.exports = {
}
const bulkWrites = [];
const updatedBoards = [];
for (let i = 0; i < activeUsers.length; i++) {
const data = activeUsers[i];
for (let i = 0; i < activeUsers.boardActiveUsers.length; i++) {
const data = activeUsers.boardActiveUsers[i];
updatedBoards.push(data._id);
//boards with pph get pph set
bulkWrites.push({
@ -202,35 +161,16 @@ module.exports = {
}
}
});
const totalActiveUsers = activeUsers.totalActiveUsers[0].ips;
await Boards.db.bulkWrite(bulkWrites);
//getting boards now that pph is set
const boards = await Boards.db.find({}).sort({
'ips': -1,
'pph': -1,
'sequence_value': -1,
}).limit(20).toArray(); //limit 20 homepage
//might move filestats to an $out or $merge in schedules file
const fileStats = await Files.db.aggregate([
{
'$group': {
'_id': null,
'count': {
'$sum': 1
},
'size': {
'$sum': '$size'
}
}
}
]).toArray().then(res => {
const stats = res[0];
return {
count: stats.count,
totalSize: stats.size,
totalSizeString: formatSize(stats.size)
}
});
const [ totalPosts, boards, fileStats ] = await Promise.all([
Boards.totalPosts(), //overall total posts ever made
Boards.frontPageSortLimit(), //boards sorted by users, pph, total posts
Files.activeContent() //size of all files
]);
await render('index.html', 'home.pug', {
totalPosts: totalPosts,
totalActiveUsers,
boards,
fileStats,
});

@ -37,6 +37,7 @@ async function deleteCaptchas() {
console.log('Starting schedules');
await buildHomepage();
setInterval(async () => {
try {
await buildHomepage();

@ -38,10 +38,12 @@ block content
.table-container.flex-center.mv-10.text-center
table
tr
th Unique Files
th Total Files Size
th Total Posts
th Active Users
th Active Content
tr
td #{fileStats.count}
td #{totalPosts}
td #{totalActiveUsers}
td #{fileStats.totalSizeString}
.table-container.flex-center.mv-10
table

Loading…
Cancel
Save