mirror of
/repos/Prototyper.git
synced 2026-02-27 16:12:00 +01:00
refactored data backend
This commit is contained in:
156
lib/data.js
Normal file
156
lib/data.js
Normal file
@@ -0,0 +1,156 @@
|
||||
'use strict';
|
||||
var _ = require('underscore');
|
||||
|
||||
module.exports = function (config, dataBase, updateShare) {
|
||||
|
||||
var ensuring = false;
|
||||
|
||||
function ensureContent(options, callback) {
|
||||
if (ensuring) {
|
||||
//noinspection JSUnresolvedFunction
|
||||
setImmediate(function rescheduling() {
|
||||
config.debug && config.debug('Ensuring, rescheduling', options);
|
||||
return ensureContent(options, callback);
|
||||
});
|
||||
} else {
|
||||
ensuring = true;
|
||||
if (!options.query) {
|
||||
options.query = {
|
||||
name: options.name
|
||||
};
|
||||
}
|
||||
var stopEnsuring = function (err, result, col) {
|
||||
config.debug && config.debug('Stop ensuring', options);
|
||||
ensuring = false;
|
||||
if (err) {
|
||||
return callback && callback(err);
|
||||
}
|
||||
return callback && callback(null, result, col);
|
||||
};
|
||||
|
||||
return getRethinkContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
if (/Data not found*/.test(err.message)) {
|
||||
var documentId = 'json:' + options.collection + ':' + options.name;
|
||||
var data = {name: options.name};
|
||||
return dataBase.setRethinkContent(data, options, function (err, content_result, col) {
|
||||
var keys = _.keys(data); // reset all attributes;
|
||||
return updateShare.document(documentId, data, keys, function updatedShareDocument() {
|
||||
stopEnsuring(err, content_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return stopEnsuring(err);
|
||||
}
|
||||
} else {
|
||||
return stopEnsuring(null, result, col);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* options:
|
||||
* no_share (optional): prevent share from updating itself.
|
||||
*/
|
||||
function setRethinkAttribute(data, options, callback) {
|
||||
config.debug && config.debug('setMongoAttribute options', options);
|
||||
return ensureContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR1 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var attribute_options = {
|
||||
collection: options.collection,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
if (result.hasOwnProperty(options.attribute) &&
|
||||
result[options.attribute].guid) {
|
||||
attribute_options.query = {
|
||||
id: result[options.attribute].guid
|
||||
};
|
||||
} else {
|
||||
attribute_options.query = {
|
||||
parent: result.id,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
config.debug && config.debug('getMongoAttribute parent found, get child and save', result, attribute_options);
|
||||
return ensureContent(attribute_options, function attribute(err, attribute_result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR2 setMongoAttribute ensureContent', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var updateContent = true;
|
||||
if (result[options.attribute]) {
|
||||
if (attribute_result.id === String(result[options.attribute].guid)) {
|
||||
updateContent = false;
|
||||
} else {
|
||||
result[options.attribute].guid = attribute_result.id;
|
||||
}
|
||||
} else {
|
||||
result[options.attribute] = {guid: attribute_result.id};
|
||||
}
|
||||
|
||||
attribute_result.parent = result.id;
|
||||
attribute_result.name = result.name + '.' + options.attribute;
|
||||
attribute_result[options.attribute] = data;
|
||||
if (options.operation) {
|
||||
attribute_result.version = options.operation.v;
|
||||
}
|
||||
return dataBase.saveData(col, attribute_result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var documentId = 'json:' + options.collection + ':' + result.name;
|
||||
var type = options.type || 'text';
|
||||
var attributeDocumentId = type + ':' + options.collection + ':' + result.name + ':' + options.attribute;
|
||||
var keys = null;
|
||||
var share_data = null;
|
||||
if (type === 'json') {
|
||||
keys = _.keys(attribute_result); // reset all attributes;
|
||||
share_data = attribute_result;
|
||||
} else {
|
||||
keys = [attribute_result.name];
|
||||
share_data = data;
|
||||
}
|
||||
if (options.no_share) {
|
||||
keys = null;
|
||||
}
|
||||
return updateShare.document(attributeDocumentId, share_data, keys, function updatedShareAttribute() {
|
||||
if (updateContent) {
|
||||
dataBase.updateData(col, result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var path = [options.attribute, 'guid']; // reset just guid attribute;
|
||||
return updateShare.documentPath(documentId, result, path, function updatedShareContent() {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getMongoAttribute: dataBase.getAttribute,
|
||||
getMongoContent: dataBase.getContent,
|
||||
setMongoAttribute: setRethinkAttribute,
|
||||
setMongoContent: dataBase.setContent,
|
||||
|
||||
getAttribute: dataBase.getAttribute,
|
||||
getContent: dataBase.getContent,
|
||||
setAttribute: setRethinkAttribute,
|
||||
setContent: dataBase.setContent,
|
||||
ensureContent: ensureContent
|
||||
};
|
||||
};
|
||||
254
lib/mongoData.js
254
lib/mongoData.js
@@ -3,7 +3,7 @@ var ObjectID = require('mongodb').ObjectID;
|
||||
var _ = require('underscore');
|
||||
|
||||
|
||||
module.exports = function (config, db, shareModel) {
|
||||
module.exports = function (config, db) {
|
||||
/*
|
||||
* options:
|
||||
* collection (mandatory)
|
||||
@@ -178,7 +178,7 @@ module.exports = function (config, db, shareModel) {
|
||||
config.error && config.error('ERR3 setMongoContent', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
if (result) {
|
||||
if (result && result._id) {
|
||||
data._id = result._id;
|
||||
}
|
||||
return dumpData(collection, data, callback);
|
||||
@@ -189,251 +189,11 @@ module.exports = function (config, db, shareModel) {
|
||||
});
|
||||
}
|
||||
|
||||
function updateShareDocumentPath(documentId, data, path, callback) {
|
||||
shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN setMongoAttribute updateShareDocumentPath shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
var sub_data = data;
|
||||
var sub_snapshot_data = doc.snapshot;
|
||||
var equal_path = [];
|
||||
var found = false;
|
||||
var x;
|
||||
for (x = 0; !found && x < path.length; x += 1) {
|
||||
var key = path[x];
|
||||
if (sub_data && sub_data.hasOwnProperty(key) &&
|
||||
sub_snapshot_data &&
|
||||
sub_snapshot_data.hasOwnProperty(key)) {
|
||||
sub_data = sub_data[key];
|
||||
sub_snapshot_data = sub_snapshot_data[key];
|
||||
equal_path.push(key);
|
||||
} else if (!sub_snapshot_data || !sub_snapshot_data.hasOwnProperty(key)) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
path = equal_path;
|
||||
}
|
||||
var op = {
|
||||
p: path
|
||||
};
|
||||
if (sub_data) {
|
||||
op.oi = sub_data;
|
||||
}
|
||||
if (sub_snapshot_data) {
|
||||
op.od = sub_snapshot_data;
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: [op],
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR updateShareDocumentPath shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocumentPath shareModel.applyOp', documentId, op, err, result);
|
||||
return callback && callback();
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateShareDocument(documentId, data, keys, callback) {
|
||||
if (!keys) {
|
||||
// no keys no update
|
||||
return callback && callback();
|
||||
}
|
||||
var ops = [];
|
||||
return shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
if (doc.type.name === 'text') {
|
||||
ops.push({
|
||||
d: doc.snapshot,
|
||||
p: 0
|
||||
});
|
||||
ops.push({
|
||||
i: data,
|
||||
p: 0
|
||||
});
|
||||
} else if (doc.type.name === 'json') {
|
||||
_.forEach(keys, function (key) {
|
||||
if (key !== '_id') {
|
||||
var op = {
|
||||
p: [key]
|
||||
};
|
||||
if (doc.snapshot[key]) {
|
||||
op.od = doc.snapshot[key];
|
||||
}
|
||||
if (data[key]) {
|
||||
op.oi = data[key];
|
||||
}
|
||||
ops.push(op);
|
||||
}
|
||||
});
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: ops,
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocument shareModel.applyOp', documentId, ops, err, result);
|
||||
return callback && callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var ensuring = false;
|
||||
|
||||
function ensureContent(options, callback) {
|
||||
if (ensuring) {
|
||||
//noinspection JSUnresolvedFunction
|
||||
setImmediate(function rescheduling() {
|
||||
config.debug && config.debug('Ensuring, rescheduling', options);
|
||||
return ensureContent(options, callback);
|
||||
});
|
||||
} else {
|
||||
ensuring = true;
|
||||
if (!options.query) {
|
||||
options.query = {
|
||||
name: options.name
|
||||
};
|
||||
}
|
||||
var stopEnsuring = function (err, result, col) {
|
||||
config.debug && config.debug('Stop ensuring', options);
|
||||
ensuring = false;
|
||||
if (err) {
|
||||
return callback && callback(err);
|
||||
}
|
||||
return callback && callback(null, result, col);
|
||||
};
|
||||
|
||||
getMongoContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
if (/Data not found*/.test(err.message)) {
|
||||
var documentId = 'json:' + options.collection + ':' + options.name;
|
||||
var data = {name: options.name};
|
||||
setMongoContent(data, options, function (err, content_result, col) {
|
||||
var keys = _.keys(data); // reset all attributes;
|
||||
return updateShareDocument(documentId, data, keys, function updatedShareDocument() {
|
||||
stopEnsuring(err, content_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return stopEnsuring(err);
|
||||
}
|
||||
} else {
|
||||
return stopEnsuring(null, result, col);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* options:
|
||||
* no_share (optional): prevent share from updating itself.
|
||||
*/
|
||||
function setMongoAttribute(data, options, callback) {
|
||||
config.debug && config.debug('setMongoAttribute options', options);
|
||||
ensureContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR1 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var attribute_options = {
|
||||
collection: options.collection,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
if (result.hasOwnProperty(options.attribute) &&
|
||||
result[options.attribute].guid) {
|
||||
attribute_options.query = {
|
||||
_id: result[options.attribute].guid
|
||||
};
|
||||
} else {
|
||||
attribute_options.query = {
|
||||
parent: result._id,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
config.debug && config.debug('getMongoAttribute parent found, get child and save', result, attribute_options);
|
||||
return ensureContent(attribute_options, function attribute(err, attribute_result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR2 setMongoAttribute ensureContent', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var updateContent = true;
|
||||
if (result[options.attribute]) {
|
||||
if (attribute_result._id.toString() === String(result[options.attribute].guid)) {
|
||||
updateContent = false;
|
||||
} else {
|
||||
result[options.attribute].guid = attribute_result._id;
|
||||
}
|
||||
} else {
|
||||
result[options.attribute] = {guid: attribute_result._id};
|
||||
}
|
||||
|
||||
attribute_result.parent = result._id;
|
||||
attribute_result.name = result.name + '.' + options.attribute;
|
||||
attribute_result[options.attribute] = data;
|
||||
if (options.operation) {
|
||||
attribute_result.version = options.operation.v;
|
||||
}
|
||||
return saveData(col, attribute_result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var documentId = 'json:' + options.collection + ':' + result.name;
|
||||
var type = options.type || 'text';
|
||||
var attributeDocumentId = type + ':' + options.collection + ':' + result.name + ':' + options.attribute;
|
||||
var keys = null;
|
||||
var share_data = null;
|
||||
if (type === 'json') {
|
||||
keys = _.keys(attribute_result); // reset all attributes;
|
||||
share_data = attribute_result;
|
||||
} else {
|
||||
keys = [attribute_result.name];
|
||||
share_data = data;
|
||||
}
|
||||
if (options.no_share) {
|
||||
keys = null;
|
||||
}
|
||||
return updateShareDocument(attributeDocumentId, share_data, keys, function updatedShareAttribute() {
|
||||
if (updateContent) {
|
||||
updateData(col, result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var path = [options.attribute, 'guid']; // reset just guid attribute;
|
||||
return updateShareDocumentPath(documentId, result, path, function updatedShareContent() {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getMongoAttribute: getMongoAttribute,
|
||||
getMongoContent: getMongoContent,
|
||||
setMongoAttribute: setMongoAttribute,
|
||||
setMongoContent: setMongoContent,
|
||||
ensureContent: ensureContent,
|
||||
updateShareDocument: updateShareDocument
|
||||
saveData: saveData,
|
||||
updateData: updateData,
|
||||
getAttribute: getMongoAttribute,
|
||||
getContent: getMongoContent,
|
||||
setContent: setMongoContent
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
var _ = require('underscore');
|
||||
|
||||
module.exports = function (config, r, connection, shareModel) {
|
||||
module.exports = function (config, r, connection) {
|
||||
/*
|
||||
* options:
|
||||
* collection (mandatory)
|
||||
@@ -225,251 +225,11 @@ module.exports = function (config, r, connection, shareModel) {
|
||||
});
|
||||
}
|
||||
|
||||
function updateShareDocumentPath(documentId, data, path, callback) {
|
||||
shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocumentPath shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
var sub_data = data;
|
||||
var sub_snapshot_data = doc.snapshot;
|
||||
var equal_path = [];
|
||||
var found = false;
|
||||
var x;
|
||||
for (x = 0; !found && x < path.length; x += 1) {
|
||||
var key = path[x];
|
||||
if (sub_data && sub_data.hasOwnProperty(key) &&
|
||||
sub_snapshot_data &&
|
||||
sub_snapshot_data.hasOwnProperty(key)) {
|
||||
sub_data = sub_data[key];
|
||||
sub_snapshot_data = sub_snapshot_data[key];
|
||||
equal_path.push(key);
|
||||
} else if (!sub_snapshot_data || !sub_snapshot_data.hasOwnProperty(key)) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
path = equal_path;
|
||||
}
|
||||
var op = {
|
||||
p: path
|
||||
};
|
||||
if (sub_data) {
|
||||
op.oi = sub_data;
|
||||
}
|
||||
if (sub_snapshot_data) {
|
||||
op.od = sub_snapshot_data;
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: [op],
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR updateShareDocumentPath shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocumentPath shareModel.applyOp', documentId, op, err, result);
|
||||
return callback && callback();
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateShareDocument(documentId, data, keys, callback) {
|
||||
if (!keys) {
|
||||
// no keys no update
|
||||
return callback && callback();
|
||||
}
|
||||
var ops = [];
|
||||
return shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
if (doc.type.name === 'text') {
|
||||
ops.push({
|
||||
d: doc.snapshot,
|
||||
p: 0
|
||||
});
|
||||
ops.push({
|
||||
i: data,
|
||||
p: 0
|
||||
});
|
||||
} else if (doc.type.name === 'json') {
|
||||
_.forEach(keys, function (key) {
|
||||
if (key !== 'id') {
|
||||
var op = {
|
||||
p: [key]
|
||||
};
|
||||
if (doc.snapshot[key]) {
|
||||
op.od = doc.snapshot[key];
|
||||
}
|
||||
if (data[key]) {
|
||||
op.oi = data[key];
|
||||
}
|
||||
ops.push(op);
|
||||
}
|
||||
});
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: ops,
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocument shareModel.applyOp', documentId, ops, err, result);
|
||||
return callback && callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var ensuring = false;
|
||||
|
||||
function ensureContent(options, callback) {
|
||||
if (ensuring) {
|
||||
//noinspection JSUnresolvedFunction
|
||||
setImmediate(function rescheduling() {
|
||||
config.debug && config.debug('Ensuring, rescheduling', options);
|
||||
return ensureContent(options, callback);
|
||||
});
|
||||
} else {
|
||||
ensuring = true;
|
||||
if (!options.query) {
|
||||
options.query = {
|
||||
name: options.name
|
||||
};
|
||||
}
|
||||
var stopEnsuring = function (err, result, col) {
|
||||
config.debug && config.debug('Stop ensuring', options);
|
||||
ensuring = false;
|
||||
if (err) {
|
||||
return callback && callback(err);
|
||||
}
|
||||
return callback && callback(null, result, col);
|
||||
};
|
||||
|
||||
return getRethinkContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
if (/Data not found*/.test(err.message)) {
|
||||
var documentId = 'json:' + options.collection + ':' + options.name;
|
||||
var data = {name: options.name};
|
||||
return setRethinkContent(data, options, function (err, content_result, col) {
|
||||
var keys = _.keys(data); // reset all attributes;
|
||||
return updateShareDocument(documentId, data, keys, function updatedShareDocument() {
|
||||
stopEnsuring(err, content_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return stopEnsuring(err);
|
||||
}
|
||||
} else {
|
||||
return stopEnsuring(null, result, col);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* options:
|
||||
* no_share (optional): prevent share from updating itself.
|
||||
*/
|
||||
function setRethinkAttribute(data, options, callback) {
|
||||
config.debug && config.debug('setMongoAttribute options', options);
|
||||
return ensureContent(options, function document(err, result, col) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR1 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var attribute_options = {
|
||||
collection: options.collection,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
if (result.hasOwnProperty(options.attribute) &&
|
||||
result[options.attribute].guid) {
|
||||
attribute_options.query = {
|
||||
id: result[options.attribute].guid
|
||||
};
|
||||
} else {
|
||||
attribute_options.query = {
|
||||
parent: result.id,
|
||||
name: result.name + '.' + options.attribute
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
config.debug && config.debug('getMongoAttribute parent found, get child and save', result, attribute_options);
|
||||
return ensureContent(attribute_options, function attribute(err, attribute_result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR2 setMongoAttribute ensureContent', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var updateContent = true;
|
||||
if (result[options.attribute]) {
|
||||
if (attribute_result.id === String(result[options.attribute].guid)) {
|
||||
updateContent = false;
|
||||
} else {
|
||||
result[options.attribute].guid = attribute_result.id;
|
||||
}
|
||||
} else {
|
||||
result[options.attribute] = {guid: attribute_result.id};
|
||||
}
|
||||
|
||||
attribute_result.parent = result.id;
|
||||
attribute_result.name = result.name + '.' + options.attribute;
|
||||
attribute_result[options.attribute] = data;
|
||||
if (options.operation) {
|
||||
attribute_result.version = options.operation.v;
|
||||
}
|
||||
return saveData(col, attribute_result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var documentId = 'json:' + options.collection + ':' + result.name;
|
||||
var type = options.type || 'text';
|
||||
var attributeDocumentId = type + ':' + options.collection + ':' + result.name + ':' + options.attribute;
|
||||
var keys = null;
|
||||
var share_data = null;
|
||||
if (type === 'json') {
|
||||
keys = _.keys(attribute_result); // reset all attributes;
|
||||
share_data = attribute_result;
|
||||
} else {
|
||||
keys = [attribute_result.name];
|
||||
share_data = data;
|
||||
}
|
||||
if (options.no_share) {
|
||||
keys = null;
|
||||
}
|
||||
return updateShareDocument(attributeDocumentId, share_data, keys, function updatedShareAttribute() {
|
||||
if (updateContent) {
|
||||
updateData(col, result, function saved(err) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR3 setMongoAttribute', err);
|
||||
return callback && callback(err);
|
||||
}
|
||||
var path = [options.attribute, 'guid']; // reset just guid attribute;
|
||||
return updateShareDocumentPath(documentId, result, path, function updatedShareContent() {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return callback && callback(null, attribute_result, col);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getMongoAttribute: getRethinkAttribute,
|
||||
getMongoContent: getRethinkContent,
|
||||
setMongoAttribute: setRethinkAttribute,
|
||||
setMongoContent: setRethinkContent,
|
||||
ensureContent: ensureContent,
|
||||
updateShareDocument: updateShareDocument
|
||||
saveData: saveData,
|
||||
updateData: updateData,
|
||||
getAttribute: getRethinkAttribute,
|
||||
getContent: getRethinkContent,
|
||||
setContent: setRethinkContent
|
||||
};
|
||||
};
|
||||
|
||||
110
lib/updateShareDocument.js
Normal file
110
lib/updateShareDocument.js
Normal file
@@ -0,0 +1,110 @@
|
||||
'use strict';
|
||||
var _ = require('underscore');
|
||||
|
||||
module.exports = function (config, shareModel) {
|
||||
|
||||
function updateShareDocumentPath(documentId, data, path, callback) {
|
||||
shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocumentPath shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
var sub_data = data;
|
||||
var sub_snapshot_data = doc.snapshot;
|
||||
var equal_path = [];
|
||||
var found = false;
|
||||
var x;
|
||||
for (x = 0; !found && x < path.length; x += 1) {
|
||||
var key = path[x];
|
||||
if (sub_data && sub_data.hasOwnProperty(key) &&
|
||||
sub_snapshot_data &&
|
||||
sub_snapshot_data.hasOwnProperty(key)) {
|
||||
sub_data = sub_data[key];
|
||||
sub_snapshot_data = sub_snapshot_data[key];
|
||||
equal_path.push(key);
|
||||
} else if (!sub_snapshot_data || !sub_snapshot_data.hasOwnProperty(key)) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
path = equal_path;
|
||||
}
|
||||
var op = {
|
||||
p: path
|
||||
};
|
||||
if (sub_data) {
|
||||
op.oi = sub_data;
|
||||
}
|
||||
if (sub_snapshot_data) {
|
||||
op.od = sub_snapshot_data;
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: [op],
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.error && config.error('ERR updateShareDocumentPath shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocumentPath shareModel.applyOp', documentId, op, err, result);
|
||||
return callback && callback();
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateShareDocument(documentId, data, keys, callback) {
|
||||
if (!keys) {
|
||||
// no keys no update
|
||||
return callback && callback();
|
||||
}
|
||||
var ops = [];
|
||||
return shareModel.getSnapshot(documentId, function (err, doc) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.getSnapshot', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
if (doc.type.name === 'text') {
|
||||
ops.push({
|
||||
d: doc.snapshot,
|
||||
p: 0
|
||||
});
|
||||
ops.push({
|
||||
i: data,
|
||||
p: 0
|
||||
});
|
||||
} else if (doc.type.name === 'json') {
|
||||
_.forEach(keys, function (key) {
|
||||
if (key !== 'id') {
|
||||
var op = {
|
||||
p: [key]
|
||||
};
|
||||
if (doc.snapshot[key]) {
|
||||
op.od = doc.snapshot[key];
|
||||
}
|
||||
if (data[key]) {
|
||||
op.oi = data[key];
|
||||
}
|
||||
ops.push(op);
|
||||
}
|
||||
});
|
||||
}
|
||||
return shareModel.applyOp(documentId, {
|
||||
op: ops,
|
||||
v: doc.v
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
config.warn && config.warn('WARN updateShareDocument shareModel.applyOp', documentId, err);
|
||||
return callback && callback();
|
||||
}
|
||||
config.debug && config.debug('updateShareDocument shareModel.applyOp', documentId, ops, err, result);
|
||||
return callback && callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
document: updateShareDocument,
|
||||
documentPath: updateShareDocumentPath
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user