110 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //user
 | |
| //external modules
 | |
| var mongoose = require('mongoose');
 | |
| var md5 = require("md5");
 | |
| 
 | |
| //core
 | |
| var config = require("../config.js");
 | |
| var logger = require("./logger.js");
 | |
| 
 | |
| // create a user model
 | |
| var model = mongoose.model('user', {
 | |
|     id: String,
 | |
|     profile: String,
 | |
|     history: String,
 | |
|     created: Date
 | |
| });
 | |
| 
 | |
| //public
 | |
| var user = {
 | |
|     model: model,
 | |
|     findUser: findUser,
 | |
|     newUser: newUser,
 | |
|     findOrNewUser: findOrNewUser,
 | |
|     getUserCount: getUserCount,
 | |
|     parsePhotoByProfile: parsePhotoByProfile
 | |
| };
 | |
| 
 | |
| function parsePhotoByProfile(profile) {
 | |
|     var photo = null;
 | |
|     switch (profile.provider) {
 | |
|         case "facebook":
 | |
|             photo = 'https://graph.facebook.com/' + profile.id + '/picture';
 | |
|             break;
 | |
|         case "twitter":
 | |
|             photo = profile.photos[0].value;
 | |
|             break;
 | |
|         case "github":
 | |
|             photo = 'https://avatars.githubusercontent.com/u/' + profile.id + '?s=48';
 | |
|             break;
 | |
|         case "dropbox":
 | |
|             //no image api provided, use gravatar
 | |
|             photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0].value);
 | |
|             break;
 | |
|     }
 | |
|     return photo;
 | |
| }
 | |
| 
 | |
| function getUserCount(callback) {
 | |
|     model.count(function(err, count){
 | |
|         if(err) callback(err, null);
 | |
|         else callback(null, count);
 | |
|     });
 | |
| }
 | |
| 
 | |
| function findUser(id, callback) {
 | |
|     var rule = {};
 | |
|     var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$");
 | |
|     if (checkForHexRegExp.test(id))
 | |
|         rule._id = id;
 | |
|     else
 | |
|         rule.id = id;
 | |
|     model.findOne(rule, function (err, user) {
 | |
|         if (err) {
 | |
|             logger.error('find user failed: ' + err);
 | |
|             callback(err, null);
 | |
|         }
 | |
|         if (!err && user) {
 | |
|             callback(null, user);
 | |
|         } else {
 | |
|             logger.error('find user failed: ' + err);
 | |
|             callback(err, null);
 | |
|         };
 | |
|     });
 | |
| }
 | |
| 
 | |
| function newUser(id, profile, callback) {
 | |
|     var user = new model({
 | |
|         id: id,
 | |
|         profile: JSON.stringify(profile),
 | |
|         created: Date.now()
 | |
|     });
 | |
|     user.save(function (err) {
 | |
|         if (err) {
 | |
|             logger.error('new user failed: ' + err);
 | |
|             callback(err, null);
 | |
|         } else {
 | |
|             logger.info("new user success: " + user.id);
 | |
|             callback(null, user);
 | |
|         };
 | |
|     });
 | |
| }
 | |
| 
 | |
| function findOrNewUser(id, profile, callback) {
 | |
|     findUser(id, function(err, user) {
 | |
|         if(err || !user) {
 | |
|             newUser(id, profile, function(err, user) {
 | |
|                 if(err) {
 | |
|                     logger.error('find or new user failed: ' + err);
 | |
|                     callback(err, null);
 | |
|                 } else {
 | |
|                     callback(null, user);
 | |
|                 }
 | |
|             });
 | |
|         } else {
 | |
|             callback(null, user);
 | |
|         }
 | |
|     });
 | |
| }
 | |
| 
 | |
| module.exports = user; |