mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
203 lines
5.4 KiB
JavaScript
203 lines
5.4 KiB
JavaScript
import {
|
|
authWithHeaders,
|
|
} from '../../../middlewares/auth';
|
|
import {
|
|
BadRequest,
|
|
} from '../../../libs/errors';
|
|
import googlePayments from '../../../libs/payments/google';
|
|
import applePayments from '../../../libs/payments/apple';
|
|
|
|
const api = {};
|
|
|
|
// TODO missing tests
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/android/verify Android Verify IAP
|
|
* @apiName IapAndroidVerify
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapAndroidVerify = {
|
|
method: 'POST',
|
|
url: '/iap/android/verify',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.transaction) throw new BadRequest(res.t('missingReceipt'));
|
|
const googleRes = await googlePayments.verifyGemPurchase({
|
|
user: res.locals.user,
|
|
receipt: req.body.transaction.receipt,
|
|
signature: req.body.transaction.signature,
|
|
gift: req.body.gift,
|
|
headers: req.headers,
|
|
});
|
|
res.respond(200, googleRes);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/android/subscription Android Subscribe
|
|
* @apiName IapAndroidSubscribe
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapSubscriptionAndroid = {
|
|
method: 'POST',
|
|
url: '/iap/android/subscribe',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.sku) throw new BadRequest(res.t('missingSubscriptionCode'));
|
|
await googlePayments.subscribe(
|
|
req.body.sku,
|
|
res.locals.user,
|
|
req.body.transaction.receipt,
|
|
req.body.transaction.signature,
|
|
req.headers,
|
|
);
|
|
|
|
res.respond(200);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/android/norenew-subscribe Android non-renewing subscription IAP
|
|
* @apiName iapSubscriptionAndroidNoRenew
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapSubscriptionAndroidNoRenew = {
|
|
method: 'POST',
|
|
url: '/iap/android/norenew-subscribe',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.sku) throw new BadRequest(res.t('missingSubscriptionCode'));
|
|
if (!req.body.transaction) throw new BadRequest(res.t('missingReceipt'));
|
|
|
|
await googlePayments.noRenewSubscribe({
|
|
sku: req.body.sku,
|
|
user: res.locals.user,
|
|
receipt: req.body.transaction.receipt,
|
|
signature: req.body.transaction.signature,
|
|
gift: req.body.gift,
|
|
headers: req.headers,
|
|
});
|
|
|
|
res.respond(200);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {get} /iap/android/subscribe/cancel Google Payments: subscribe cancel
|
|
* @apiName AndroidSubscribeCancel
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapCancelSubscriptionAndroid = {
|
|
method: 'GET',
|
|
url: '/iap/android/subscribe/cancel',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
const { user } = res.locals;
|
|
|
|
await googlePayments.cancelSubscribe(user, req.headers);
|
|
|
|
if (req.query.noRedirect) {
|
|
res.respond(200);
|
|
} else {
|
|
res.redirect('/');
|
|
}
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/ios/verify iOS Verify IAP
|
|
* @apiName IapiOSVerify
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapiOSVerify = {
|
|
method: 'POST',
|
|
url: '/iap/ios/verify',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.transaction) throw new BadRequest(res.t('missingReceipt'));
|
|
const appleRes = await applePayments.verifyGemPurchase({
|
|
user: res.locals.user,
|
|
receipt: req.body.transaction.receipt,
|
|
gift: req.body.gift,
|
|
headers: req.headers,
|
|
});
|
|
res.respond(200, appleRes);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/android/subscription iOS Subscribe
|
|
* @apiName IapiOSSubscribe
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapSubscriptioniOS = {
|
|
method: 'POST',
|
|
url: '/iap/ios/subscribe',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.sku) throw new BadRequest(res.t('missingSubscriptionCode'));
|
|
if (!req.body.receipt) throw new BadRequest(res.t('missingReceipt'));
|
|
|
|
await applePayments.subscribe(req.body.sku, res.locals.user, req.body.receipt, req.headers);
|
|
|
|
res.respond(200);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {get} /iap/android/subscribe/cancel Apple Payments: subscribe cancel
|
|
* @apiName iOSSubscribeCancel
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapCancelSubscriptioniOS = {
|
|
method: 'GET',
|
|
url: '/iap/ios/subscribe/cancel',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
const { user } = res.locals;
|
|
|
|
await applePayments.cancelSubscribe(user, req.headers);
|
|
|
|
if (req.query.noRedirect) {
|
|
res.respond(200);
|
|
} else {
|
|
res.redirect('/');
|
|
}
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @apiIgnore Payments are considered part of the private API
|
|
* @api {post} /iap/ios/norenew-subscribe iOS Verify IAP
|
|
* @apiName IapiOSVerify
|
|
* @apiGroup Payments
|
|
* */
|
|
api.iapSubscriptioniOSNoRenew = {
|
|
method: 'POST',
|
|
url: '/iap/ios/norenew-subscribe',
|
|
middlewares: [authWithHeaders()],
|
|
async handler (req, res) {
|
|
if (!req.body.sku) throw new BadRequest(res.t('missingSubscriptionCode'));
|
|
if (!req.body.transaction) throw new BadRequest(res.t('missingReceipt'));
|
|
|
|
await applePayments.noRenewSubscribe({
|
|
sku: req.body.sku,
|
|
user: res.locals.user,
|
|
receipt: req.body.transaction.receipt,
|
|
gift: req.body.gift,
|
|
headers: req.headers,
|
|
});
|
|
|
|
res.respond(200);
|
|
},
|
|
};
|
|
|
|
export default api;
|