@apihawk/billia-sdk
Version:
The ApiHawk Billia SDK
485 lines (484 loc) • 18.8 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const qs = require("qs");
const billia_sdk_service_base_1 = require("../lib/billia-sdk-service-base");
const to_rest_resource_1 = require("./common/to-rest-resource");
class BilliaSDKAffiliate extends billia_sdk_service_base_1.BilliaSDKServiceBase {
/**
* Get affiliate status
* @param {IApihawkSession} session
* @returns {Promise<IAffiliateEntity>}
*/
getStatus(session) {
return __awaiter(this, void 0, void 0, function* () {
const affiliate = yield this.api.call({
url: '/affiliate',
method: 'GET',
session,
headers: {
'Accept-Response': 'Advanced'
}
});
return affiliate._embedded.affiliate[0];
});
}
/**
* Get affiliate commissions
* @param {IApihawkSession} session
* @param query
* @returns {Promise<IRestPaginatedResource<IAffiliateCommissionEntity>>}
*/
getAffiliateCommission(session, query = {}) {
return __awaiter(this, void 0, void 0, function* () {
const q = query || {};
const filterData = {};
if (q.sort_by && q.sort_order) {
switch (q.sort_by) {
case 'status':
filterData.order = [{ field: 'status', sort: q.sort_order }];
break;
case 'amount':
filterData.order = [{ field: 'amount', sort: q.sort_order }];
break;
case 'date':
filterData.order = [{ field: 'date', sort: q.sort_order }];
break;
}
}
filterData.page = q.page || 1;
filterData.page_size = q.page_size || 25;
const commission = yield this.api.call({
url: '/affiliate-commission',
method: 'GET',
query: filterData,
session,
headers: {
'Accept-Response': 'Advanced'
}
});
return to_rest_resource_1.toRestResource(commission, 'affiliate_commission');
});
}
/**
* Get affiliate multi-tier level
* @param {IApihawkSession} session
* @param query
* @returns {Promise<IRestPaginatedResource<IAffiliateMultiTierLevelEntity>>}
*/
getAffiliateMultiTierLevel(session, query = {}) {
return __awaiter(this, void 0, void 0, function* () {
const filter = {
page: query.page || 1,
page_size: query.page_size || 25,
where: []
};
if (query.type) {
filter.where.push({
field: 'affiliate_type',
where: 'and',
type: 'equalTo',
value: query.type
});
}
if (query.level) {
filter.where.push({
field: 'level',
where: 'and',
type: 'equalTo',
value: query.level
});
}
if (query.productIds) {
filter.where.push({
field: 'product_id',
where: 'and',
type: 'in',
values: query.productIds
});
}
const multiTierLevel = yield this.api.call({
url: `/billing/affiliate/multi_tier_level?${qs.stringify(filter)}`,
method: 'GET',
session,
headers: {
'Accept-Response': 'Advanced'
}
});
return to_rest_resource_1.toRestResource(multiTierLevel, 'affiliate_multi_tier_level');
});
}
/**
* Sign up for affiliate program
* @param {IApihawkSession} session
* @param {number} userId
* @returns {Promise<IAffiliateEntity>}
*/
signUp(session, userId) {
return __awaiter(this, void 0, void 0, function* () {
return this.api.call({
url: '/affiliate',
method: 'POST',
body: {
user_id: userId
},
session
});
});
}
/**
* Get promocode
* @param {IApihawkSession} session
* @param {string} promocode
* @returns {Promise<IDiscountPromocodeEntity>}
*/
getPromocode(session, promocode) {
return __awaiter(this, void 0, void 0, function* () {
if (!promocode) {
throw new Error('Error getting promocode.');
}
const promocodeResponse = yield this.api.call({
url: `/discount/promocode/${encodeURIComponent(promocode)}`,
method: 'GET',
session
});
const promocodeProducts = yield this.getPromocodeProducts(session, [
promocode
]);
promocodeResponse.promocode_products = promocodeProducts.items;
return promocodeResponse;
});
}
/**
* Get affiliate promocodes
* @param {IApihawkSession} session
* @param query
* @returns {Promise<IRestPaginatedResource<IDiscountPromocodeEntity>>}
*/
getAffiliatePromocodes(session, query = {}) {
return __awaiter(this, void 0, void 0, function* () {
if (!query.affiliate_id) {
throw new Error('Error getting affiliate promocodes.');
}
const filter = {
page: query.page || 1,
page_size: query.page_size || 25,
where: [
{
field: 'affiliate_id',
where: 'and',
type: 'equalTo',
value: query.affiliate_id
}
]
};
const promocodes = yield this.api.call({
url: `/discount/promocode?${qs.stringify(filter)}`,
method: 'GET',
session
});
if (!promocodes._embedded.promocode_discount.length) {
return to_rest_resource_1.toRestResource(promocodes, 'promocode_discount');
}
const promocodeProducts = yield this.getPromocodeProducts(session, promocodes._embedded.promocode_discount.map((p) => p.name), query.affiliate_type, query.affiliate_level);
promocodes._embedded.promocode_discount.forEach((promocode) => {
if (!promocode.promocode_products) {
promocode.promocode_products = [];
}
promocodeProducts.items.forEach((promocodeProduct) => {
if (promocode.name === promocodeProduct.code_name) {
// @ts-ignore
promocode.promocode_products.push(promocodeProduct);
}
});
});
return to_rest_resource_1.toRestResource(promocodes, 'promocode_discount');
});
}
/**
* Create promocode
* @param {IApihawkSession} session
* @param {IDiscountPromocodeEntity} data
* @param {any[]} products
* @returns {Promise<IDiscountPromocodeEntity>}
*/
createPromocode(session, data, products) {
return __awaiter(this, void 0, void 0, function* () {
const validationError = this.validate(data, ['affiliate', 'promocode']);
if (validationError) {
throw validationError;
}
const promocode = yield this.api.call({
url: '/discount/promocode',
method: 'POST',
body: data,
session
});
if (products && products.length) {
const discounts = yield this.createDiscounts(session, products, data.name);
}
return promocode;
});
}
/**
* Update promocode
* @param {IApihawkSession} session
* @param {IDiscountPromocodeEntity} data
* @param {any[]} products
* @param {any[]} productsToRemove
* @returns {Promise<IDiscountPromocodeEntity>}
*/
updatePromocode(session, data, products, productsToRemove) {
return __awaiter(this, void 0, void 0, function* () {
const validationError = this.validate(data, ['affiliate', 'promocode']);
if (validationError) {
throw validationError;
}
const promocode = yield this.api.call({
url: `/discount/promocode/${encodeURIComponent(data.name)}`,
method: 'PATCH',
body: {
limit: data.limit,
start_date: data.start_date,
end_date: data.end_date
},
session
});
if (products && products.length) {
const createDiscountsResponse = yield this.createDiscounts(session, products, data.name);
}
if (productsToRemove && productsToRemove.length) {
const deleteDiscountsResponse = yield this.deleteDiscounts(session, productsToRemove);
}
return promocode;
});
}
/**
* Create discounts for the provided products with promocode and amount
* @param {IApihawkSession} session
* @param {any[]} products
* @param {string} promocode
* @returns {Promise<IDiscountProductEntity[]>}
*/
createDiscounts(session, products, promocode) {
return __awaiter(this, void 0, void 0, function* () {
const promises = [];
products.forEach((product) => {
if (!product.id) {
promises.push(new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
const discountProduct = yield this.api.call({
url: '/discount/product',
method: 'POST',
body: {
product_id: product.product_id,
type: 'percent',
discount: product.discount,
hook: 'promocode',
item_type: 'new',
min_quantity: 1,
max_quantity: 36
},
session
});
if (promocode) {
const promocodeProduct = yield this.api.call({
url: '/discount/promocode/products',
method: 'POST',
body: {
discount_id: discountProduct.id,
code_name: promocode,
product_id: product.product_id
},
session
});
}
resolve(discountProduct);
})));
}
});
const result = yield Promise.all(promises);
return result;
});
}
/**
* Remove discounts
* @param {IApihawkSession} session
* @param {any[]} data
* @returns {Promise<IDiscountProductEntity[]>}
*/
deleteDiscounts(session, data) {
return __awaiter(this, void 0, void 0, function* () {
const promises = [];
data.forEach((item) => {
promises.push(new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
const discountProduct = yield this.api.call({
url: `/discount/promocode/products/${item.promocode_product_id}`,
method: 'DELETE',
session
});
resolve(discountProduct);
})));
});
const result = yield Promise.all(promises);
return result;
});
}
/**
* Update discount amount
* @param {IApihawkSession} session
* @param data
* @returns {Promise<IDiscountProductEntity>}
*/
updateDiscountProduct(session, data) {
return __awaiter(this, void 0, void 0, function* () {
const discountProduct = yield this.api.call({
url: `/discount/product/${data.discount_id}`,
method: 'PATCH',
body: {
discount: data.discount
},
session
});
return discountProduct;
});
}
/**
* Get promocode products
* @param {IApihawkSession} session
* @param {string[]} promocodes
* @param affiliateType
* @param affiliateLevel
* @returns {Promise<IRestPaginatedResource<IDiscountPromocodeProductsEntity>>}
*/
getPromocodeProducts(session, promocodes = [], affiliateType, affiliateLevel) {
return __awaiter(this, void 0, void 0, function* () {
const filter = {
page: 1,
page_size: -1,
where: [
{
field: 'code_name',
where: 'and',
type: 'in',
values: promocodes
}
]
};
const promocodeProducts = yield this.api.call({
url: `/discount/promocode/products?${qs.stringify(filter)}`,
method: 'GET',
session
});
if (!promocodeProducts._embedded.promocode_products.length) {
return to_rest_resource_1.toRestResource(promocodeProducts, 'promocode_products');
}
const catalogProductIds = [
...new Set(promocodeProducts._embedded.promocode_products.map((promocodeProduct) => +promocodeProduct.product_id))
];
const catalogProducts = yield this.getCatalogProducts(session, catalogProductIds);
const promocodeDiscountIds = [
...new Set(promocodeProducts._embedded.promocode_products.map((promocodeProduct) => promocodeProduct.discount_id))
];
const promocodeDiscounts = yield this.getPromocodeDiscounts(session, promocodeDiscountIds);
const multiTierLevels = yield this.getAffiliateMultiTierLevel(session, {
page: 1,
page_size: -1,
type: affiliateType,
level: affiliateLevel,
productIds: [0, ...catalogProductIds]
});
let defaultMultiTierLevel;
multiTierLevels.items.forEach((multiTierLevel) => {
if (multiTierLevel.product_id === 0) {
defaultMultiTierLevel = multiTierLevel;
}
});
promocodeProducts._embedded.promocode_products.forEach((pp) => {
catalogProducts._embedded.catalog_product.forEach((cp) => {
if (+pp.product_id === +cp.product_id) {
pp.product = cp;
}
});
promocodeDiscounts._embedded.product_discount.forEach((pd) => {
if (+pp.discount_id === +pd.id) {
pp.discount = pd;
}
});
multiTierLevels.items.forEach((multiTierLevel) => {
if (!pp.multiTierLevel) {
pp.multiTierLevel = defaultMultiTierLevel;
}
if (+pp.product_id === +multiTierLevel.product_id) {
pp.multiTierLevel = multiTierLevel;
}
});
});
return to_rest_resource_1.toRestResource(promocodeProducts, 'promocode_products');
});
}
/**
* Get catalog products fitered by product_id
* @param {IApihawkSession} session
* @param {Array<string | number>} productIds
* @returns {Promise<IZendRestPaginatedResource<ICatalogProduct>>}
*/
getCatalogProducts(session, productIds = []) {
return __awaiter(this, void 0, void 0, function* () {
const filter = {
page: 1,
page_size: -1,
where: [
{
field: 'product_id',
where: 'and',
type: 'in',
values: productIds
}
]
};
return this.api.call({
url: `/billing/product?${qs.stringify(filter)}`,
method: 'GET',
headers: {
'Accept-Response': 'Advanced'
},
session
});
});
}
/**
* Get promocode discounts filtered by discount_id
* @param {IApihawkSession} session
* @param {Array<string | number>} discountIds
* @returns {Promise<any>}
*/
getPromocodeDiscounts(session, discountIds = []) {
return __awaiter(this, void 0, void 0, function* () {
const filter = {
page: 1,
page_size: -1,
where: [
{
field: 'id',
where: 'and',
type: 'in',
values: discountIds
}
]
};
return this.api.call({
url: `/discount/product?${qs.stringify(filter)}`,
method: 'GET',
session
});
});
}
}
exports.BilliaSDKAffiliate = BilliaSDKAffiliate;