Skip to content

Commit

Permalink
Merge pull request #177 from ptitjes/170-move-to-pouchdb-utils
Browse files Browse the repository at this point in the history
(#170) Move to pouchdb-utils
  • Loading branch information
ptitjes authored Nov 14, 2017
2 parents 3196aa7 + cb56c26 commit 3e6ce19
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 107 deletions.
65 changes: 36 additions & 29 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

var utils = require('./utils');

var Promise = require('pouchdb-promise');
var pouchdbAjax = require('pouchdb-ajax');
var pouchdbUtils = require('pouchdb-utils');

var inherits = require('inherits');

function wrapError(callback) {
// provide more helpful error message
return function (err, res) {
Expand All @@ -25,19 +31,19 @@ function putUser(db, user, opts, callback) {
}
}
}
user = utils.extend(true, user, opts.metadata);
user = pouchdbUtils.assign(user, opts.metadata);
}

var url = utils.getUsersUrl(db) + '/' + encodeURIComponent(user._id);
var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'PUT',
url : url,
body : user
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
}

exports.signup = utils.toPromise(function (username, password, opts, callback) {
exports.signup = pouchdbUtils.toPromise(function (username, password, opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = typeof opts === 'undefined' ? (typeof password === 'undefined' ?
Expand Down Expand Up @@ -67,7 +73,7 @@ exports.signup = utils.toPromise(function (username, password, opts, callback) {

exports.signUp = exports.signup;

exports.login = utils.toPromise(function (username, password, opts, callback) {
exports.login = pouchdbUtils.toPromise(function (username, password, opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = opts;
Expand All @@ -83,48 +89,48 @@ exports.login = utils.toPromise(function (username, password, opts, callback) {
return callback(new AuthError('you must provide a password'));
}

var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'POST',
url : utils.getSessionUrl(db),
headers : {'Content-Type': 'application/json'},
body : JSON.stringify({name: username, password: password})
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
});

exports.logIn = exports.login;

exports.logout = utils.toPromise(function (opts, callback) {
exports.logout = pouchdbUtils.toPromise(function (opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = opts;
opts = {};
}
var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'DELETE',
url : utils.getSessionUrl(db)
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
});

exports.logOut = exports.logout;

exports.getSession = utils.toPromise(function (opts, callback) {
exports.getSession = pouchdbUtils.toPromise(function (opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = opts;
opts = {};
}
var url = utils.getSessionUrl(db);

var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'GET',
url : url
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
});

exports.getUser = utils.toPromise(function (username, opts, callback) {
exports.getUser = pouchdbUtils.toPromise(function (username, opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = typeof opts === 'undefined' ? username : opts;
Expand All @@ -135,14 +141,14 @@ exports.getUser = utils.toPromise(function (username, opts, callback) {
}

var url = utils.getUsersUrl(db);
var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'GET',
url : url + '/' + encodeURIComponent('org.couchdb.user:' + username)
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
});

exports.putUser = utils.toPromise(function (username, opts, callback) {
exports.putUser = pouchdbUtils.toPromise(function (username, opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = typeof opts === 'undefined' ? username : opts;
Expand All @@ -155,7 +161,7 @@ exports.putUser = utils.toPromise(function (username, opts, callback) {
return callback(new AuthError('You must provide a username'));
}

return db.getUser(username, opts, function (error, user) {
db.getUser(username, opts, function (error, user) {
if (error) {
return callback(error);
}
Expand All @@ -164,7 +170,7 @@ exports.putUser = utils.toPromise(function (username, opts, callback) {
});
});

exports.changePassword = utils.toPromise(function (username, password, opts, callback) {
exports.changePassword = pouchdbUtils.toPromise(function (username, password, opts, callback) {
var db = this;
if (typeof callback === 'undefined') {
callback = typeof opts === 'undefined' ? (typeof password === 'undefined' ?
Expand All @@ -180,29 +186,30 @@ exports.changePassword = utils.toPromise(function (username, password, opts, cal
return callback(new AuthError('You must provide a password'));
}

return db.getUser(username, opts, function (error, user) {
db.getUser(username, opts, function (error, user) {
if (error) {
return callback(error);
}

user.password = password;

var url = utils.getUsersUrl(db) + '/' + encodeURIComponent(user._id);
var ajaxOpts = utils.extend(true, {
var ajaxOpts = pouchdbUtils.assign({
method : 'PUT',
url : url,
body : user
}, opts.ajax || {});
utils.ajax(ajaxOpts, wrapError(callback));
pouchdbAjax(ajaxOpts, wrapError(callback));
});
});

exports.changeUsername = utils.toPromise(function (oldUsername, newUsername, opts, callback) {
exports.changeUsername =
pouchdbUtils.toPromise(function (oldUsername, newUsername, opts, callback) {
var db = this;
var USERNAME_PREFIX = 'org.couchdb.user:';
var ajax = function (opts) {
return new utils.Promise(function (resolve, reject) {
utils.ajax(opts, wrapError(function (err, res) {
return new Promise(function (resolve, reject) {
pouchdbAjax(opts, wrapError(function (err, res) {
if (err) {
return reject(err);
}
Expand All @@ -212,7 +219,7 @@ exports.changeUsername = utils.toPromise(function (oldUsername, newUsername, opt
};
var updateUser = function (user, opts) {
var url = utils.getUsersUrl(db) + '/' + encodeURIComponent(user._id);
var updateOpts = utils.extend(true, {
var updateOpts = pouchdbUtils.assign({
method : 'PUT',
url : url,
body: user
Expand All @@ -235,7 +242,7 @@ exports.changeUsername = utils.toPromise(function (oldUsername, newUsername, opt
return callback(new AuthError('You must provide a username to rename'));
}

return db.getUser(newUsername, opts)
db.getUser(newUsername, opts)
.then(function () {
var error = new AuthError('user already exists');
error.taken = true;
Expand All @@ -244,7 +251,7 @@ exports.changeUsername = utils.toPromise(function (oldUsername, newUsername, opt
return db.getUser(oldUsername, opts);
})
.then(function (user) {
var newUser = utils.clone(user);
var newUser = pouchdbUtils.clone(user);
delete newUser._rev;
newUser._id = USERNAME_PREFIX + newUsername;
newUser.name = newUsername;
Expand All @@ -269,7 +276,7 @@ function AuthError(message) {
} catch (e) {}
}

utils.inherits(AuthError, Error);
inherits(AuthError, Error);

if (typeof window !== 'undefined' && window.PouchDB) {
window.PouchDB.plugin(exports);
Expand Down
79 changes: 1 addition & 78 deletions lib/utils.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
'use strict';

var Promise = require('pouchdb-promise');
var urlJoin = require('url-join');

function getBaseUrl(db) {
Expand All @@ -10,86 +9,10 @@ function getBaseUrl(db) {
return db.name.replace(/\/[^\/]+\/?$/, '');
}
}

exports.getUsersUrl = function (db) {
return urlJoin(getBaseUrl(db), '/_users');
};
exports.getSessionUrl = function (db) {
return urlJoin(getBaseUrl(db), '/_session');
};
exports.once = function (fun) {
var called = false;
return exports.getArguments(function (args) {
if (called) {
console.trace();
throw new Error('once called more than once');
} else {
called = true;
fun.apply(this, args);
}
});
};
exports.getArguments = function (fun) {
return function () {
var len = arguments.length;
var args = new Array(len);
var i = -1;
while (++i < len) {
args[i] = arguments[i];
}
return fun.call(this, args);
};
};
exports.toPromise = function (func) {
//create the function we will be returning
return exports.getArguments(function (args) {
var self = this;
var tempCB = (typeof args[args.length - 1] === 'function') ? args.pop() : false;
// if the last argument is a function, assume its a callback
var usedCB;
if (tempCB) {
// if it was a callback, create a new callback which calls it,
// but do so async so we don't trap any errors
usedCB = function (err, resp) {
process.nextTick(function () {
tempCB(err, resp);
});
};
}
var promise = new Promise(function (fulfill, reject) {
try {
var callback = exports.once(function (err, mesg) {
if (err) {
reject(err);
} else {
fulfill(mesg);
}
});
// create a callback for this invocation
// apply the function in the orig context
args.push(callback);
func.apply(self, args);
} catch (e) {
reject(e);
}
});
// if there is a callback, call it back
if (usedCB) {
promise.then(function (result) {
usedCB(null, result);
}, usedCB);
}
promise.cancel = function () {
return this;
};
return promise;
});
};

exports.inherits = require('inherits');
exports.extend = require('pouchdb-extend');
exports.ajax = require('pouchdb-ajax');
exports.clone = function (obj) {
return exports.extend(true, {}, obj);
};
exports.uuid = require('pouchdb-utils').uuid;
exports.Promise = Promise;

0 comments on commit 3e6ce19

Please sign in to comment.