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

🐛 Fixed table constraint error when updating member's email with an already existing email (#12178)

closes #12045

- When member's email is updated to an already existing email of different member it caused table's unique constraint error, which was not handled properly. 
- Added handling for this error similar to one in members `add` method.
This commit is contained in:
Talha 2020-09-10 09:33:57 +05:30 committed by GitHub
parent 453bc2c491
commit afa976066a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 17 deletions

View file

@ -242,7 +242,9 @@ module.exports = {
if (error.code && error.message.toLowerCase().indexOf('unique') !== -1) {
throw new errors.ValidationError({
message: i18n.t('errors.models.member.memberAlreadyExists.message'),
context: i18n.t('errors.models.member.memberAlreadyExists.context')
context: i18n.t('errors.models.member.memberAlreadyExists.context', {
action: 'add'
})
});
}
@ -282,24 +284,37 @@ module.exports = {
},
permissions: true,
async query(frame) {
frame.options.withRelated = ['stripeSubscriptions'];
const member = await membersService.api.members.update(frame.data.members[0], frame.options);
try {
frame.options.withRelated = ['stripeSubscriptions'];
const member = await membersService.api.members.update(frame.data.members[0], frame.options);
const hasCompedSubscription = !!member.related('stripeSubscriptions').find(subscription => subscription.get('plan_nickname') === 'Complimentary');
const hasCompedSubscription = !!member.related('stripeSubscriptions').find(subscription => subscription.get('plan_nickname') === 'Complimentary');
if (typeof frame.data.members[0].comped === 'boolean') {
if (frame.data.members[0].comped && !hasCompedSubscription) {
await membersService.api.members.setComplimentarySubscription(member);
} else if (!(frame.data.members[0].comped) && hasCompedSubscription) {
await membersService.api.members.cancelComplimentarySubscription(member);
if (typeof frame.data.members[0].comped === 'boolean') {
if (frame.data.members[0].comped && !hasCompedSubscription) {
await membersService.api.members.setComplimentarySubscription(member);
} else if (!(frame.data.members[0].comped) && hasCompedSubscription) {
await membersService.api.members.cancelComplimentarySubscription(member);
}
await member.load(['stripeSubscriptions']);
}
await member.load(['stripeSubscriptions']);
await member.load(['stripeSubscriptions.customer']);
return member.toJSON(frame.options);
} catch (error) {
if (error.code && error.message.toLowerCase().indexOf('unique') !== -1) {
throw new errors.ValidationError({
message: i18n.t('errors.models.member.memberAlreadyExists.message'),
context: i18n.t('errors.models.member.memberAlreadyExists.context', {
action: 'edit'
})
});
}
throw error;
}
await member.load(['stripeSubscriptions.customer']);
return member.toJSON(frame.options);
}
},

View file

@ -55,7 +55,9 @@ const doImport = async ({members, labels, importSetLabels, createdBy}) => {
if (error.code === 'ER_DUP_ENTRY') {
return new errors.ValidationError({
message: i18n.t('errors.models.member.memberAlreadyExists.message'),
context: i18n.t('errors.models.member.memberAlreadyExists.context'),
context: i18n.t('errors.models.member.memberAlreadyExists.context', {
action: 'add'
}),
err: error
});
} else {

View file

@ -250,7 +250,7 @@
"member": {
"memberAlreadyExists": {
"message": "Member already exists",
"context": "Attempting to add member with existing email address."
"context": "Attempting to {action} member with existing email address."
}
},
"member_stripe_customer": {

View file

@ -494,7 +494,7 @@ describe('Members API', function () {
});
});
it('Fails to import memmber duplicate emails', function () {
it('Fails to import member duplicate emails', function () {
return request
.post(localUtils.API.getApiQuery(`members/upload/`))
.attach('membersfile', path.join(__dirname, '/../../../../utils/fixtures/csv/members-duplicate-emails.csv'))