mail/src/js/service/lawnchair.js

225 lines
5.7 KiB
JavaScript

'use strict';
var ngModule = angular.module('woServices');
ngModule.service('appConfigLawnchair', LawnchairDAO);
ngModule.service('accountLawnchair', LawnchairDAO);
module.exports = LawnchairDAO;
/**
* Handles generic caching of JSON objects in a lawnchair adapter
*/
function LawnchairDAO() {}
/**
* Initialize the lawnchair database
* @param {String} dbName The name of the database
* @return {Promise}
*/
LawnchairDAO.prototype.init = function(dbName) {
var self = this;
return new Promise(function(resolve, reject) {
if (!dbName) {
throw new Error('Lawnchair DB name must be specified!');
}
self._db = new Lawnchair({
name: dbName
}, function(success) {
if (success) {
resolve();
} else {
reject(new Error('Lawnchair initialization ' + dbName + ' failed!'));
}
});
});
};
/**
* Create or update an object
* @return {Promise}
*/
LawnchairDAO.prototype.persist = function(key, object) {
var self = this;
return new Promise(function(resolve, reject) {
if (!key || !object) {
throw new Error('Key and Object must be set!');
}
self._db.save({
key: key,
object: object
}, function(persisted) {
if (persisted.key !== key) {
reject(new Error('Persisting failed!'));
return;
}
resolve();
});
});
};
/**
* Persist a bunch of items at once
* @return {Promise}
*/
LawnchairDAO.prototype.batch = function(list) {
var self = this;
return new Promise(function(resolve, reject) {
if (!(list instanceof Array)) {
throw new Error('Input must be of type Array!');
}
self._db.batch(list, function(res) {
if (!res) {
reject(new Error('Persisting batch failed!'));
} else {
resolve();
}
});
});
};
/**
* Read a single item by its key
* @return {Promise}
*/
LawnchairDAO.prototype.read = function(key) {
var self = this;
return new Promise(function(resolve) {
if (!key) {
throw new Error('Key must be specified!');
}
self._db.get(key, function(o) {
if (o) {
resolve(o.object);
} else {
resolve();
}
});
});
};
/**
* List all the items of a certain type
* @param type [String] The type of item e.g. 'email'
* @return {Promise}
*/
LawnchairDAO.prototype.list = function(query, exactMatchOnly) {
var self = this;
return new Promise(function(resolve) {
var matchingKeys = [];
// validate input
if ((Array.isArray(query) && query.length === 0) || (!Array.isArray(query) && !query)) {
throw new Error('Args not is not set!');
}
// this method operates on arrays of keys, so normalize input 'key' -> ['key']
if (!Array.isArray(query)) {
query = [query];
}
// get all keys
self._db.keys(function(keys) {
// check if there are keys in the db that start with the respective query
matchingKeys = keys.filter(function(key) {
return query.filter(function(type) {
if (exactMatchOnly) {
return key === type;
} else {
return key.indexOf(type) === 0;
}
}).length > 0;
});
if (matchingKeys.length === 0) {
// no matching keys, resolve
resolve([]);
return;
}
// fetch all items from data-store with matching keys
self._db.get(matchingKeys, function(intervalList) {
var result = intervalList.map(function(item) {
return item.object;
});
resolve(result);
});
});
});
};
/**
* Removes an object liter from local storage by its key (delete)
* @return {Promise}
*/
LawnchairDAO.prototype.remove = function(key) {
var self = this;
return new Promise(function(resolve, reject) {
self._db.remove(key, function(err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
};
/**
* Removes an object liter from local storage by its key (delete)
* @return {Promise}
*/
LawnchairDAO.prototype.removeList = function(type) {
var self = this;
return new Promise(function(resolve) {
var matchingKeys = [],
after;
// validate type
if (!type) {
throw new Error('Type is not set!');
}
// get all keys
self._db.keys(function(keys) {
// check if key begins with type
keys.forEach(function(key) {
if (key.indexOf(type) === 0) {
matchingKeys.push(key);
}
});
if (matchingKeys.length < 1) {
resolve();
return;
}
// remove all matching keys
after = _.after(matchingKeys.length, resolve);
_.each(matchingKeys, function(key) {
self._db.remove(key, after);
});
});
});
};
/**
* Clears the whole local storage cache
* @return {Promise}
*/
LawnchairDAO.prototype.clear = function() {
var self = this;
return new Promise(function(resolve, reject) {
self._db.nuke(function(err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
};