UNPKG

chrobject

Version:

Stores chronicles of plain objects as diffs and snapshots

142 lines (141 loc) 6.2 kB
/** * Creator: Christian Hotz * Company: hydra newmedia GmbH * Date: 12.06.16 * * Copyright hydra newmedia GmbH */ "use strict"; /** * 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;