ente/src/services/subscriptionService.ts

173 lines
5.2 KiB
TypeScript
Raw Normal View History

2021-03-09 16:23:13 +00:00
import { getEndpoint } from 'utils/common/apiUtil';
import HTTPService from './HTTPService';
const ENDPOINT = getEndpoint();
import { getToken } from 'utils/common/key';
2021-03-12 22:48:44 +00:00
import { runningInBrowser } from 'utils/common/utilFunctions';
import { setData, LS_KEYS } from 'utils/storage/localStorage';
import { convertBytesToGBs } from 'utils/billingUtil';
export interface Subscription {
id: number;
userID: number;
productID: string;
storage: number;
originalTransactionID: string;
expiryTime: number;
paymentProvider: string;
isCancelled: boolean;
}
2021-03-12 12:30:33 +00:00
export interface Plan {
androidID: string;
iosID: string;
storage: number;
price: string;
period: string;
stripeID: string;
2021-03-12 12:30:33 +00:00
}
export const FREE_PLAN = 'free';
2021-03-09 16:23:13 +00:00
class SubscriptionService {
private stripe;
2021-03-12 22:48:44 +00:00
constructor() {
2021-03-09 16:23:13 +00:00
let publishableKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY;
2021-03-12 22:48:44 +00:00
this.stripe = runningInBrowser() && window['Stripe'](publishableKey);
2021-03-09 16:23:13 +00:00
}
public async updatePlans() {
2021-03-12 12:30:33 +00:00
try {
const response = await HTTPService.get(`${ENDPOINT}/billing/plans`);
const plans = response.data['plans'];
setData(LS_KEYS.PLANS, plans);
2021-03-12 12:30:33 +00:00
} catch (e) {
console.error('failed to get plans', e);
}
}
public async syncSubscription() {
try {
const response = await HTTPService.get(
`${ENDPOINT}/billing/subscription`,
null,
{
'X-Auth-Token': getToken(),
}
);
const subscription = response.data['subscription'];
setData(LS_KEYS.SUBSCRIPTION, subscription);
} catch (e) {
console.error(`failed to get user's subscription details`, e);
}
}
2021-03-12 17:34:20 +00:00
public async buySubscription(productID) {
2021-03-09 16:23:13 +00:00
try {
2021-03-12 22:48:44 +00:00
const response = await this.createCheckoutSession(productID);
await this.stripe.redirectToCheckout({
sessionId: response.data['sessionID'],
2021-03-09 16:23:13 +00:00
});
} catch (e) {
2021-03-12 17:34:20 +00:00
console.error('unable to buy subscription', e);
throw e;
}
}
public async updateSubscription(productID) {
try {
const response = await HTTPService.post(
`${ENDPOINT}/billing/stripe/update-subscription`,
{
productID,
},
null,
{
'X-Auth-Token': getToken(),
}
);
const subscription = response.data['subscription'];
setData(LS_KEYS.SUBSCRIPTION, subscription);
} catch (e) {
console.log(e);
throw e;
}
}
public async cancelSubscription() {
try {
const response = await HTTPService.get(
`${ENDPOINT}/billing/stripe/cancel-subscription`,
null,
{
'X-Auth-Token': getToken(),
}
);
const subscription = response.data['subscription'];
console.log(subscription);
setData(LS_KEYS.SUBSCRIPTION, subscription);
} catch (e) {
console.log(e);
throw e;
2021-03-09 16:23:13 +00:00
}
}
2021-03-12 22:48:44 +00:00
private async createCheckoutSession(productID) {
2021-03-13 10:04:17 +00:00
return HTTPService.post(
`${ENDPOINT}/billing/stripe/create-checkout-session`,
2021-03-13 10:04:17 +00:00
{
productID,
},
null,
{
'X-Auth-Token': getToken(),
}
);
2021-03-09 16:23:13 +00:00
}
2021-03-10 03:25:00 +00:00
2021-03-12 17:34:20 +00:00
public async verifySubscription(sessionID): Promise<Subscription> {
2021-03-10 03:25:00 +00:00
try {
2021-03-12 17:34:20 +00:00
const response = await HTTPService.post(
`${ENDPOINT}/billing/verify-subscription`,
{
2021-03-12 17:34:20 +00:00
paymentProvider: 'stripe',
2021-03-12 22:48:44 +00:00
productID: null,
2021-03-12 17:34:20 +00:00
VerificationData: sessionID,
},
null,
{
'X-Auth-Token': getToken(),
}
2021-03-10 03:25:00 +00:00
);
const subscription = response.data['subscription'];
setData(LS_KEYS.SUBSCRIPTION, subscription);
return subscription;
2021-03-10 03:25:00 +00:00
} catch (err) {
2021-03-12 17:34:20 +00:00
console.error('Error while verifying subscription', err);
2021-03-10 03:25:00 +00:00
}
}
2021-03-12 17:34:20 +00:00
public async redirectToCustomerPortal() {
try {
const response = await HTTPService.get(
`${ENDPOINT}/billing/customer-portal`,
null,
{
'X-Auth-Token': getToken(),
}
);
window.location.href = response.data['url'];
} catch (e) {
console.error('unable to get customer portal url');
}
2021-03-12 17:34:20 +00:00
}
2021-03-11 16:04:52 +00:00
async getUsage() {
try {
const response = await HTTPService.get(
`${ENDPOINT}/billing/usage`,
{ startTime: 0, endTime: Date.now() * 1000 },
{
'X-Auth-Token': getToken(),
2021-03-11 16:04:52 +00:00
}
);
return convertBytesToGBs(response.data.usage);
2021-03-11 16:04:52 +00:00
} catch (e) {
console.error('error getting usage', e);
}
}
2021-03-09 16:23:13 +00:00
}
export default new SubscriptionService();