loopback/example/replication/app.js

144 lines
3.3 KiB
JavaScript
Raw Normal View History

2016-05-03 22:50:21 +00:00
// Copyright IBM Corp. 2014,2016. All Rights Reserved.
// Node module: loopback
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
2014-01-28 20:54:41 +00:00
var loopback = require('../../');
var app = loopback();
var db = app.dataSource('db', { connector: loopback.Memory });
var Color = app.model('color', { dataSource: 'db', options: { trackChanges: true }});
var Color2 = app.model('color2', { dataSource: 'db', options: { trackChanges: true }});
2014-01-28 20:54:41 +00:00
var target = Color2;
var source = Color;
var SPEED = process.env.SPEED || 100;
var conflicts;
var steps = [
createSomeInitialSourceData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data'),
list.bind(this, target, 'current TARGET data'),
2014-01-28 20:54:41 +00:00
updateSomeTargetData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data '),
list.bind(this, target, 'current TARGET data (includes conflicting update)'),
2014-01-28 20:54:41 +00:00
updateSomeSourceDataCausingAConflict,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data (now has a conflict)'),
list.bind(this, target, 'current TARGET data (includes conflicting update)'),
2014-01-28 20:54:41 +00:00
resolveAllConflicts,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data (conflict resolved)'),
list.bind(this, target, 'current TARGET data (conflict resolved)'),
2014-01-28 20:54:41 +00:00
createMoreSourceData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data'),
list.bind(this, target, 'current TARGET data'),
2014-01-28 20:54:41 +00:00
createEvenMoreSourceData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data'),
list.bind(this, target, 'current TARGET data'),
2014-01-28 20:54:41 +00:00
deleteAllSourceData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data (empty)'),
list.bind(this, target, 'current TARGET data (empty)'),
2014-01-28 20:54:41 +00:00
createSomeNewSourceData,
replicateSourceToTarget,
list.bind(this, source, 'current SOURCE data'),
list.bind(this, target, 'current TARGET data'),
2014-01-28 20:54:41 +00:00
];
run(steps);
function createSomeInitialSourceData() {
Color.create([
{ name: 'red' },
{ name: 'blue' },
{ name: 'green' },
2014-01-28 20:54:41 +00:00
]);
}
function replicateSourceToTarget() {
Color.replicate(0, Color2, {}, function(err, replicationConflicts) {
conflicts = replicationConflicts;
});
}
function resolveAllConflicts() {
if (conflicts.length) {
2014-01-28 20:54:41 +00:00
conflicts.forEach(function(conflict) {
conflict.resolve();
});
}
}
function updateSomeTargetData() {
Color2.findById(1, function(err, color) {
color.name = 'conflict';
color.save();
});
}
function createMoreSourceData() {
Color.create({ name: 'orange' });
2014-01-28 20:54:41 +00:00
}
function createEvenMoreSourceData() {
Color.create({ name: 'black' });
2014-01-28 20:54:41 +00:00
}
function updateSomeSourceDataCausingAConflict() {
Color.findById(1, function(err, color) {
color.name = 'red!!!!';
color.save();
});
}
function deleteAllSourceData() {
Color.destroyAll();
}
function createSomeNewSourceData() {
Color.create([
{ name: 'violet' },
{ name: 'amber' },
{ name: 'olive' },
2014-01-28 20:54:41 +00:00
]);
}
function list(model, msg) {
console.log(msg);
model.find(function(err, items) {
items.forEach(function(item) {
console.log(' -', item.name);
});
console.log();
});
}
function run(steps) {
setInterval(function() {
var step = steps.shift();
if (step) {
2014-01-28 20:54:41 +00:00
console.log(step.name);
step();
}
}, SPEED);
}