UNPKG

spotify-web-api-node

Version:
166 lines (135 loc) 3.83 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 && Array.isArray(obj)) { return obj; } if (obj && typeof obj === 'string') { return 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(); };