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:
parent
7a55e1a60a
commit
c6da6afc9e
3 changed files with 111 additions and 16 deletions
|
@ -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",
|
||||
|
|
|
@ -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'
|
||||
|
|
18
yarn.lock
18
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue