day 11
This commit is contained in:
Executable
+300
@@ -0,0 +1,300 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user