Skip to content

Commit

Permalink
simple way to do single channel databases
Browse files Browse the repository at this point in the history
  • Loading branch information
jchris committed May 27, 2012
1 parent 884e710 commit befb80f
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions lib/syncpointHelpers.js
Expand Up @@ -16,11 +16,21 @@ exports.configDDoc = function(config) {
return ddoc;
};

function setupControlDatabase(userDoc, config, callback) {
function fieldToProvision(pairingDoc) {
if (pairingDoc.pairing_mode == "single-channel") {
return "channel_database";
} else {
return "control_database";
}
}

function setupControlDatabase(pairingDoc, userDoc, config, callback) {
var provisionFieldName = fieldToProvision(pairingDoc);

function setControlDatabaseName(userDoc) {
if (!userDoc.control_database) {
if (!userDoc[provisionFieldName]) {
coux([config.host, "_uuids"], e(function(err, data) {
userDoc.control_database = "control-"+data.uuids[0];
userDoc[provisionFieldName] = "control-"+data.uuids[0];
ensureControlDatabaseExists(userDoc, true)
}))
} else {
Expand All @@ -29,10 +39,10 @@ function setupControlDatabase(userDoc, config, callback) {
}
function ensureControlDatabaseExists(userDoc, isNew) {
// find or create a control database
coux([config.host, userDoc.control_database], function(err, ok) {
coux([config.host, userDoc[provisionFieldName]], function(err, ok) {
if (err) {
console.log("create control", userDoc.control_database);
coux.put([config.host, userDoc.control_database],
console.log("create control", userDoc[provisionFieldName]);
coux.put([config.host, userDoc[provisionFieldName]],
e(secureControlDb, [userDoc, isNew]));
} else {
secureControlDb(userDoc, isNew);
Expand All @@ -42,11 +52,11 @@ function setupControlDatabase(userDoc, config, callback) {
function secureControlDb(userDoc, isNew) {
// once a database has a member, it is not public
exports.addMemberToDatabase(userDoc._id,
[config.host, userDoc.control_database],
[config.host, userDoc[provisionFieldName]],
e(addControlDesign,[userDoc, isNew]));
}
function addControlDesign(userDoc, isNew) {
coux.put([config.host, userDoc.control_database, control_ddoc._id],
coux.put([config.host, userDoc[provisionFieldName], control_ddoc._id],
control_ddoc, function(err, ok) {
if (err && err.error != "conflict") {
console.trace(JSON.stringify(err))
Expand All @@ -59,10 +69,10 @@ function setupControlDatabase(userDoc, config, callback) {
}

exports.activateWebUser = function(webUserDoc, config) {
setupControlDatabase(webUserDoc, config, e(function(err, userDoc, isNew) {
setupControlDatabase(webUserDoc, webUserDoc, config, e(function(err, userDoc, isNew) {
userDoc.pairing_state = "paired";
coux.put([config.host, config.users_db, userDoc._id], userDoc, e(function(err, ok) {
if (isNew) {
if (isNew && userDoc.control_database) {
userChannelControl.bindToControlDb(userDoc.control_database, userDoc.app_id, config);
exports.replicateToGlobalControl(userDoc.control_database, config);
}
Expand All @@ -72,6 +82,8 @@ exports.activateWebUser = function(webUserDoc, config) {

// when an auth scheme +1s a new user pairing, they run this code to seal the deal.
exports.activatePairingUser = function(pairingUserDoc, userDoc, config) {
var provisionFieldName = fieldToProvision(pairingUserDoc);

function updateUserDocWithOauth(userDoc, isNew) {
// update the user doc with the oauth credentials
applyOauthCredsToUserDoc(userDoc, pairingUserDoc);
Expand All @@ -81,22 +93,22 @@ exports.activatePairingUser = function(pairingUserDoc, userDoc, config) {
function pairPairingUserDoc(userDoc, isNew) {
console.log("activate pairing for", userDoc._id, userDoc.full_name);
// put the control database name and owner_id on the pairingUserDoc
pairingUserDoc.control_database = userDoc.control_database;
pairingUserDoc[provisionFieldName] = userDoc[provisionFieldName];
pairingUserDoc.owner_id = userDoc._id;
// update the pairing doc to be paired
// when the mobile device see this, it will switch the session
// to the user's control database
pairingUserDoc.pairing_state = "paired";
coux.put([config.host, config.users_db, pairingUserDoc._id],
pairingUserDoc, e(function() {
if (isNew) {
if (isNew && userDoc.control_database) {
userChannelControl.bindToControlDb(userDoc.control_database, userDoc.app_id, config);
exports.replicateToGlobalControl(userDoc.control_database, config);
}
}));
}
// kick off the chain:
setupControlDatabase(userDoc, config, e(function(err, userDoc, isNew) {
setupControlDatabase(pairingUserDoc, userDoc, config, e(function(err, userDoc, isNew) {
updateUserDocWithOauth(userDoc, isNew)
}))
}
Expand Down

0 comments on commit befb80f

Please sign in to comment.