channelape-sdk
Version:
A client for interacting with ChannelApe's API
162 lines • 7.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Resource_1 = require("../../model/Resource");
const Version_1 = require("../../model/Version");
const GenerateApiError_1 = require("../../utils/GenerateApiError");
const Q = require("q");
const Qs = require("qs");
const JsonOrderFormatterService_1 = require("./JsonOrderFormatterService");
const EXPECTED_GET_STATUS = 200;
const EXPECTED_CREATE_STATUS = 202;
const EXPECTED_UPDATE_STATUS = 202;
class OrdersCrudService {
constructor(client) {
this.client = client;
}
get(orderIdOrRequest) {
if (typeof orderIdOrRequest === 'string') {
return this.getByOrderId(orderIdOrRequest);
}
const deferred = Q.defer();
const getSinglePage = false;
this.getOrdersByRequest(orderIdOrRequest, [], deferred, getSinglePage);
return deferred.promise;
}
getPage(orderRequest) {
const deferred = Q.defer();
const getSinglePage = true;
this.getOrdersByRequest(orderRequest, [], deferred, getSinglePage);
return deferred.promise;
}
update(order) {
const deferred = Q.defer();
const requestUrl = `${Version_1.default.V1}${Resource_1.default.ORDERS}/${order.id}`;
const options = {
data: order
};
if (order.actionId) {
options.headers = {
'X-Channel-Ape-Action-Id': order.actionId
};
}
this.client.put(requestUrl, options, (error, response, body) => {
this.mapOrderPromise(requestUrl, deferred, error, response, body, EXPECTED_UPDATE_STATUS);
});
return deferred.promise;
}
patch(order) {
const deferred = Q.defer();
const requestUrl = `${Version_1.default.V1}${Resource_1.default.ORDERS}/${order.id}`;
const options = {
data: order
};
if (order.actionId) {
options.headers = {
'X-Channel-Ape-Action-Id': order.actionId
};
}
this.client.patch(requestUrl, options, (error, response, body) => {
this.mapOrderPromise(requestUrl, deferred, error, response, body, EXPECTED_UPDATE_STATUS);
});
return deferred.promise;
}
create(order) {
const deferred = Q.defer();
const requestUrl = `${Version_1.default.V1}${Resource_1.default.ORDERS}`;
const options = {
data: order
};
if (order.actionId) {
options.headers = {
'X-Channel-Ape-Action-Id': order.actionId
};
}
this.client.post(requestUrl, options, (error, response, body) => {
this.mapOrderPromise(requestUrl, deferred, error, response, body, EXPECTED_CREATE_STATUS);
});
return deferred.promise;
}
getByOrderId(orderId) {
const deferred = Q.defer();
const requestUrl = `/${Version_1.default.V1}${Resource_1.default.ORDERS}/${orderId}`;
this.client.get(requestUrl, {}, (error, response, body) => {
this.mapOrderPromise(requestUrl, deferred, error, response, body, EXPECTED_GET_STATUS);
});
return deferred.promise;
}
getOrdersByRequest(ordersRequest, orders, deferred, getSinglePage) {
const requestUrl = `/${Version_1.default.V1}${Resource_1.default.ORDERS}`;
const ordersQueryParams = ordersRequest;
if (ordersQueryParams.startDate != null && typeof ordersQueryParams.startDate !== 'string') {
ordersQueryParams.startDate = ordersQueryParams.startDate.toISOString();
}
if (ordersQueryParams.endDate != null && typeof ordersQueryParams.endDate !== 'string') {
ordersQueryParams.endDate = ordersQueryParams.endDate.toISOString();
}
if (ordersQueryParams.updatedAtStartDate != null && typeof ordersQueryParams.updatedAtStartDate !== 'string') {
ordersQueryParams.updatedAtStartDate = ordersQueryParams.updatedAtStartDate.toISOString();
}
if (ordersQueryParams.updatedAtEndDate != null && typeof ordersQueryParams.updatedAtEndDate !== 'string') {
ordersQueryParams.updatedAtEndDate = ordersQueryParams.updatedAtEndDate.toISOString();
}
const options = {
params: ordersQueryParams,
paramsSerializer: this.paramsSerializer
};
this.client.get(requestUrl, options, (error, response, body) => {
const requestResponse = {
error,
response,
body
};
this.mapOrdersPromise(requestUrl, deferred, requestResponse, orders, ordersRequest, EXPECTED_GET_STATUS, getSinglePage);
});
}
mapOrderPromise(requestUrl, deferred, error, response, body, expectedStatusCode) {
if (error) {
deferred.reject(error);
}
else if (response.status === expectedStatusCode) {
const order = JsonOrderFormatterService_1.default.formatOrder(body);
deferred.resolve(order);
}
else {
const channelApeErrorResponse = (0, GenerateApiError_1.default)(requestUrl, response, body, expectedStatusCode);
deferred.reject(channelApeErrorResponse);
}
}
mapOrdersPromise(requestUrl, deferred, requestCallbackParams, orders, ordersRequest, expectedStatusCode, getSinglePage) {
if (requestCallbackParams.error) {
deferred.reject(requestCallbackParams.error);
}
else if (requestCallbackParams.response.status === expectedStatusCode) {
const data = requestCallbackParams.body;
const mergedOrders = orders.concat(data.orders);
if (getSinglePage) {
deferred.resolve({
orders: mergedOrders.map(o => JsonOrderFormatterService_1.default.formatOrder(o)),
pagination: data.pagination
});
}
else if (data.pagination.lastPage) {
const ordersToReturn = mergedOrders.map(o => JsonOrderFormatterService_1.default.formatOrder(o));
deferred.resolve(ordersToReturn);
}
else {
const newOrdersRequest = Object.assign(Object.assign({}, ordersRequest), { lastKey: data.pagination.lastKey });
this.getOrdersByRequest(newOrdersRequest, mergedOrders, deferred, getSinglePage);
}
}
else {
const channelApeErrorResponse = (0, GenerateApiError_1.default)(requestUrl, requestCallbackParams.response, requestCallbackParams.body, expectedStatusCode);
deferred.reject(channelApeErrorResponse);
}
}
paramsSerializer(params) {
// Remove brackets from duplicate query parameters
// e.g. ?foo[]=5&foo[]=2 becomes ?foo=5&foo=2
return Qs.stringify(params, { arrayFormat: 'repeat' });
}
}
exports.default = OrdersCrudService;
//# sourceMappingURL=OrdersCrudService.js.map