0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-04-08 02:52:39 -05:00

Handled members newsletter preference on signup (#14473)

refs https://github.com/TryGhost/Team/issues/1490

With multiple newsletters, members can choose their newsletter subscription preference in Portal while signing up. This change handles newsletter preference data for both free and paid members via magic link/stripe checkout and saves it for the newly created member.
This commit is contained in:
Rishabh Garg 2022-04-13 20:02:45 +05:30 committed by GitHub
parent 7a55e1a60a
commit c6da6afc9e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 111 additions and 16 deletions

View file

@ -83,12 +83,12 @@
"@tryghost/logging": "2.1.5",
"@tryghost/magic-link": "1.0.21",
"@tryghost/member-events": "0.4.1",
"@tryghost/members-api": "5.7.1",
"@tryghost/members-api": "5.8.0",
"@tryghost/members-events-service": "0.3.3",
"@tryghost/members-importer": "0.5.7",
"@tryghost/members-offers": "0.10.9",
"@tryghost/members-ssr": "1.0.23",
"@tryghost/members-stripe-service": "0.9.4",
"@tryghost/members-stripe-service": "0.10.0",
"@tryghost/metrics": "1.0.8",
"@tryghost/minifier": "0.1.12",
"@tryghost/mw-error-handler": "0.2.0",

View file

@ -44,6 +44,7 @@ describe('Members API', function () {
beforeEach(function () {
mockManager.mockLabsEnabled('multipleProducts');
mockManager.mockLabsEnabled('multipleNewsletters');
mockManager.mockMail();
mockManager.mockStripe();
});
@ -154,7 +155,7 @@ describe('Members API', function () {
const member = body.members[0];
return member;
}
it('Responds with a 401 when the signature is invalid', async function () {
await membersAgent.post('/webhooks/stripe/')
.body({
@ -503,7 +504,7 @@ describe('Members API', function () {
// Cancel the previously created subscription in Stripe
set(subscription, {
...subscription,
...subscription,
status: 'canceled'
});
@ -712,7 +713,7 @@ describe('Members API', function () {
// Cancel the previously created subscription in Stripe
set(subscription, {
...subscription,
...subscription,
status: 'canceled'
});
@ -811,7 +812,7 @@ describe('Members API', function () {
});
});
it('Will create a member if one does not exist', async function () {
it('Will create a member if one does not exist', async function () {
set(customer, {
id: 'cus_123',
name: 'Test Member',
@ -838,7 +839,7 @@ describe('Members API', function () {
}
}
});
const webhookSignature = stripe.webhooks.generateTestHeaderString({
payload: webhookPayload,
secret: process.env.WEBHOOK_SECRET
@ -901,6 +902,100 @@ describe('Members API', function () {
});
});
it('Will create a member with default newsletter subscriptions', async function () {
set(customer, {
id: 'cus_123',
name: 'Test Member',
email: 'checkout-newsletter-default-test@email.com',
subscriptions: {
type: 'list',
data: [subscription]
}
});
{ // ensure member didn't already exist
const {body} = await adminAgent.get('/members/?search=checkout-newsletter-default-test@email.com');
assert.equal(body.members.length, 0, 'A member already existed');
}
const webhookPayload = JSON.stringify({
type: 'checkout.session.completed',
data: {
object: {
mode: 'subscription',
customer: customer.id,
subscription: subscription.id,
metadata: {}
}
}
});
const webhookSignature = stripe.webhooks.generateTestHeaderString({
payload: webhookPayload,
secret: process.env.WEBHOOK_SECRET
});
await membersAgent.post('/webhooks/stripe/')
.body(webhookPayload)
.header('stripe-signature', webhookSignature);
const {body} = await adminAgent.get('/members/?search=checkout-newsletter-default-test@email.com');
assert.equal(body.members.length, 1, 'The member was not created');
const member = body.members[0];
assert.equal(member.status, 'paid', 'The member should be "paid"');
assert.equal(member.subscriptions.length, 1, 'The member should have a single subscription');
assert.equal(member.newsletters.length, 1, 'The member should have a single newsletter');
});
it('Will create a member with signup newsletter preference', async function () {
set(customer, {
id: 'cus_123',
name: 'Test Member',
email: 'checkout-newsletter-test@email.com',
subscriptions: {
type: 'list',
data: [subscription]
}
});
{ // ensure member didn't already exist
const {body} = await adminAgent.get('/members/?search=checkout-newsletter-test@email.com');
assert.equal(body.members.length, 0, 'A member already existed');
}
const webhookPayload = JSON.stringify({
type: 'checkout.session.completed',
data: {
object: {
mode: 'subscription',
customer: customer.id,
subscription: subscription.id,
metadata: {
newsletters: JSON.stringify([])
}
}
}
});
const webhookSignature = stripe.webhooks.generateTestHeaderString({
payload: webhookPayload,
secret: process.env.WEBHOOK_SECRET
});
await membersAgent.post('/webhooks/stripe/')
.body(webhookPayload)
.header('stripe-signature', webhookSignature);
const {body} = await adminAgent.get('/members/?search=checkout-newsletter-test@email.com');
assert.equal(body.members.length, 1, 'The member was not created');
const member = body.members[0];
assert.equal(member.status, 'paid', 'The member should be "paid"');
assert.equal(member.subscriptions.length, 1, 'The member should have a single subscription');
assert.equal(member.newsletters.length, 0, 'The member should not have any newsletter subscription');
});
it('Does not 500 if the member is unknown', async function () {
set(paymentMethod, {
id: 'card_456'

View file

@ -2009,10 +2009,10 @@
"@tryghost/domain-events" "^0.1.9"
"@tryghost/member-events" "^0.4.1"
"@tryghost/members-api@5.7.1":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-5.7.1.tgz#021db2c2092ad8320b93a76021761aa582c55f94"
integrity sha512-zYrm+eP2ttvR+oetlNY1qyJGatmzDtxEp+t5cPq6cIBJdoCKL2Nm8BI9mbo4JEEpRmobJn78tD+IlxrEXtWF9A==
"@tryghost/members-api@5.8.0":
version "5.8.0"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-5.8.0.tgz#c34871adcc4410f7eb10b99c8efb858f123eec15"
integrity sha512-xoL10Q0hOkRJVfxViRSf8YSdqTOEEdmFGwT3BS791wEZz2DGMjKxz7eLfDZJq7n6oFbKtAmEBcjFH7RLvYAjPQ==
dependencies:
"@nexes/nql" "^0.6.0"
"@tryghost/debug" "^0.1.2"
@ -2024,7 +2024,7 @@
"@tryghost/member-events" "^0.4.1"
"@tryghost/members-analytics-ingress" "^0.1.12"
"@tryghost/members-payments" "^0.1.11"
"@tryghost/members-stripe-service" "^0.9.4"
"@tryghost/members-stripe-service" "^0.10.0"
"@tryghost/tpl" "^0.1.2"
"@types/jsonwebtoken" "^8.5.1"
bluebird "^3.5.4"
@ -2096,10 +2096,10 @@
jsonwebtoken "^8.5.1"
lodash "^4.17.11"
"@tryghost/members-stripe-service@0.9.4", "@tryghost/members-stripe-service@^0.9.4":
version "0.9.4"
resolved "https://registry.yarnpkg.com/@tryghost/members-stripe-service/-/members-stripe-service-0.9.4.tgz#2e07cfa31dddba1d2bdde2d6b7449bc2c4bc6118"
integrity sha512-22e7IlNx3D49YK4bdi3wknQ0Tz1nW9zqpq4MIlbLYjGeC8zBR1v1LSMG7NyQR8chErgp8u51xnC6YyQgDd9iAw==
"@tryghost/members-stripe-service@0.10.0", "@tryghost/members-stripe-service@^0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@tryghost/members-stripe-service/-/members-stripe-service-0.10.0.tgz#e63b672fbb9f30a34ee2be7feb1452a16ae44734"
integrity sha512-ViXwAORs5RF15Q+17zUJw16khppnTF3UtcRgiNX8NXNozFYuIHGLd3A9nKbBgZyPGxEOcBF8u/qBZ1apjEVT2g==
dependencies:
"@tryghost/debug" "^0.1.4"
"@tryghost/domain-events" "^0.1.9"