API Docs for: 0.9.0
Show:

File: lib/connectionAdapter/riakConnectionAdapter.js

// Copyright 2014, Yahoo! Inc.
// Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms.

var Promise = require('promise');
var ConnectionAdapter = require('./connectionAdapter');

/**
 * Riak accessor class
 *
 * @class RiakConnectionAdapter
 * @extends ConnectionAdapter
 * @param {object} [options]
 * @param {object} [options.schema='http']
 * @param {object} [options.host='localhost']
 * @param {object} [options.port=8098]
 * @constructor
 *
 * @property {string} _schema
 * @property {string} _host
 * @property {int} _port
 */
var RiakConnectionAdapter = ConnectionAdapter.extend(

	{
		/**
		 * Initializes the source-adapter
		 *
		 * @method initialize
		 */
		initialize: function () {
			this.__super();

			this._schema = this._options.schema || 'http';
			this._host = this._options.host || 'localhost';
			this._port = this._options.port || 8098;
		},


		/**
		 * Gets the complete url for a path specified
		 *
		 * @method _getUrlWithPath
		 * @param {string} path
		 * @return {string}
		 * @private
		 */
		_getUrlWithPath: function (path) {
			return this._schema + '://' + this._host + ':' + this._port + path;
		},

		/**
		 * Gets all bucket names
		 *
		 * @method getBuckets
		 * @param {function} [filterFn]
		 * @return {Promise} With {string[]} List of buckets
		 */
		getBuckets: function (filterFn) {
			return this.getPromise().then(function () {
				return this._request({
					method: 'GET',
					url: this._getUrlWithPath('/buckets?buckets=true')
				}).then(function (result) {
					return JSON.parse(result.body)['buckets'];
				}).then(function (result) {
					if (filterFn) {
						return result.filter(filterFn);
					} else {
						return result;
					}
				});
			}.bind(this));
		},

		/**
		 * Does the instance have a specific bucket?
		 *
		 * @method hasBucket
		 * @param {string} bucket
		 * @param {function} [filterFn]
		 * @return {Promise} With {boolean} Bucket exists?
		 */
		hasBucket: function (bucket, filterFn) {
			return this.getBuckets(filterFn).then(function (buckets) {
				return (buckets.indexOf(bucket) !== -1);
			});
		},

		/**
		 * Gets all bucket keys
		 *
		 * @method getBucketKeys
		 * @param {string} bucket
		 * @param {function} [filterFn]
		 * @return {Promise} With {string[]} Bucket keys
		 */
		getBucketKeys: function (bucket, filterFn) {
			return this.getPromise().then(function () {
				return this._request({
					method: 'GET',
					url: this._getUrlWithPath('/buckets/' + encodeURIComponent(bucket) + '/keys?keys=true')
				}).then(function (result) {
					return JSON.parse(result.body)['keys'];
				}).then(function (result) {
					if (filterFn) {
						return result.filter(filterFn);
					} else {
						return result;
					}
				});
			}.bind(this));
		},

		/**
		 * Does the instance have a specific key in a bucket?
		 *
		 * @method hasBucketKey
		 * @param {string} bucket
		 * @param {string} key
		 * @param {function} [filterFn]
		 * @return {Promise} With {boolean} Bucket key exists?
		 */
		hasBucketKey: function (bucket, key, filterFn) {
			return this.getBucketKeys(bucket, filterFn).then(function (keys) {
				return (keys.indexOf(key) !== -1);
			});
		},

		/**
		 * Gets an object
		 *
		 * @method getObject
		 * @param {string} bucket
		 * @param {string} key
		 * @return {Promise} With {Buffer}
		 */
		getObject: function (bucket, key) {
			return this.getPromise().then(function () {
				return this._request({
					method: 'GET',
					url: this._getUrlWithPath('/buckets/' + encodeURIComponent(bucket) + '/keys/' + encodeURIComponent(key))
				}).then(function (response) {
					return response.body;
				});
			}.bind(this));
		},

		/**
		 * Gets an object as JSON
		 *
		 * @method getObjectAsJSON
		 * @param {string} bucket
		 * @param {string} key
		 * @return {Promise} With {*}
		 */
		getObjectAsJSON: function (bucket, key) {
			return this.getObject(bucket, key).then(function (result) {
				return JSON.parse(result);
			});
		},


		/**
		 * Sets an object
		 *
		 * @method setObject
		 * @param {string} bucket
		 * @param {string} key
		 * @param {Buffer|string} data
		 * @param {string} [mimeType='application/octet-stream']
		 * @return {Promise}
		 */
		setObject: function (bucket, key, data, mimeType) {
			mimeType = mimeType || 'application/octet-stream';
			return this.getPromise().then(function () {
				return this._request({
					method: 'PUT',
					url: this._getUrlWithPath('/buckets/' + encodeURIComponent(bucket) + '/keys/' + encodeURIComponent(key)),
					headers: {
						"Content-Type": mimeType
					},
					body: data
				});
			}.bind(this));
		},

		/**
		 * Sets an object from JSON
		 *
		 * @method setObjectFromJSON
		 * @param {string} bucket
		 * @param {string} key
		 * @param {*} data
		 * @return {Promise}
		 */
		setObjectFromJSON: function (bucket, key, data) {
			return this.setObject(bucket, key, JSON.stringify(data), 'application/json');
		},


		/**
		 * Removes an object
		 *
		 * @method removeObject
		 * @param {string} bucket
		 * @param {string} key
		 * @return {Promise}
		 */
		removeObject: function (bucket, key) {
			return this.getPromise().then(function () {
				return this._request({
					method: 'DELETE',
					url: this._getUrlWithPath('/buckets/' + encodeURIComponent(bucket) + '/keys/' + encodeURIComponent(key))
				});
			}.bind(this));
		},

		/**
		 * Removes all object of a bucket
		 *
		 * @method removeAllObjects
		 * @param {string} bucket
		 * @return {Promise}
		 */
		removeAllObjects: function (bucket) {
			return this.getBucketKeys(bucket).then(function (keys) {
				var i, len,
					promise = Promise.resolve();

				for (i = 0, len = keys.length; i < len; i++) {
					(function (i) {
						promise = promise.then(function () {
							return this.removeObject(bucket, keys[i]);
						}.bind(this));
					}.bind(this)(i));
				}

				return promise;
			}.bind(this));
		}
	},

	{
		/**
		 * Type of class
		 *
		 * @property TYPE
		 * @type string
		 */
		TYPE: 'RiakConnectionAdapter'
	});

module.exports = RiakConnectionAdapter;