chrobject
Version:
Stores chronicles of plain objects as diffs and snapshots
142 lines (141 loc) • 6.2 kB
JavaScript
/**
* Creator: Christian Hotz
* Company: hydra newmedia GmbH
* Date: 12.06.16
*
* Copyright hydra newmedia GmbH
*/
;
/**
* Imports
*/
var mongoose = require('mongoose');
var _ = require('lodash');
var mongoose_repo_1 = require('mongoose-repo');
var Snapshot_1 = require('../../utils/Snapshot');
var Diff_1 = require('../../utils/Diff');
var Creator_1 = require('../../utils/Creator');
var DiffModel_1 = require('./models/DiffModel');
var SnapshotModel_1 = require('./models/SnapshotModel');
var MongooseStorage = (function () {
function MongooseStorage(loggerOrCfg, dbConnectionString, dbOptions) {
if (!mongoose.connection.readyState && dbConnectionString) {
mongoose.connect(dbConnectionString, dbOptions ? dbOptions : null);
}
this.snapshotRepository = new mongoose_repo_1.Repository(SnapshotModel_1.SnapshotCollection, loggerOrCfg);
this.diffRepository = new mongoose_repo_1.Repository(DiffModel_1.DiffCollection, loggerOrCfg);
}
MongooseStorage.prototype.findDiffsByCondition = function (condition, entity, callback) {
var query = {
'metadata.entity': entity.name
};
if (condition.objIds && !_.isEmpty(condition.objIds)) {
query['metadata.objId'] = { $in: condition.objIds };
}
if (condition.timerange) {
var dateCompareQuery = {};
if (condition.timerange.start) {
dateCompareQuery['$gte'] = condition.timerange.start;
}
if (condition.timerange.end) {
dateCompareQuery['$lte'] = condition.timerange.end;
}
if (!_.isEmpty(dateCompareQuery)) {
query['metadata.timestamp'] = dateCompareQuery;
}
}
if (condition.creator) {
if (condition.creator.user) {
query['metadata.creator.user'] = condition.creator.user;
}
if (condition.creator.source) {
query['metadata.creator.source'] = condition.creator.source;
}
}
this.diffRepository.find(query, function (err, result) {
if (err) {
callback(err);
}
else {
var diffs = [];
for (var _i = 0, _a = result.items; _i < _a.length; _i++) {
var diff = _a[_i];
diffs.push(new Diff_1.Diff(diff.obj, diff.metadata.objId, entity, new Creator_1.Creator(diff.metadata.creator.user, diff.metadata.creator.source), new Date(diff.metadata.timestamp), diff._id.toHexString(), diff.metadata.linkId));
}
callback(null, diffs);
}
});
};
MongooseStorage.prototype.findSnapshotById = function (id, entity, callback) {
this.snapshotRepository.findById(id, function (err, model) {
if (err) {
callback(err);
}
else {
var snap = new Snapshot_1.Snapshot(model.obj, entity, new Creator_1.Creator(model.metadata.creator.user, model.metadata.creator.source), new Date(model.metadata.timestamp), model._id.toHexString());
callback(null, snap.setObjId(model.metadata.objId));
}
});
};
MongooseStorage.prototype.insertSnapshot = function (snapshot, callback) {
this.snapshotRepository.insert(new SnapshotModel_1.SnapshotModel(snapshot), function (err, model) {
if (err || !model) {
callback(err);
}
else {
callback(null, snapshot.clone().setId(model._id.toString()));
}
});
};
MongooseStorage.prototype.upsertSnapshot = function (snapshot, callback) {
var updateCondition = { 'metadata.entity': snapshot.entity.name, 'metadata.objId': snapshot.objId };
this.snapshotRepository.updateByCondition(updateCondition, new SnapshotModel_1.SnapshotModel(snapshot), function (err, model) {
if (err || !model) {
callback(err);
}
else {
callback(null, snapshot.clone().setId(model._id.toString()));
}
});
};
MongooseStorage.prototype.insertDiff = function (diff, callback) {
this.diffRepository.insert(new DiffModel_1.DiffModel(diff), function (err, model) {
if (err || !model) {
callback(err);
}
else {
callback(null, diff.clone().setId(model._id.toString()));
}
});
};
MongooseStorage.prototype.findLatestSnapshotBefore = function (id, timestamp, entity, callback) {
var searchCondition = { 'metadata.entity': entity.name, 'metadata.objId': id };
SnapshotModel_1.SnapshotCollection.findOne(searchCondition).sort({ 'metadata.timestamp': -1 })
.exec(function (err, model) {
if (err || !model) {
callback(err);
}
else {
var creator = new Creator_1.Creator(model.metadata.creator.user, model.metadata.creator.source);
var timestamp_1 = new Date(Date.parse(model.metadata.timestamp));
callback(null, new Snapshot_1.Snapshot(model.obj, entity, creator, timestamp_1, model._id.toString()));
}
});
};
MongooseStorage.prototype.findLatestDiffBefore = function (id, timestamp, entity, callback) {
var searchCondition = { 'metadata.entity': entity.name, 'metadata.objId': id };
DiffModel_1.DiffCollection.findOne(searchCondition).sort({ 'metadata.timestamp': -1 })
.exec(function (err, model) {
if (err || !model) {
callback(err);
}
else {
var creator = new Creator_1.Creator(model.metadata.creator.user, model.metadata.creator.source);
var timestamp_2 = new Date(Date.parse(model.metadata.timestamp));
callback(null, new Diff_1.Diff(model.obj, id, entity, creator, timestamp_2, model._id.toString()));
}
});
};
return MongooseStorage;
}());
exports.MongooseStorage = MongooseStorage;