mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
Gift Subscriptions Promo (#8270)
* WIP(promo): buy-1-get-1 subs * WIP(subscriptions): Slack integration * feat(Slack): notify on sub buy
This commit is contained in:
@@ -79,6 +79,7 @@
|
|||||||
},
|
},
|
||||||
"SLACK": {
|
"SLACK": {
|
||||||
"FLAGGING_URL": "https://hooks.slack.com/services/id/id/id",
|
"FLAGGING_URL": "https://hooks.slack.com/services/id/id/id",
|
||||||
"FLAGGING_FOOTER_LINK": "https://habitrpg.github.io/flag-o-rama/"
|
"FLAGGING_FOOTER_LINK": "https://habitrpg.github.io/flag-o-rama/",
|
||||||
|
"SUBSCRIPTIONS_URL": "https://hooks.slack.com/services/id/id/id"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,11 +144,16 @@ api.checkout = {
|
|||||||
if (gift.type === 'subscription') method = 'createSubscription';
|
if (gift.type === 'subscription') method = 'createSubscription';
|
||||||
gift.member = await User.findById(gift ? gift.uuid : undefined);
|
gift.member = await User.findById(gift ? gift.uuid : undefined);
|
||||||
data.gift = gift;
|
data.gift = gift;
|
||||||
data.paymentMethod = 'Gift';
|
data.paymentMethod = 'Amazon';
|
||||||
}
|
}
|
||||||
|
|
||||||
await payments[method](data);
|
await payments[method](data);
|
||||||
|
|
||||||
|
if (gift && gift.type === 'subscription' && gift.member._id !== user._id) {
|
||||||
|
gift.member = user;
|
||||||
|
await payments.createSubscription(data);
|
||||||
|
}
|
||||||
|
|
||||||
res.respond(200);
|
res.respond(200);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -139,12 +139,16 @@ api.checkoutSuccess = {
|
|||||||
method = 'createSubscription';
|
method = 'createSubscription';
|
||||||
}
|
}
|
||||||
|
|
||||||
data.paymentMethod = 'Gift';
|
data.paymentMethod = 'PayPal';
|
||||||
data.gift = gift;
|
data.gift = gift;
|
||||||
}
|
}
|
||||||
|
|
||||||
await paypalPaymentExecute(paymentId, { payer_id: customerId });
|
await paypalPaymentExecute(paymentId, { payer_id: customerId });
|
||||||
await payments[method](data);
|
await payments[method](data);
|
||||||
|
if (gift && gift.type === 'subscription' && gift.member._id !== data.user._id) {
|
||||||
|
gift.member = data.user;
|
||||||
|
await payments.createSubscription(data);
|
||||||
|
}
|
||||||
res.redirect('/');
|
res.redirect('/');
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -105,10 +105,15 @@ api.checkout = {
|
|||||||
let member = await User.findById(gift.uuid);
|
let member = await User.findById(gift.uuid);
|
||||||
gift.member = member;
|
gift.member = member;
|
||||||
if (gift.type === 'subscription') method = 'createSubscription';
|
if (gift.type === 'subscription') method = 'createSubscription';
|
||||||
data.paymentMethod = 'Gift';
|
data.paymentMethod = 'Stripe';
|
||||||
}
|
}
|
||||||
|
|
||||||
await payments[method](data);
|
await payments[method](data);
|
||||||
|
|
||||||
|
if (gift && gift.type === 'subscription' && gift.member._id !== user._id) {
|
||||||
|
gift.member = user;
|
||||||
|
await payments.createSubscription(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res.respond(200, {});
|
res.respond(200, {});
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
NotAuthorized,
|
NotAuthorized,
|
||||||
NotFound,
|
NotFound,
|
||||||
} from './errors';
|
} from './errors';
|
||||||
|
import slack from './slack';
|
||||||
|
|
||||||
let api = {};
|
let api = {};
|
||||||
|
|
||||||
@@ -171,6 +172,21 @@ api.createSubscription = async function createSubscription (data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data.gift) await data.gift.member.save();
|
if (data.gift) await data.gift.member.save();
|
||||||
|
|
||||||
|
slack.sendSubscriptionNotification({
|
||||||
|
buyer: {
|
||||||
|
id: data.user._id,
|
||||||
|
name: data.user.profile.name,
|
||||||
|
email: getUserInfo(data.user, ['email']).email,
|
||||||
|
},
|
||||||
|
recipient: data.gift ? {
|
||||||
|
id: data.gift.member._id,
|
||||||
|
name: data.gift.member.profile.name,
|
||||||
|
email: getUserInfo(data.gift.member, ['email']).email,
|
||||||
|
} : {},
|
||||||
|
paymentMethod: data.paymentMethod,
|
||||||
|
months,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sets their subscription to be cancelled later
|
// Sets their subscription to be cancelled later
|
||||||
|
|||||||
@@ -6,12 +6,15 @@ import nconf from 'nconf';
|
|||||||
|
|
||||||
const SLACK_FLAGGING_URL = nconf.get('SLACK:FLAGGING_URL');
|
const SLACK_FLAGGING_URL = nconf.get('SLACK:FLAGGING_URL');
|
||||||
const SLACK_FLAGGING_FOOTER_LINK = nconf.get('SLACK:FLAGGING_FOOTER_LINK');
|
const SLACK_FLAGGING_FOOTER_LINK = nconf.get('SLACK:FLAGGING_FOOTER_LINK');
|
||||||
|
const SLACK_SUBSCRIPTIONS_URL = nconf.get('SLACK:SUBSCRIPTIONS_URL');
|
||||||
const BASE_URL = nconf.get('BASE_URL');
|
const BASE_URL = nconf.get('BASE_URL');
|
||||||
|
|
||||||
let flagSlack;
|
let flagSlack;
|
||||||
|
let subscriptionSlack;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
flagSlack = new IncomingWebhook(SLACK_FLAGGING_URL);
|
flagSlack = new IncomingWebhook(SLACK_FLAGGING_URL);
|
||||||
|
subscriptionSlack = new IncomingWebhook(SLACK_SUBSCRIPTIONS_URL);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
}
|
}
|
||||||
@@ -61,6 +64,31 @@ function sendFlagNotification ({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendSubscriptionNotification ({
|
||||||
|
buyer,
|
||||||
|
recipient,
|
||||||
|
paymentMethod,
|
||||||
|
months,
|
||||||
|
}) {
|
||||||
|
if (!SLACK_SUBSCRIPTIONS_URL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let text;
|
||||||
|
let timestamp = new Date();
|
||||||
|
if (!recipient.id) {
|
||||||
|
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a ${months}-month recurring subscription using ${paymentMethod} on ${timestamp}`;
|
||||||
|
} else if (recipient.id === buyer.id) {
|
||||||
|
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a ${months}-month gift subscription for ${recipient.name} ${recipient.id} ${recipient.email} using ${paymentMethod} on ${timestamp}`;
|
||||||
|
} else {
|
||||||
|
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a ${months}-month gift subscription for ${recipient.name} ${recipient.id} ${recipient.email} and got a promo using ${paymentMethod} on ${timestamp}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
subscriptionSlack.send({
|
||||||
|
text,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
sendFlagNotification,
|
sendFlagNotification,
|
||||||
|
sendSubscriptionNotification,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user