Files
2022-04-12 08:57:07 -04:00

301 lines
8.7 KiB
JavaScript

require('dotenv').config();
const qs = require('qs'); //parse url form encoded params
const paypalBaseUrl = process.env.PAYPAL_BASE_URL;
const paypalSandboxBaseUrl = process.env.PAYPAL_SANDBOX_BASE_URL;
if (process.env.MODE === 'development') {
var axios = require('axios').create({
baseURL: paypalSandboxBaseUrl,
});
} else if (process.env.MODE === 'production') {
var axios = require('axios').create({
baseURL: paypalBaseUrl,
});
}
let accessToken = '';
module.exports = new Service();
function Service() {
// this.error = async function () {
// Error.call(this);
// };
this.setAccessToken = async function () {
accessToken = await this._getPaypalAccessToken().catch((error) => {
throw error;
});
return accessToken;
};
this._getPaypalAccessToken = async function () {
let data = await axios({
method: 'post',
url: '/v1/oauth2/token',
auth: {
username: process.env.PAYPAL_CLIENT_ID,
password: process.env.PAYPAL_SECRET,
},
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: qs.stringify({
grant_type: 'client_credentials',
}),
}).catch((error) => {
throw error;
});
return data.data.access_token;
};
this.createProduct = async function (params) {
let requiredFields = ['name', 'type'];
requiredFields.forEach((field) => {
if (!params[field]) {
throw new Error(`Must have "${field}" parameter`);
}
});
params = this.filterParams(params);
let config = {
url: '/v1/catalogs/products',
data: params,
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response, { depth: null });
throw new Error(error.response?.data?.message ?? 'Internal Error: Error creating product');
}
};
this.getPlans = async function (paginationParams) {
let config = {
url: '/v1/billing/plans',
data: paginationParams,
};
try {
return await this.axiosGet(config);
} catch (error) {
console.error(error.response);
throw new Error('Internal Error: Error getting plans');
}
};
this.getProducts = async function (paginationParams) {
let config = {
url: '/v1/catalogs/products',
data: paginationParams,
};
try {
return await this.axiosGet(config);
} catch (error) {
console.error(error.response);
throw new Error('Internal Error: Error getting products');
}
};
this.getProductDetails = async function (productId) {
let config = {
url: `/v1/catalogs/products/${productId}`,
data: {},
};
try {
return await this.axiosGet(config);
} catch (error) {
console.error(error.response);
throw new Error('Internal Error: Error getting product details');
}
};
this.getSubscriptions = async function (paginationParams) {
let createdProduct = await axios({
method: 'get',
url: '/v1/billing/plans',
data: qs.stringify(paginationParams),
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
}).catch((error) => {
throw error;
});
return createdProduct.data;
};
this.createSubscription = async function (params) {
let config = {
url: '/v1/billing/subscriptions',
data: params,
};
return await this.axiosPost(config);
};
this.createPlan = async function (params) {
let config = {
url: '/v1/billing/plans',
data: params,
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error creating paypal subscription plan');
}
};
this.deactivatePlan = async function (planId) {
let config = {
url: `/v1/billing/plans/${planId}/deactivate`,
data: {},
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error deactivating paypal subscription plan');
}
};
this.getPlanDetails = async function (planId) {
let config = {
url: `/v1/billing/plans/${planId}`,
data: {},
};
try {
return await this.axiosGet(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error getting subscription details');
}
};
this.getSubscriptionDetails = async function (subscriptionId) {
let config = {
url: `/v1/billing/subscriptions/${subscriptionId}`,
data: {},
};
try {
return await this.axiosGet(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error getting subscription details');
}
};
this.updateProduct = async function (params, productId) {
let config = {
url: `/v1/catalogs/products/${productId}`,
data: params,
};
try {
return await this.axiosPatch(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error updating product');
}
};
this.updatePlan = async function (params, planId) {
let config = {
url: `/v1/billing/plans/${planId}`,
data: params,
};
try {
return await this.axiosPatch(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error updating plan');
}
};
this.updatePlanPricing = async function (params, planId) {
let config = {
url: `/v1/billing/plans/${planId}/update-pricing-schemes`,
data: params,
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error updating plan');
}
};
this.activatePlan = async function (planId) {
let config = {
url: `/v1/billing/plans/${planId}/activate`,
data: {},
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error updating plan');
}
};
this.deactivatePlan = async function (planId) {
let config = {
url: `/v1/billing/plans/${planId}/deactivate`,
data: {},
};
try {
return await this.axiosPost(config);
} catch (error) {
console.dir(error.response.data, { depth: null });
throw new Error('Internal Error: Error updating plan');
}
};
this.retrievePlan = async function (params, planId) {
let config = {
url: `/v1/billing/subscriptions/${planId}`,
data: params,
};
return await this.axiosGet(config);
};
this.axiosGet = async function (config) {
return await axios({
method: 'get',
url: config.url,
data: qs.stringify(config.data ?? {}),
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
});
};
this.axiosPost = async function (config) {
return await axios({
method: 'post',
url: config.url,
data: JSON.stringify(config.data),
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
Prefer: 'return=representation',
Authorization: `Bearer ${accessToken}`,
},
});
};
this.axiosPatch = async function (config) {
return await axios({
method: 'patch',
url: config.url,
data: JSON.stringify(config.data),
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: `Bearer ${accessToken}`,
},
});
};
/**
* [filterParams filters paramters from null, undefined, empty strings, empty arrays and empty objects as it can cause unwanted changes]
* @param {object} params [object that can contain one more object inside]
* @return {object} [object with only truth variables]
*/
this.filterParams = function (params) {
Object.keys(params).forEach((param) => {
if (this.empty(params[param]) || params[param].length === 0) {
console.log(`Parameter empty, null or undefined`);
delete params[param];
} else if (params[param].constructor === Object && Object.entries(params[param]).length === 0) {
console.log(`Parameter object empty`);
delete params[param];
} else if (params[param].constructor === Object && Object.entries(params[param]).length > 0) {
this.filterParams(params[param]);
}
});
return params;
};
this.empty = (value) => value === null || value === undefined;
}