2021-03-09 16:23:13 +00:00
|
|
|
import { getEndpoint } from 'utils/common/apiUtil';
|
|
|
|
import HTTPService from './HTTPService';
|
|
|
|
const ENDPOINT = getEndpoint();
|
2021-03-12 09:12:19 +00:00
|
|
|
import { getToken } from 'utils/common/key';
|
2021-03-12 12:30:33 +00:00
|
|
|
import { ExecFileOptionsWithStringEncoding } from 'node:child_process';
|
2021-03-11 16:31:20 +00:00
|
|
|
export interface Subscription {
|
|
|
|
id: number;
|
|
|
|
userID: number;
|
|
|
|
productID: string;
|
|
|
|
storage: number;
|
|
|
|
originalTransactionID: string;
|
|
|
|
expiryTime: number;
|
|
|
|
paymentProvider: string;
|
|
|
|
}
|
2021-03-12 12:30:33 +00:00
|
|
|
export interface Plan {
|
|
|
|
id: string;
|
|
|
|
androidID: string;
|
|
|
|
iosID: string;
|
|
|
|
storage: number;
|
|
|
|
price: string;
|
|
|
|
period: string;
|
2021-03-12 15:09:17 +00:00
|
|
|
stripeID: string;
|
2021-03-12 12:30:33 +00:00
|
|
|
}
|
2021-03-09 16:23:13 +00:00
|
|
|
class SubscriptionService {
|
|
|
|
private stripe;
|
|
|
|
public init() {
|
|
|
|
let publishableKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY;
|
2021-03-12 09:13:38 +00:00
|
|
|
this.stripe = window['Stripe'](publishableKey);
|
2021-03-09 16:23:13 +00:00
|
|
|
}
|
2021-03-12 12:30:33 +00:00
|
|
|
public async getPlans(): Promise<Plan[]> {
|
|
|
|
try {
|
|
|
|
const response = await HTTPService.get(`${ENDPOINT}/billing/plans`);
|
|
|
|
return response.data['plans'];
|
|
|
|
} catch (e) {
|
|
|
|
console.error('failed to get plans', e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public async buySubscription(priceID) {
|
2021-03-09 16:23:13 +00:00
|
|
|
try {
|
2021-03-12 12:30:33 +00:00
|
|
|
const response = await this.createCheckoutSession(priceID);
|
2021-03-12 11:43:47 +00:00
|
|
|
await this.stripe.redirectToCheckout({
|
2021-03-12 15:09:17 +00:00
|
|
|
sessionId: response.data['sessionID'],
|
2021-03-09 16:23:13 +00:00
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async createCheckoutSession(priceId) {
|
|
|
|
return HTTPService.post(`${ENDPOINT}/billing/create-checkout-session`, {
|
|
|
|
priceId: priceId,
|
|
|
|
});
|
|
|
|
}
|
2021-03-10 03:25:00 +00:00
|
|
|
|
|
|
|
public async getCheckoutSession(sessionId) {
|
|
|
|
try {
|
|
|
|
const session = await HTTPService.get(
|
2021-03-12 11:43:47 +00:00
|
|
|
`${ENDPOINT}/billing/checkout-session`,
|
|
|
|
{
|
|
|
|
sessionId: sessionId,
|
|
|
|
}
|
2021-03-10 03:25:00 +00:00
|
|
|
);
|
|
|
|
return JSON.stringify(session, null, 2);
|
|
|
|
} catch (err) {
|
2021-03-12 11:43:47 +00:00
|
|
|
console.error('Error when fetching Checkout session', err);
|
2021-03-10 03:25:00 +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 },
|
|
|
|
{
|
2021-03-12 03:16:35 +00:00
|
|
|
'X-Auth-Token': getToken(),
|
2021-03-11 16:04:52 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
return this.convertBytesToGBs(response.data.usage);
|
|
|
|
} catch (e) {
|
|
|
|
console.error('error getting usage', e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public convertBytesToGBs(bytes): string {
|
|
|
|
return (bytes / (1024 * 1024 * 1024)).toFixed(2);
|
|
|
|
}
|
2021-03-09 16:23:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export default new SubscriptionService();
|