action: function(params, out){ var promise =AuthMod.socialLogin(db, params, {}); promise.then(function(ret1) { ret1.user =UserMod.readFilter(ret1.user, {type:'full'}); //only return certain fields (i.e strip out password) // ret1.user =UserMod.readFilter(ret1.user, {type:'login'}); //only return certain fields (i.e strip out password) //@example: var fields ={'tribe': {'_id':1, 'email': 1, 'phone': 1, 'first_name': 1, 'last_name': 1}, 'follow':{'_id':1, 'email': 1, 'phone': 1, 'first_name': 1, 'last_name': 1} }; // var fields ={}; var fields ={ 'follow':{'_id':1, 'email': 1, 'phone': 1, 'first_name': 1, 'last_name': 1} }; var fill_promise = UserMod.fillInfo(db, {'user': ret1.user, 'fields': fields }, {}); fill_promise.then( function(ret2) { ret1.user = ret2.user; out.win(ret1); }, function(err) { self.handleError(out, err, {}); } ); }, function(err) { self.handleError(out, err, {}); }); }
twitter.getAccessToken(data.request_token, data.request_token_secret, data.oauth_verifier, function(error, accessToken, accessTokenSecret, results) { if (error) { ret.code =1; ret.msg +="Error getting OAuth access token"; ret.err =error; ret.debug =data; deferred.reject(ret); } else { // console.log('results: '+JSON.stringify(results)); //TESTING //do user import var vals ={ type: 'twitter', user: {}, socialData: { id: results.user_id, token: accessToken, token_secret: accessTokenSecret } }; AuthMod.socialLogin(db, vals, {}) .then(function(retLogin) { deferred.resolve(retLogin); }, function(err) { deferred.reject(err); }); //Step 4: Verify Credentials belongs here } });
action: function(params, out){ var promise =AuthMod.socialLogin(db, params, {}); promise.then(function(ret1) { ret1.user =UserMod.readFilter(ret1.user, {type:'full'}); //only return certain fields (i.e strip out password) out.win(ret1); }, function(err) { self.handleError(out, err, {}); }); }
plus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) { if(err) { ret.msg +=err; deferred.reject(ret); } else { //do user import & login var user ={}; //name if(response.name !==undefined) { if(response.name.givenName !==undefined) { user.first_name =response.name.givenName; } if(response.name.familyName !==undefined) { user.last_name =response.name.familyName; } } //gender if(response.gender !==undefined) { user.gender =response.gender; } //email if(response.emails !==undefined && response.emails.length >0) { user.email =response.emails[0].value; } //age: do not bother with age since we only get a "range" from google //image if(data.pull_pic) { if(response.image !==undefined && response.image.url !==undefined) { user._imageUrl =response.image.url; } } var vals ={ type: 'google', user: user, socialData: { id: response.id, token: tokens.access_token, response_token: tokens.response_token } }; vals.pic_directory =data.pic_directory; //pass through AuthMod.socialLogin(db, vals, {}) .then(function(retLogin) { deferred.resolve(retLogin); }, function(err) { deferred.reject(err); }); } });
}, accessToken, accessTokenSecret, function(error, dataUser, responseUser) { if (error) { ret.code =1; ret.msg +="Error getting user for Twitter id: "+results.user_id; ret.err =error; ret.debug =data; deferred.reject(ret); } else { // ret.response =responseUser; //breaks things - too raw of data.. ret.debug =dataUser; //separate name into first and last (default both to blank) var first_name =''; var last_name =''; if(dataUser.name !==undefined) { //if has a space var indexSpace =dataUser.name.indexOf(' '); if(indexSpace >-1) { first_name =dataUser.name.slice(0, indexSpace); last_name =dataUser.name.slice((indexSpace+1), dataUser.name.length); } else { first_name =dataUser.name; } } //do user import var vals ={ type: 'twitter', user: { first_name: first_name, last_name: last_name }, socialData: { id: results.user_id, token: accessToken, token_secret: accessTokenSecret } }; AuthMod.socialLogin(db, vals, {}) .then(function(retLogin) { //profile image: now that we have a user with a user id, IF user does NOT already have a profile image AND IF we have a profile image from Twitter, add that in for the user if(data.pull_pic && (retLogin.user.image ===undefined || retLogin.user.image.profile ===undefined || !retLogin.user.image.profile) && dataUser.profile_image_url !==undefined) { var imgUrl =dataUser.profile_image_url; var imgUrlStripped =imgUrl; //strip url params if they're there as this will mess up things (get an ESDIR or ENOENT error since the file extension isn't at the end) if(imgUrlStripped.indexOf('?') >-1) { imgUrlStripped =imgUrlStripped.slice(0, imgUrlStripped.indexOf('?')); } //get the file extension var posExt =imgUrlStripped.lastIndexOf('.'); var ext =imgUrlStripped.slice(posExt, imgUrlStripped.length); //get the big sized image by removing the underscore part - https://dev.twitter.com/docs/user-profile-images-and-banners var posUnderscore =imgUrl.lastIndexOf('_'); if(posUnderscore >-1 && posUnderscore >imgUrl.lastIndexOf('/')) { imgUrl =imgUrl.slice(0, posUnderscore) +ext; } var filename ='profile'+ext; var imgSavePath =data.pic_directory +'/'+retLogin.user._id; var folderWritePath =path.normalize(__dirname +'../../../../' +imageInfo.imgPath +'/' +imgSavePath); //hardcoded - 4 '../' to get from this directory back to 'app/'. Very important to use path.normalize so it works on both windows and linux!! //recursively create directories / folders in case they don't exist yet fs.mkdirSync(folderWritePath, parseInt('777', 8), true); //0777 octal in strict mode is not allowed var dbSavePath =imgSavePath +'/' +filename; //what will be stored in the database var imgWritePath =folderWritePath +'/' +filename; var picStream =fs.createWriteStream(imgWritePath); picStream.on('close', function() { //update user with this image var userUpdate ={}; if(retLogin.user.image !==undefined) { //image key already exists userUpdate['image.profile'] =dbSavePath; //have to do it this way for mongo db syntax and to avoid over-writing any other keys (other than 'profile') that may exist //update for return as well retLogin.user.image.profile =dbSavePath; } else { //image key doesn't exist yet userUpdate.image ={ profile: dbSavePath }; //update for return as well retLogin.user.image ={ profile: dbSavePath }; } UserMod.update(db, {user_id: retLogin.user._id, user:userUpdate}, {}) .then(function(retUserUpdate) { deferred.resolve(retLogin); }, function(retErr) { deferred.reject(retErr); }); }); request(imgUrl).pipe(picStream); } else { deferred.resolve(retLogin); } }, function(err) { deferred.reject(err); }); } });