tachi
Version:
Node.js MVC framework for seriously rapid application development.
161 lines (112 loc) • 4.09 kB
JavaScript
var fs = require('fs');
module.exports = function (connectionDetails) {
connectionDetails = connectionDetails || {};
var baseDirectory = './' + (connectionDetails.baseDirectory || 'data');
var dataDirectoryExists = fs.existsSync(baseDirectory);
if (!dataDirectoryExists) {
fs.mkdirSync(baseDirectory);
}
var getFileName = function (repoName) {
var fileName = baseDirectory + '/' + repoName + '-repo.js';
return fileName;
};
var loadData = function (repoName) {
var repoLocation = getFileName(repoName);
var deferred = new Deferred();
fs.readFile(repoLocation, function (err, data) {
if (err) {
Logger.log({
status: Logger.Status.Error,
message: [
'Error while loading from: ' + repoLocation,
err
]
});
deferred.complete([]);
return;
}
var data = JSON.parse(data);
deferred.complete(data);
});
return deferred;
};
var saveData = function (repoName, list) {
var deferred = new Deferred();
var s = JSON.stringify(list);
var repoLocation = getFileName(repoName);
fs.writeFile(repoLocation, s, function (err) {
if (err) {
Logger.log({
status: Logger.Status.Error,
message: [
'Error while loading from: ' + repoLocation,
err
]
});
deferred.complete(false);
return;
};
Logger.log('Data loaded from: ' + repoLocation);
deferred.complete(true);
});
return deferred;
};
var _allItems = {};
return function JsonRepository(repoName) {
var _internalList = _allItems[repoName] || {};
var deferred = loadData(repoName);
deferred.onComplete(function (data) {
var item;
for (var i = data.length; i--; ) {
item = data[i];
_internalList[item._id] = item;
}
_allItems[repoName] = _internalList;
});
var getList = function () {
var output = [];
for (var _id in _internalList) {
output.push(_internalList[_id]);
}
output.reverse();
return output;
};
this.get = function (_id) {
var deferred = new Deferred();
deferred.complete(_internalList[_id] || _internalList[_id + '']);
return deferred;
};
this.update = function (post) {
_internalList[post._id] = post;
return saveData(repoName, getList());
};
this.add = function (post) {
var nextPostId = 0;
for (var postId in _internalList) {
var _id = _internalList[postId]._id;
if (_id > nextPostId) {
nextPostId = _id;
}
}
nextPostId++;
post._id = nextPostId;
_internalList[post._id] = post;
var saveDeferred = saveData(repoName, getList());
var deferred = new Deferred();
saveDeferred.onComplete(function() {
deferred.complete(post._id);
});
return deferred;
};
this.remove = function (_id) {
delete _internalList[_id];
return saveData(repoName, getList());
};
this.getAll = function () {
var deferred = new Deferred();
var items = getList();
deferred.complete(items);
return deferred;
};
};
};