Skip to content
This repository has been archived by the owner on Nov 4, 2018. It is now read-only.

Commit

Permalink
Integration of Bluebird Promise Library
Browse files Browse the repository at this point in the history
- Added https://github.com/petkaantonov/bluebird
- All methods now works with promises.
Remote methods get called like usual thanks to the awesome .nodeify()
- Required modules can be "promisified" with .promisifyAll(module);
- Loopback Models can be "promisified" (see
strongloop/loopback#418)

Result: cleaner, flatter, easier to understand code, better error
handling. see
http://spion.github.io/posts/why-i-am-switching-to-promises.html

Why Bluebird ? see
http://www.reddit.com/r/javascript/comments/1r3hwa/which_javascript_prom
ise_library_is_the_best_in/
  • Loading branch information
dotlouis committed Dec 27, 2014
1 parent 9256e3e commit 1932658
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 80 deletions.
158 changes: 78 additions & 80 deletions common/models/custom-user.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
var Promise = require('bluebird');
var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs');
var ical = require('ical');

Promise.promisifyAll(request);
Promise.promisifyAll(cheerio);
Promise.promisifyAll(ical);

String.prototype.capitalize = function( lowercase, all ) {
if( all ) {
return this.split( " " ).map( function( currentValue, index, array ) {
Expand All @@ -18,113 +22,107 @@ String.prototype.capitalize = function( lowercase, all ) {

module.exports = function(CustomUser) {

CustomUser.beforeCreate = function(next, user) {

next();
};
// Wrap the model to make it Promise enabled
// https://github.com/strongloop/loopback/issues/418
// once a model is attached to the data source
CustomUser.on('dataSourceAttached', function( obj ){
// wrap the whole model in Promise
// but we need to avoid 'validate' method
CustomUser = Promise.promisifyAll( CustomUser, {filter: function(name, func, target){
return !( name == 'validate');
}} );
});

CustomUser.scrapeResourceId = function(user, callback){
request({
CustomUser.scrapeResourceId = function(user){
return request.getAsync({
url: 'http://www.univ-orleans.fr/EDTWeb/edt',
qs: {
project: '2014-2015',
action: 'displayWeeksPeople',
person: user.username
}},
function(error, response, body){
if (error)
callback(error);
else if (response.statusCode != 200)
callback("ENT is unreacheable ("+response.statusCode+")");
else {
// we look for the export url to get the resources and project number
var startOfUrl = body.indexOf('href=\"http://www.univ-orleans.fr/EDTWeb/export?');
var endOfUrl = body.indexOf('\u0026amp;type=ical\" target=\"Export\"');
if(startOfUrl == -1 || endOfUrl == -1)
callback("ResourceId not found in page");
else{
var exportUrl = body.substring(startOfUrl,endOfUrl);
var project = exportUrl.substring(exportUrl.indexOf('project=')+8, exportUrl.indexOf('\u0026amp;resources='));
var resourceId = exportUrl.substring(exportUrl.indexOf('resources=')+10);
user.updateAttribute("resourceId", resourceId, function(error, user){
CustomUser.scrapeName(user, callback);
// CustomUser.scrapeCalendar(user, project, callback);
});
}
}
}
);
})
.then(function(response){
var head = response[0];
var body = response[1];

if(head.statusCode != 200)
throw new Error("ENT is unreacheable ("+head.statusCode+")");

// we look for the export url to get the resources and project number
var startOfUrl = body.indexOf('href=\"http://www.univ-orleans.fr/EDTWeb/export?');
var endOfUrl = body.indexOf('\u0026amp;type=ical\" target=\"Export\"');
if(startOfUrl == -1 || endOfUrl == -1)
throw new Error("ResourceId not found in page");

var exportUrl = body.substring(startOfUrl,endOfUrl);
var project = exportUrl.substring(exportUrl.indexOf('project=')+8, exportUrl.indexOf('\u0026amp;resources='));
var resourceId = exportUrl.substring(exportUrl.indexOf('resources=')+10);
return user.updateAttributeAsync("resourceId", resourceId);
});
};

CustomUser.scrapeName = function(user, callback){
request({
CustomUser.scrapeName = function(user){
return request.getAsync({
url: 'https://aderead6.univ-orleans.fr/jsp/custom/modules/infos/members.jsp',
qs: {
uniqueId: user.resourceId,
login: 'etuWeb',
password: '',
projectId: '2'
}},
function(error, response, body){
if (error)
callback(error);
else if (response.statusCode != 200)
callback("ADE is unreacheable ("+response.statusCode+")");
else {
var $ = cheerio.load(body);
var name = $('span.title').text();
if(name == '')
callback("Name not found in page");
else{
user.updateAttribute('name', name.capitalize(true, true), function(error, user){
callback(null, user.name);
});
}
}
}
);
})
.then(function(response){
var head = response[0];
var body = response[1];

if(head.statusCode != 200)
throw new Error("ADE is unreacheable ("+head.statusCode+")");

var $ = cheerio.load(body);
var name = $('span.title').text();
if(name == '')
throw new Error("Name not found in page");
return user.updateAttributeAsync('name', name.capitalize(true, true));
});
};

CustomUser.scrapeCalendar = function(user, projectNumber){
request({
CustomUser.scrapeCalendar = function(user){
return request.getAsync({
url: 'http://www.univ-orleans.fr/EDTWeb/export',
qs: {
type: 'ical',
project: projectNumber,
project: '2014-2015',
resources: user.resourceId
}},
function(error, response, body){
if(error)
console.log(error);
else if(response.statusCode != 200)
console.log("problem fetching ical");
else
console.log(body);
}
);
}
})
.then(function(response){
var head = response[0];
var body = response[1];

CustomUser.identity = function(id, callback){
this.findById(id, function(error, user){
if(error)
callback(error);
else
CustomUser.scrapeName(user, callback);
if(head.statusCode != 200)
throw new Error("Problem fetching ical ("+head.statusCode+")");
return ical.parseICS(body);
});
}

CustomUser.identity = function(id, callback){
return this.findByIdAsync(id)
.then(function(user){
return CustomUser.scrapeResourceId(user);
})
.then(function(user){
return CustomUser.scrapeName(user);
})
.nodeify(callback);
};

CustomUser.calendar = function(id, callback){
fs.readFile('/Users/louis/Drive/EDT-Univ-Orleans.ics', 'utf8', function (err,data) {
if (err) {
console.log(err);
callback(err);
}
else{
var schedule = ical.parseICS(data);
callback(null, schedule);
}
});
return this.findByIdAsync(id)
.then(function(user){
return CustomUser.scrapeCalendar(user);
})
.nodeify(callback);
};

CustomUser.remoteMethod('identity', {
Expand Down Expand Up @@ -153,7 +151,7 @@ module.exports = function(CustomUser) {
description: "Model id"
}
],
returns: {arg: 'plop', type: 'string'},
returns: {arg: 'calendar', type: 'object'},
http: {verb: 'get', path: '/:id/calendar'}
});

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"pretest": "jshint ."
},
"dependencies": {
"bluebird": "^2.4.2",
"cheerio": "^0.18.0",
"compression": "^1.0.3",
"errorhandler": "^1.1.1",
Expand Down
9 changes: 9 additions & 0 deletions server/datasources.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,14 @@
"db": {
"name": "db",
"connector": "memory"
},
"compose": {
"host": "dogen.mongohq.com",
"port": 10060,
"database": "studdata",
"username": "studapp",
"password": "zx3662!acu();",
"name": "compose",
"connector": "mongodb"
}
}

0 comments on commit 1932658

Please sign in to comment.