droplr-api
Version:
Official Droplr API Client for Javascript
84 lines (67 loc) • 2.15 kB
JavaScript
const axios = require('axios');
const _ = require('lodash');
const ClientError = require('./ClientError');
const AnonymousAuth = require('./auth/AnonymousAuth');
const Boards = require('./resources/Boards');
const Drops = require('./resources/Drops');
const Teams = require('./resources/Teams');
const Users = require('./resources/Users');
const RootRedirect = require('./resources/RootRedirect');
class Client {
constructor(options) {
this.options = _.merge({
baseUrl: 'https://api.droplr.com',
auth: new AnonymousAuth(),
requestDefaults: {},
}, options);
this.users = new Users(this);
this.boards = new Boards(this);
this.drops = new Drops(this);
this.teams = new Teams(this);
this.users = new Users(this);
this.rootRedirect = new RootRedirect(this);
}
get(path, options) {
return this._request('get', path, options);
}
post(path, data, options = {}) {
const config = options;
config.data = data;
return this._request('post', path, config);
}
put(path, data, options = {}) {
const config = options;
config.data = data;
return this._request('put', path, config);
}
delete(path, options = {}) {
return this._request('delete', path, options);
}
async _request(method, path, config) {
let request = config;
request.url = `${this.options.baseUrl}/${path}`;
request.method = method;
this.options.auth.authorize(request);
request = _.merge(request, this.options.requestDefaults);
try {
const response = await axios.request(request);
return this._handleResponse(request, response);
} catch (error) {
return this._handleError(request, error);
}
}
async _handleResponse(request, response) {
if (this.options.onResponse) {
await Promise.resolve(this.options.onResponse(request, response));
}
return response;
}
async _handleError(request, error) {
const clientError = new ClientError(error);
if (this.options.onError) {
await Promise.resolve(this.options.onError(request, clientError));
}
throw clientError;
}
}
module.exports = Client;