@ -1,6 +1,5 @@
'use strict' ;
'use strict' ;
const async = require ( 'async' ) ;
const winston = require ( 'winston' ) ;
const winston = require ( 'winston' ) ;
const nconf = require ( 'nconf' ) ;
const nconf = require ( 'nconf' ) ;
@ -29,7 +28,7 @@ Digest.execute = async function (payload) {
return ;
return ;
}
}
try {
try {
winston . info ( ` [user/jobs] Digest ( ${ payload . interval } ) scheduling completed . Sending emails; this may take some time...` ) ;
winston . info ( ` [user/jobs] Digest ( ${ payload . interval } ) scheduling completed (${ subscribers . length } subscribers) . Sending emails; this may take some time...` ) ;
await Digest . send ( {
await Digest . send ( {
interval : payload . interval ,
interval : payload . interval ,
subscribers : subscribers ,
subscribers : subscribers ,
@ -100,8 +99,13 @@ Digest.send = async function (data) {
return emailsSent ;
return emailsSent ;
}
}
await async . eachLimit ( data . subscribers , 100 , async ( uid ) => {
await batch . processArray ( data . subscribers , async ( uids ) => {
const userObj = await user . getUserFields ( uid , [ 'uid' , 'username' , 'userslug' , 'lastonline' ] ) ;
let userData = await user . getUsersFields ( uids , [ 'uid' , 'email' , 'email:confirmed' , 'username' , 'userslug' , 'lastonline' ] ) ;
userData = userData . filter ( u => u && u . email && ( ! meta . config . requireEmailConfirmation || userData [ 'email:confirmed' ] ) ) ;
if ( ! userData . length ) {
return ;
}
await Promise . all ( userData . map ( async ( userObj ) => {
const [ notifications , topTopics , popularTopics , recentTopics ] = await Promise . all ( [
const [ notifications , topTopics , popularTopics , recentTopics ] = await Promise . all ( [
user . notifications . getUnreadInterval ( userObj . uid , data . interval ) ,
user . notifications . getUnreadInterval ( userObj . uid , data . interval ) ,
getTermTopics ( data . interval , userObj . uid , 0 , 9 , 'votes' ) ,
getTermTopics ( data . interval , userObj . uid , 0 , 9 , 'votes' ) ,
@ -140,6 +144,10 @@ Digest.send = async function (data) {
if ( data . interval !== 'alltime' ) {
if ( data . interval !== 'alltime' ) {
await db . sortedSetAdd ( 'digest:delivery' , now . getTime ( ) , userObj . uid ) ;
await db . sortedSetAdd ( 'digest:delivery' , now . getTime ( ) , userObj . uid ) ;
}
}
} ) ) ;
} , {
interval : 1000 ,
batch : 100 ,
} ) ;
} ) ;
winston . info ( ` [user/jobs] Digest ( ${ data . interval } ) sending completed. ${ emailsSent } emails sent. ` ) ;
winston . info ( ` [user/jobs] Digest ( ${ data . interval } ) sending completed. ${ emailsSent } emails sent. ` ) ;
} ;
} ;