UNPKG

react-native-spotify-web-api

Version:
144 lines (114 loc) 3.63 kB
'use strict'; var Request = function(builder) { if (!builder) { throw new Error('No builder supplied to constructor'); } this.host = builder.host; this.port = builder.port; this.scheme = builder.scheme; this.queryParameters = builder.queryParameters; this.bodyParameters = builder.bodyParameters; this.headers = builder.headers; this.path = builder.path; }; Request.prototype._getter = function (key) { return function () { return this[key]; }; }; Request.prototype.getHost = Request.prototype._getter('host'); Request.prototype.getPort = Request.prototype._getter('port'); Request.prototype.getScheme = Request.prototype._getter('scheme'); Request.prototype.getPath = Request.prototype._getter('path'); Request.prototype.getQueryParameters = Request.prototype._getter('queryParameters'); Request.prototype.getBodyParameters = Request.prototype._getter('bodyParameters'); Request.prototype.getHeaders = Request.prototype._getter('headers'); Request.prototype.getURI = function() { if (!this.scheme || !this.host || !this.port) { throw new Error('Missing components necessary to construct URI'); } var uri = this.scheme + '://' + this.host; if (this.scheme === 'http' && this.port !== 80 || this.scheme === 'https' && this.port !== 443) { uri += ':' + this.port; } if (this.path) { uri += this.path; } return uri; }; Request.prototype.getURL = function() { var uri = this.getURI(); if (this.getQueryParameters()) { return uri + this.getQueryParameterString(this.getQueryParameters()); } else { return uri; } }; Request.prototype.getQueryParameterString = function() { var queryParameters = this.getQueryParameters(); if (queryParameters) { return '?' + Object.keys(queryParameters).filter(function (key) { return queryParameters[key] !== undefined; }).map(function (key) { return key + '=' + queryParameters[key]; }).join('&'); } }; Request.prototype.execute = function (method, callback) { if (callback) { method(this, callback); return; } var _self = this; return new Promise(function(resolve, reject) { method(_self, function(error, result) { if (error) { reject(error); } else { resolve(result); } }); }); }; var Builder = function() { }; Builder.prototype._setter = function (key) { return function (value) { this[key] = value; return this; }; }; Builder.prototype.withHost = Builder.prototype._setter('host'); Builder.prototype.withPort = Builder.prototype._setter('port'); Builder.prototype.withScheme = Builder.prototype._setter('scheme'); Builder.prototype.withPath = Builder.prototype._setter('path'); Builder.prototype._assigner = function (key) { return function () { for (var i = 0; i < arguments.length; i++) { this[key] = this._assign(this[key], arguments[i]); } return this; }; }; Builder.prototype.withQueryParameters = Builder.prototype._assigner('queryParameters'); Builder.prototype.withBodyParameters = Builder.prototype._assigner('bodyParameters'); Builder.prototype.withHeaders = Builder.prototype._assigner('headers'); Builder.prototype.withAuth = function(accessToken) { if (accessToken) { this.withHeaders( {'Authorization' : 'Bearer ' + accessToken} ); } return this; }; Builder.prototype._assign = function(src, obj) { if (obj && Object.keys(obj).length > 0) { return Object.assign(src || {}, obj); } return src; }; Builder.prototype.build = function() { return new Request(this); }; module.exports.builder = function() { return new Builder(); };