Files
habitica/website/server/controllers/top-level/payments/iap.js
2019-10-10 20:11:50 +02:00

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;