Source: Review.js

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _isomorphicFetch = require('isomorphic-fetch');

var _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);

var _tmSerialize = require('tm-serialize');

var _tmSerialize2 = _interopRequireDefault(_tmSerialize);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Reviews API JS client.
 *
 * In order to use Reviews API you should create an instance of this class.
 * ~~~~
 * import Reviews from "tm-reviews-api-client-js";
 * const reviews = new Reviews ('http://api.templatemonster.com/reviews/v1', 'en');
 * const list = reviews.getReviews ([12345, 55555]);
 * ~~~~
 * @constructor Reviews
 */

var Review = function () {
  function Review(url) {
    var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';

    _classCallCheck(this, Review);

    this.locale = null;
    this.url = null;

    this.locale = locale;
    this.url = url;
  }

  /**
   * Return review information for given identifiers.
   * @param params {Object} Reviews parameters
   * @returns {Object} <pre>{
   * "currentPageIndex":1,
   * "totalCount":11,
   * "lastPageIndex":6,
   * "items": [
   *  {
   *    "id":23,
   *    "status":4,
   *    "user_id":21543,
   *    "user_name":"mice mice",
   *    "title":"review title",
   *    "content":"review content",
   *    "score":5,
   *    "template_id":58444,
   *    "vote_up":0,
   *    "vote_down":0,
   *    "_links":{"self":{"href":"http://service-reviews.dev/api/v1/reviews/23"}}
   *   }, ...]
   *  }</pre>
   * @method Reviews#getReviews
   */


  _createClass(Review, [{
    key: 'getReviews',
    value: function () {
      var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee() {
        var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
        var response, paginationData;
        return regeneratorRuntime.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                params = _extends({}, params, { locale: this.locale });
                _context.next = 3;
                return this._fetchRequest(this.url + '/reviews?' + (0, _tmSerialize2.default)(params));

              case 3:
                response = _context.sent;
                paginationData = {
                  currentPageIndex: parseInt(response.headers.get('x-pagination-current-page')),
                  totalCount: parseInt(response.headers.get('x-pagination-total-count')),
                  lastPageIndex: parseInt(response.headers.get('x-pagination-page-count'))
                };
                _context.t0 = _extends;
                _context.t1 = {};
                _context.t2 = paginationData;
                _context.next = 10;
                return response.json();

              case 10:
                _context.t3 = _context.sent;
                _context.t4 = {
                  items: _context.t3
                };
                return _context.abrupt('return', (0, _context.t0)(_context.t1, _context.t2, _context.t4));

              case 13:
              case 'end':
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function getReviews() {
        return _ref.apply(this, arguments);
      }

      return getReviews;
    }()
  }, {
    key: 'approveReview',


    /**
     * Return approve review information for given identifiers.
     * @param token {String} Access token
     * @param id {Number} Review id
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *     "id": 1,
     *     "title": "Really good. Html is better than cms",
     *     "content": "I had font problem with flash cms. Now I have no problem with html",
     *     "score": 5,
     *     "created_at": 1469607948519,
     *     "user_id": 123,
     *     "template_id": 12345,
     *     "status": "initial",
     *     "vote_up": 1,
     *     "vote_down": 0,
     *     "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1"}}
     *   }
     *  }</pre>
     * @method Reviews#approveReview
     */
    value: function () {
      var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee2(token, id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                if (token.length) {
                  _context2.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(id)) {
                  _context2.next = 4;
                  break;
                }

                throw new Error('Id is not correct');

              case 4:
                _context2.next = 6;
                return this._fetchRequest(this.url + '/reviews/approve/' + id, token, 'POST');

              case 6:
                response = _context2.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context2.t0 = _extends;
                _context2.t1 = {};
                _context2.t2 = headersData;
                _context2.next = 13;
                return response.json();

              case 13:
                _context2.t3 = _context2.sent;
                _context2.t4 = {
                  item: _context2.t3
                };
                return _context2.abrupt('return', (0, _context2.t0)(_context2.t1, _context2.t2, _context2.t4));

              case 16:
              case 'end':
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function approveReview(_x3, _x4) {
        return _ref2.apply(this, arguments);
      }

      return approveReview;
    }()

    /**
     * Return complete review information for given identifiers.
     * @param token {String} Access token
     * @param id {Number} Review id
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *     "id": 1,
     *     "title": "Really good. Html is better than cms",
     *     "content": "I had font problem with flash cms. Now I have no problem with html",
     *     "score": 5,
     *     "created_at": 1469607948519,
     *     "user_id": 123,
     *     "template_id": 12345,
     *     "status": "initial",
     *     "vote_up": 1,
     *     "vote_down": 0,
     *     "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1"}}
     *   }
     *  }</pre>
     * @method Reviews#completeReview
     */

  }, {
    key: 'completeReview',
    value: function () {
      var _ref3 = _asyncToGenerator(regeneratorRuntime.mark(function _callee3(token, id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                if (token.length) {
                  _context3.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(id)) {
                  _context3.next = 4;
                  break;
                }

                throw new Error('Id is not correct');

              case 4:
                _context3.next = 6;
                return this._fetchRequest(this.url + '/reviews/' + id, token, 'POST');

              case 6:
                response = _context3.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context3.t0 = _extends;
                _context3.t1 = {};
                _context3.t2 = headersData;
                _context3.next = 13;
                return response.json();

              case 13:
                _context3.t3 = _context3.sent;
                _context3.t4 = {
                  item: _context3.t3
                };
                return _context3.abrupt('return', (0, _context3.t0)(_context3.t1, _context3.t2, _context3.t4));

              case 16:
              case 'end':
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      function completeReview(_x5, _x6) {
        return _ref3.apply(this, arguments);
      }

      return completeReview;
    }()

    /**
     * Return decline review information for given identifiers.
     * @param token {String} Access token
     * @param id {Number} Review id
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *     "id": 1,
     *     "title": "Really good. Html is better than cms",
     *     "content": "I had font problem with flash cms. Now I have no problem with html",
     *     "score": 5,
     *     "created_at": 1469607948519,
     *     "user_id": 123,
     *     "template_id": 12345,
     *     "status": "initial",
     *     "vote_up": 1,
     *     "vote_down": 0,
     *     "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1"}}
     *   }
     *  }</pre>
     * @method Reviews#declineReview
     */

  }, {
    key: 'declineReview',
    value: function () {
      var _ref4 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4(token, id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                if (token.length) {
                  _context4.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(id)) {
                  _context4.next = 4;
                  break;
                }

                throw new Error('Id is not correct');

              case 4:
                _context4.next = 6;
                return this._fetchRequest(this.url + '/reviews/decline/' + id, token, 'POST');

              case 6:
                response = _context4.sent;

                if (!(response.status >= 400)) {
                  _context4.next = 9;
                  break;
                }

                throw new Error('Bad server response');

              case 9:
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context4.t0 = _extends;
                _context4.t1 = {};
                _context4.t2 = headersData;
                _context4.next = 15;
                return response.json();

              case 15:
                _context4.t3 = _context4.sent;
                _context4.t4 = {
                  item: _context4.t3
                };
                return _context4.abrupt('return', (0, _context4.t0)(_context4.t1, _context4.t2, _context4.t4));

              case 18:
              case 'end':
                return _context4.stop();
            }
          }
        }, _callee4, this);
      }));

      function declineReview(_x7, _x8) {
        return _ref4.apply(this, arguments);
      }

      return declineReview;
    }()

    /**
     * Return added votes for the review: increment vote_up or vote_down field.
     * @param token {String} Access token
     * @param id {Number} Review id
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *     "id": 1,
     *     "title": "Really good. Html is better than cms",
     *     "content": "I had font problem with flash cms. Now I have no problem with html",
     *     "score": 5,
     *     "created_at": 1469607948519,
     *     "user_id": 123,
     *     "template_id": 12345,
     *     "status": "initial",
     *     "vote_up": 1,
     *     "vote_down": 0,
     *     "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1"}}
     *   }
     *  }</pre>
     * @method Reviews#addReviewVote
     */

  }, {
    key: 'addReviewVote',
    value: function () {
      var _ref5 = _asyncToGenerator(regeneratorRuntime.mark(function _callee5(token, id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                if (token.length) {
                  _context5.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(id)) {
                  _context5.next = 4;
                  break;
                }

                throw new Error('Id is not correct');

              case 4:
                _context5.next = 6;
                return this._fetchRequest(this.url + '/reviews/' + id, token, 'POST');

              case 6:
                response = _context5.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context5.t0 = _extends;
                _context5.t1 = {};
                _context5.t2 = headersData;
                _context5.next = 13;
                return response.json();

              case 13:
                _context5.t3 = _context5.sent;
                _context5.t4 = {
                  item: _context5.t3
                };
                return _context5.abrupt('return', (0, _context5.t0)(_context5.t1, _context5.t2, _context5.t4));

              case 16:
              case 'end':
                return _context5.stop();
            }
          }
        }, _callee5, this);
      }));

      function addReviewVote(_x9, _x10) {
        return _ref5.apply(this, arguments);
      }

      return addReviewVote;
    }()

    /**
     * Return reply of the review information for given identifiers.
     * @param token {String} Access token
     * @param review_id {Number} ID of the parent review
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *   "id": 1,
     *   "review_id": 1,
     *   "content": "I had font problem with flash cms. Now I have no problem with html",
     *   "created_at": 1469607948519,
     *   "user_id": 123,
     *   "vote_up": 0,
     *   "vote_down": 0,
     *   "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1/comment/1"}}
     *   }
     *  }</pre>
     * @method Reviews#replayTheReview
     */

  }, {
    key: 'replayTheReview',
    value: function () {
      var _ref6 = _asyncToGenerator(regeneratorRuntime.mark(function _callee6(token, review_id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee6$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                if (token.length) {
                  _context6.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(review_id)) {
                  _context6.next = 4;
                  break;
                }

                throw new Error('Review id is not correct');

              case 4:
                _context6.next = 6;
                return this._fetchRequest(this.url + '/reviews/' + review_id + '/comments', token, 'POST');

              case 6:
                response = _context6.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context6.t0 = _extends;
                _context6.t1 = {};
                _context6.t2 = headersData;
                _context6.next = 13;
                return response.json();

              case 13:
                _context6.t3 = _context6.sent;
                _context6.t4 = {
                  item: _context6.t3
                };
                return _context6.abrupt('return', (0, _context6.t0)(_context6.t1, _context6.t2, _context6.t4));

              case 16:
              case 'end':
                return _context6.stop();
            }
          }
        }, _callee6, this);
      }));

      function replayTheReview(_x11, _x12) {
        return _ref6.apply(this, arguments);
      }

      return replayTheReview;
    }()

    /**
     * Return request review comments list.
     * @param review_id {Number} ID of the parent review
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *   "id": 1,
     *   "review_id": 1,
     *   "content": "I had font problem with flash cms. Now I have no problem with html",
     *   "created_at": 1469607948519,
     *   "user_id": 123,
     *   "vote_up": 0,
     *   "vote_down": 0,
     *   "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1/comment/1"}}
     *   }
     *  }</pre>
     * @method Reviews#requestReviewComments
     */

  }, {
    key: 'requestReviewComments',
    value: function () {
      var _ref7 = _asyncToGenerator(regeneratorRuntime.mark(function _callee7(review_id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee7$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                if (this._isValidId(review_id)) {
                  _context7.next = 2;
                  break;
                }

                throw new Error('Review id is not correct');

              case 2:
                _context7.next = 4;
                return this._fetchRequest(this.url + '/reviews/' + review_id + '/comments');

              case 4:
                response = _context7.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context7.t0 = _extends;
                _context7.t1 = {};
                _context7.t2 = headersData;
                _context7.next = 11;
                return response.json();

              case 11:
                _context7.t3 = _context7.sent;
                _context7.t4 = {
                  item: _context7.t3
                };
                return _context7.abrupt('return', (0, _context7.t0)(_context7.t1, _context7.t2, _context7.t4));

              case 14:
              case 'end':
                return _context7.stop();
            }
          }
        }, _callee7, this);
      }));

      function requestReviewComments(_x13) {
        return _ref7.apply(this, arguments);
      }

      return requestReviewComments;
    }()

    /**
     * Return votes of the review.
     * @param token {String} Access token
     * @param id {Number} ID of the comment
     * @param review_id {Number} ID of the parent review
     * @returns {Object} <pre>{
     * "canModerate": 1,
     * "item":
     *  {
     *
     *   "id": 1,
     *   "review_id": 1,
     *   "content": "I had font problem with flash cms. Now I have no problem with html",
     *   "created_at": 1469607948519,
     *   "user_id": 123,
     *   "vote_up": 0,
     *   "vote_down": 0,
     *   "_links": {"self":{"href":"http://service-reviews.dev/api/v1/reviews/1/comment/1"}}
     *   }
     *  }</pre>
     * @method Reviews#voteComments
     */

  }, {
    key: 'voteComments',
    value: function () {
      var _ref8 = _asyncToGenerator(regeneratorRuntime.mark(function _callee8(token, id, review_id) {
        var response, headersData;
        return regeneratorRuntime.wrap(function _callee8$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                if (token.length) {
                  _context8.next = 2;
                  break;
                }

                throw new Error('Token not found');

              case 2:
                if (this._isValidId(id)) {
                  _context8.next = 4;
                  break;
                }

                throw new Error('Id is not correct');

              case 4:
                if (this._isValidId(review_id)) {
                  _context8.next = 6;
                  break;
                }

                throw new Error('Review id is not correct');

              case 6:
                _context8.next = 8;
                return this._fetchRequest(this.url + '/reviews/' + review_id + '/comments/' + id, token, 'POST');

              case 8:
                response = _context8.sent;
                headersData = {
                  canModerate: parseInt(response.headers.get('X-CAN-MODERATE'))
                };
                _context8.t0 = _extends;
                _context8.t1 = {};
                _context8.t2 = headersData;
                _context8.next = 15;
                return response.json();

              case 15:
                _context8.t3 = _context8.sent;
                _context8.t4 = {
                  item: _context8.t3
                };
                return _context8.abrupt('return', (0, _context8.t0)(_context8.t1, _context8.t2, _context8.t4));

              case 18:
              case 'end':
                return _context8.stop();
            }
          }
        }, _callee8, this);
      }));

      function voteComments(_x14, _x15, _x16) {
        return _ref8.apply(this, arguments);
      }

      return voteComments;
    }()

    /**
     * Check for correct id
     * @param id {Number}
     * @returns {boolean}
     * @private
     */

  }, {
    key: '_isValidId',
    value: function _isValidId(id) {
      return typeof id == 'number' && id > 0;
    }
  }, {
    key: '_fetchRequest',
    value: function () {
      var _ref9 = _asyncToGenerator(regeneratorRuntime.mark(function _callee9(url) {
        var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
        var method = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'GET';
        var headers, response;
        return regeneratorRuntime.wrap(function _callee9$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                headers = {};

                if (token) {
                  headers['Authorization'] = token;
                }
                if (method === 'POST') {
                  headers['content-type'] = 'application/x-www-form-urlencoded';
                }
                _context9.next = 5;
                return (0, _isomorphicFetch2.default)(url, {
                  method: method,
                  headers: new Headers(headers)
                });

              case 5:
                response = _context9.sent;

                if (!(response.status >= 400)) {
                  _context9.next = 8;
                  break;
                }

                throw new Error('Bad server response');

              case 8:
                return _context9.abrupt('return', response);

              case 9:
              case 'end':
                return _context9.stop();
            }
          }
        }, _callee9, this);
      }));

      function _fetchRequest(_x17) {
        return _ref9.apply(this, arguments);
      }

      return _fetchRequest;
    }()
  }]);

  return Review;
}();

exports.default = Review;