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;
-
-