lib/user/index.js
'use strict';
const https = require('https');
const {
responseHandler,
errorHandler,
buildRequestOptions,
} = require('../common');
/**
* User methods
*/
class User {
/**
* Create User optional settings
* @typedef {Object} CreateUserOptions
* @property {boolean} [verifyEmail=false] - if `true` verification email will be sent
* @property {number} [startTrial=false] - if `true` start 30 days free trial
*/
/**
* Create user payload
* @typedef {Object} UserCreateParams
* @property {string} email - email of new user
* @property {string} password - password for new user
* @property {string} [first_name] - first name of new user
* @property {string} [last_name] - last name of new user
* @property {string} [number] - phone number of new user
* @property {CreateUserOptions} [options] - create user optional settings
*/
/**
* Create user response data
* @typedef {Object} UserCreateResponse
* @property {string} id - user unique id
* @property {number} verified - user is verified or not
* @property {string} email - user email
*/
/**
* Create new user account
* @param {UserCreateParams} data - create user payload
* @param {function(err: ApiErrorResponse, res: UserCreateResponse)} [originalCallback] - error first node.js callback
*/
static create ({
email,
password,
first_name,
last_name,
number,
options: {
verifyEmail = false,
startTrial = false,
} = {},
}, originalCallback) {
const JSONData = JSON.stringify({
skip_30day_trial: startTrial ? 0 : 1,
email,
password,
first_name,
last_name,
number,
});
const callbackWithEmailVerification = (createErr, createRes) => {
if (createErr) {
originalCallback(createErr);
return;
} else {
User.verifyEmail({ email }, verifyErr => {
if (verifyErr) {
originalCallback(verifyErr);
return;
} else {
originalCallback(null, createRes);
return;
}
});
}
};
const callback = verifyEmail
? callbackWithEmailVerification
: originalCallback;
const req = https
.request(buildRequestOptions({
method: 'POST',
path: '/user',
authorization: { type: 'Basic' },
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(JSONData),
},
}), responseHandler(callback))
.on('error', errorHandler(callback));
req.write(JSONData);
req.end();
}
/**
* Get user payload
* @typedef {Object} UserGetParams
* @property {string} token - your auth token
*/
/**
* Retrieve user response data
* @typedef {Object} UserGetResponse
* @property {string} id - user unique id
* @property {string} first_name - first name
* @property {string} last_name - last name
* @property {number} active - user is active or not
* @property {string} created - user creation timestamp
* @property {string[]} emails - user emails
* @property {string} primary_email - user primary email
* @property {Object[]} subscriptions - user subscriptions data
* @property {?Object} cloud_export_account_details - cloud export account details data
* @property {boolean} is_logged_in - user is logged in or not
* @property {{start_date: string, end_date: string, start_timestamp: number, end_timestamp: number}} billing_period - user billing period data
* @property {Object[]} companies - companies where user is a member of
* @property {?string} registration_source - resource where user was registered
* @property {Object[]} teams - teams where user is a member of
* @property {Object} settings - user specific settings
* @property {Object[]} organization_settings - organization specific settings where user is a member of
* @property {Object[]} merchant_accounts - merchant accounts data
*/
/**
* Retrieve user account details
* @param {UserGetParams} data - get user payload
* @param {function(err: ApiErrorResponse, res: UserGetResponse)} [callback] - error first node.js callback
*/
static retrieve ({ token }, callback) {
https
.request(buildRequestOptions({
method: 'GET',
path: '/user',
authorization: {
type: 'Bearer',
token,
},
}), responseHandler(callback))
.on('error', errorHandler(callback))
.end();
}
/**
* Verify user email payload
* @typedef {Object} UserVerifyEmailParams
* @property {string} email - email to verify
*/
/**
* Verify user email response data
* @typedef {Object} UserVerifyEmailResponse
* @property {string} status - status of verification email sending, e.g. 'success'
*/
/**
* Sends email with verification link to user
* @param {UserVerifyEmailParams} data - user verify email payload
* @param {function(err: ApiErrorResponse, res: UserVerifyEmailResponse)} [callback] - error first node.js callback
*/
static verifyEmail ({ email }, callback) {
const JSONData = JSON.stringify({ email });
const req = https
.request(buildRequestOptions({
method: 'POST',
path: '/user/verifyemail',
authorization: { type: 'Basic' },
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(JSONData),
},
}), responseHandler(callback))
.on('error', errorHandler(callback));
req.write(JSONData);
req.end();
}
}
module.exports = User;