twilio
Version:
A Twilio helper library
196 lines (195 loc) • 6.07 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const RestException_1 = __importDefault(require("./RestException"));
class Page {
/**
*
* Base page object to maintain request state.
*
* @param version - A twilio version instance
* @param response - The http response
* @param solution - path solution
*/
constructor(version, response, solution) {
let payload = this.processResponse(response);
this._version = version;
this._payload = payload;
this._solution = solution;
this.nextPageUrl = this.getNextPageUrl();
this.previousPageUrl = this.getPreviousPageUrl();
this.instances = this.loadInstances(this.loadPage(payload));
}
/**
* Get the url of the previous page of records
*
* @returns url of the previous page, or undefined if the
* previous page URI/URL is not defined.
*/
getPreviousPageUrl() {
if (this._payload.meta &&
"previous_page_url" in this._payload.meta &&
this._payload.meta.previous_page_url) {
// jshint ignore:line
return this._payload.meta.previous_page_url; // jshint ignore:line
}
if ("previous_page_uri" in this._payload &&
this._payload.previous_page_uri) {
// jshint ignore:line
return this._version._domain.absoluteUrl(this._payload.previous_page_uri); // jshint ignore:line
}
return undefined;
}
/**
* Get the url of the next page of records
*
* @returns url of the next page, or undefined if the
* next page URI/URL is not defined.
*/
getNextPageUrl() {
if (this._payload.meta &&
"next_page_url" in this._payload.meta &&
this._payload.meta.next_page_url) {
// jshint ignore:line
return this._payload.meta.next_page_url; // jshint ignore:line
}
if ("next_page_uri" in this._payload && this._payload.next_page_uri) {
// jshint ignore:line
return this._version._domain.absoluteUrl(this._payload.next_page_uri); // jshint ignore:line
}
return undefined;
}
/**
* Build a new instance given a json payload
*
* @param payload - Payload response from the API
* @returns instance of a resource
*/
getInstance(payload) {
throw new Error("Page.get_instance() must be implemented in the derived class");
}
/**
* Load a list of records
*
* @param resources - json payload of records
* @returns list of resources
*/
loadInstances(resources) {
let instances = [];
resources.forEach((resource) => {
instances.push(this.getInstance(resource));
});
return instances;
}
/**
* Fetch the next page of records
*
* @returns promise that resolves to next page of results,
* or undefined if there isn't a nextPageUrl undefined.
*/
nextPage() {
if (!this.nextPageUrl) {
return undefined;
}
var reqPromise = this._version._domain.twilio.request({
method: "get",
uri: this.nextPageUrl,
});
var nextPagePromise = reqPromise.then(function (response) {
return new this.constructor(this._version, response, this._solution);
}.bind(this));
return nextPagePromise;
}
/**
* Fetch the previous page of records
*
* @returns promise that resolves to previous page of
* results, or undefined if there isn't a previousPageUrl undefined.
*/
previousPage() {
if (!this.previousPageUrl) {
return undefined;
}
var reqPromise = this._version._domain.twilio.request({
method: "get",
uri: this.previousPageUrl,
});
var prevPagePromise = reqPromise.then(function (response) {
return new this.constructor(this._version, response, this._solution);
}.bind(this));
return prevPagePromise;
}
/**
* Parse json response from API
*
* @param response - API response
*
* @throws Error If non 200 status code is returned
*
* @returns json parsed response
*/
processResponse(response) {
if (response.statusCode !== 200) {
throw new RestException_1.default(response);
}
if (typeof response.body === "string") {
return JSON.parse(response.body);
}
return response.body;
}
/**
* Load a page of records
*
* @param {object} payload json payload
* @return {array} the page of records
*/
loadPage(payload) {
if (payload.meta?.key) {
return payload[payload.meta.key];
}
const keys = Object.keys(payload).filter((key) => !Page.META_KEYS.includes(key));
if (keys.length === 1) {
return payload[keys[0]];
}
for (const key of keys)
if (Array.isArray(payload[key]))
return payload[key];
throw new Error("Page Records cannot be deserialized");
}
forOwn(obj, iteratee) {
obj = Object(obj);
for (const [key, val] of Object.entries(obj)) {
iteratee(val, key, obj);
}
}
toJSON() {
const clone = {};
this.forOwn(this, (value, key) => {
if (!key.startsWith("_") && typeof value !== "function") {
clone[key] = value;
}
});
return clone;
}
}
/**
* Meta keys returned in a list request
*
* @constant META_KEYS
*/
Page.META_KEYS = [
"end",
"first_page_uri",
"last_page_uri",
"next_page_uri",
"num_pages",
"page",
"page_size",
"previous_page_uri",
"start",
"total",
"uri",
];
exports.default = Page;