This post its a part of a series about creating an app with node.js and express for Facebook... this time we will create a service
See how we created the app
Desktop version:
mobile browsers
, "node-schedule" : "0.1.5"
And we run our command "npm install -d" to install the new dependency
Now lets first update our nominator.js controller to find old nominations
/** /** * find old nominations * @callback function * */ NOMINATOR.findOldNomination = function(callback) { Nomination.find({"endDate": {"$lt": new Date()}}, callback); };
We are looking for nominations where the enddate is lower tan the actual date, then we send the results to the callback
To put this to work, lets update our file server.js, first our needed variables
schedule = require('node-schedule'), fb = require('facebook-js'), url = 'http://nomination.cloudno.de/', nominator = require('./controllers/nominator.js');
Firs its our new module, then load our facebook module, the nomination url to add it to wall messages and our nominator controller
Then lets start the scheduler
//add process to kill old nomination var rule = new schedule.RecurrenceRule(); rule.dayOfWeek = [0, new schedule.Range(1, 6)]; rule.hour = 1; rule.minute = 1;
We are telling the scheduler to run daily at 1 with 1 minutes and then we have to tell which function to do at that time
schedule.scheduleJob(rule, function(){ nominator.findOldNomination(function(err, doc){ for (var i=0; i<doc.length;i++){ endNomination(doc._id, doc); } }); });
The function just look for old nominations and those are we going to end them with endNomination funciton
function endNomination(id, doc){ if (doc.ownerdata){ var users = doc.users; var usersl = doc.users.length; var voters = doc.voters; var votersl = doc.voters.length; if (usersl > 0){ var winner = users[0]; for (var j=1; j<usersl;j++){ if (winner.votes < users[j].votes){ winner = users[j]; } } var onerror = function (error) { if (error) { log.debug('error posting on voted user'); return; } }; fb.apiCall( 'POST', '/'+doc.owner+'/feed', { access_token: doc.ownerdata, message: app._locals.t('dashboard.won', { wname: winner.name, nname: doc.name }), name: app._locals.t('dashboard.create'), link: url }, onerror ); for (var i=0;i<usersl;i++){ if (users[i]._id == doc.owner){ continue; } fb.apiCall( 'POST', '/'+users[i]._id+'/feed', { access_token: doc.ownerdata, message: app._locals.t('dashboard.won', { wname: winner.name, nname: doc.name }), name: app._locals.t('dashboard.create'), link: url }, onerror ); } for (i=0;i<votersl;i++){ if (voters[i]._id == doc.owner){ continue; } fb.apiCall( 'POST', '/'+voters[i]._id+'/feed', { access_token: doc.ownerdata, message: app._locals.t('dashboard.won', { wname: winner.name, nname: doc.name }), name: app._locals.t('dashboard.create'), link: url }, onerror ); } } } nominator.eraseNomination(id, function(err){ if (err) { log.debug('error erasing nomination'); return; } log.notice('nomination '+ id +' erased by: cron ' ); }); }
We decide the winner, make the facebook api call to update the walls of involved users, it may not reach all the walls but that its by security issues of facebook not really with our method
And we are done, check more option to schedule tasks in the github page of the module
Fork the code
Greetings
No comments:
Post a Comment