1 /** 
  2  * @namespace 
  3  * @name fbauth 
  4 */
  5 
  6 /** @lends fbauth */
  7 
  8 var couchlib = require(__dirname + '/couchlib.js');
  9 var lib = require(__dirname + '/lib.js');
 10 
 11 /** Check to see if a user already exists. */
 12 var check_for_user = function (couchdb_opts, name, cb) {
 13   var opts = lib.clone(couchdb_opts);
 14   opts.views = exports.couchdb_views;
 15   couchlib.check_object_exists(opts, 'users', name, cb);
 16 };
 17 exports.check_for_user = check_for_user;
 18 
 19 exports.couchdb_views = {
 20   users: [
 21     {
 22       uri: '_design/all_users',
 23       design: {'all': {'map': "function(doc) { emit(doc._id, doc); }"}}
 24     }
 25   ]
 26 };
 27 
 28 /** Add a user. */
 29 var add_user = function (couchdb_opts, username, displayname, email, password, cb) {
 30   var opts = lib.clone(couchdb_opts);
 31   opts.views = exports.couchdb_views;
 32   var dbu = couchlib.get_couchdb_schema(opts, 'users');
 33   dbu.save(username, {displayname: displayname, email: email, password: lib.sha1(password)}, function (err, doc) {
 34     if (err) {
 35       cb(err, false);
 36     } else {
 37       var dbd = couchlib.get_couchdb_schema(opts, 'displaynames');
 38       dbd.save(displayname, {username: username}, function (err, doc) {
 39         if (err) {
 40           dbu.delete(username, function (errdel) {
 41             cb(err, false);
 42           });
 43         } else {
 44           cb(undefined, true);
 45         }
 46       });
 47     }
 48   });
 49 };
 50 exports.add_user = add_user;
 51 
 52 /** Load a users document. */
 53 var load_user = function (couchdb_opts, username, cb) {
 54   var opts = lib.clone(couchdb_opts);
 55   opts.views = exports.couchdb_views;
 56   var db = couchlib.get_couchdb_schema(opts, 'users');
 57   db.get(username, function (err, doc) {
 58     if (err) {
 59       cb(err, undefined);
 60     } else {
 61       cb(undefined, doc);
 62     }
 63   });
 64 };
 65 exports.load_user = load_user;
 66 
 67 /** Login a user, returning the document. */
 68 var login_user = function (couchdb_opts, username, password, cb) {
 69   load_user(couchdb_opts, username, function (err, doc) {
 70     if (err) {
 71       cb(err, undefined);
 72     } else {
 73       if (lib.sha1(password) == doc.password) {
 74         cb(undefined, doc);
 75       } else {
 76         cb("invalid_username_password", undefined);
 77       }
 78     }
 79   });
 80 };
 81 exports.login_user = login_user;
 82 
 83 /** Check if the displayname already exists. */
 84 var check_for_displayname = function (couchdb_opts, name, cb) {
 85   couchlib.check_object_exists(couchdb_opts, 'displayname', name, cb);
 86 };
 87 exports.check_for_displayname = check_for_displayname;
 88 
 89 /** Load a user based upon displayname. */
 90 var load_user_displayname = function (couchdb_opts, displayname, cb) {
 91   var opts = lib.clone(couchdb_opts);
 92   opts.views = exports.couchdb_views;
 93   var db = couchlib.get_couchdb_schema(opts, 'displaynames');
 94   db.get(displayname, function (err, doc) {
 95     if (err) {
 96       cb(err, undefined);
 97     } else {
 98       load_user(doc.username, function (err, doc) {
 99         if (err) {
100           cb(err, undefined);
101         } else {
102           cb(undefined, doc);
103         }
104       });
105     }
106   });
107 };
108 exports.load_user_displayname = load_user_displayname;