From d092bd006856e75d689d17edde57d8b12b4b823d Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 7 Nov 2022 10:08:23 +0100 Subject: [PATCH 1/5] German email template for rejected contributions. --- .../src/mailer/text/contributionRejected.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 backend/src/mailer/text/contributionRejected.ts diff --git a/backend/src/mailer/text/contributionRejected.ts b/backend/src/mailer/text/contributionRejected.ts new file mode 100644 index 000000000..a101e7a25 --- /dev/null +++ b/backend/src/mailer/text/contributionRejected.ts @@ -0,0 +1,27 @@ +import Decimal from 'decimal.js-light' + +export const contributionRejected = { + de: { + subject: 'Schöpfung wurde abgelehnt', + text: (data: { + senderFirstName: string + senderLastName: string + recipientFirstName: string + recipientLastName: string + contributionMemo: string + contributionAmount: Decimal + overviewURL: string + }): string => + `Hallo ${data.recipientFirstName} ${data.recipientLastName}, + +Dein eingereichter Gemeinwohl-Beitrag "${data.contributionMemo}" wurde soeben von ${data.senderFirstName} ${data.senderLastName} abgelehnt. + +Bitte antworte nicht auf diese E-Mail! + +Mit freundlichen Grüßen, +dein Gradido-Team + + +Link zu deinem Konto: ${data.overviewURL}`, + }, +} From 0192a453468c1d8e18e8adc196b51c108e95a8d5 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 7 Nov 2022 10:09:49 +0100 Subject: [PATCH 2/5] Build and send email for rejected contributions. --- .../mailer/sendContributionRejectedEmail.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 backend/src/mailer/sendContributionRejectedEmail.ts diff --git a/backend/src/mailer/sendContributionRejectedEmail.ts b/backend/src/mailer/sendContributionRejectedEmail.ts new file mode 100644 index 000000000..9edb5ba2a --- /dev/null +++ b/backend/src/mailer/sendContributionRejectedEmail.ts @@ -0,0 +1,26 @@ +import { backendLogger as logger } from '@/server/logger' +import Decimal from 'decimal.js-light' +import { sendEMail } from './sendEMail' +import { contributionRejected } from './text/contributionRejected' + +export const sendContributionRejectedEmail = (data: { + senderFirstName: string + senderLastName: string + recipientFirstName: string + recipientLastName: string + recipientEmail: string + contributionMemo: string + contributionAmount: Decimal + overviewURL: string +}): Promise => { + logger.info( + `sendEmail(): to=${data.recipientFirstName} ${data.recipientLastName} <${data.recipientEmail}>, + subject=${contributionRejected.de.subject}, + text=${contributionRejected.de.text(data)}`, + ) + return sendEMail({ + to: `${data.recipientFirstName} ${data.recipientLastName} <${data.recipientEmail}>`, + subject: contributionRejected.de.subject, + text: contributionRejected.de.text(data), + }) +} From 225119c8ab1833f005a49e03e9d9ab518b5b572e Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 7 Nov 2022 10:10:28 +0100 Subject: [PATCH 3/5] Test that the email is build correctly. --- .../sendContributionRejectedEmail.test.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 backend/src/mailer/sendContributionRejectedEmail.test.ts diff --git a/backend/src/mailer/sendContributionRejectedEmail.test.ts b/backend/src/mailer/sendContributionRejectedEmail.test.ts new file mode 100644 index 000000000..fb044692b --- /dev/null +++ b/backend/src/mailer/sendContributionRejectedEmail.test.ts @@ -0,0 +1,38 @@ +import Decimal from 'decimal.js-light' +import { sendContributionRejectedEmail } from './sendContributionRejectedEmail' +import { sendEMail } from './sendEMail' + +jest.mock('./sendEMail', () => { + return { + __esModule: true, + sendEMail: jest.fn(), + } +}) + +describe('sendContributionConfirmedEmail', () => { + beforeEach(async () => { + await sendContributionRejectedEmail({ + senderFirstName: 'Peter', + senderLastName: 'Lustig', + recipientFirstName: 'Bibi', + recipientLastName: 'Bloxberg', + recipientEmail: 'bibi@bloxberg.de', + contributionMemo: 'Vielen herzlichen Dank für den neuen Hexenbesen!', + contributionAmount: new Decimal(200.0), + overviewURL: 'http://localhost/overview', + }) + }) + + it('calls sendEMail', () => { + expect(sendEMail).toBeCalledWith({ + to: 'Bibi Bloxberg ', + subject: 'Schöpfung wurde abgelehnt', + text: + expect.stringContaining('Hallo Bibi Bloxberg') && + expect.stringContaining( + 'Dein Gradido Schöpfungsantrag "Vielen herzlichen Dank für den neuen Hexenbesen!" wurde soeben von Peter Lustig abgelehnt.', + ) && + expect.stringContaining('Link zu deinem Konto: http://localhost/overview'), + }) + }) +}) From c2fc4feb6a9439ce4f2601287bca2042ad8bb477 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 7 Nov 2022 10:11:14 +0100 Subject: [PATCH 4/5] Call method to send Email if contribution is rejected. --- backend/src/graphql/resolver/AdminResolver.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index aab84e911..837eb5b3d 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -63,6 +63,7 @@ import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { ContributionMessageType } from '@enum/MessageType' import { ContributionMessage } from '@model/ContributionMessage' import { sendContributionConfirmedEmail } from '@/mailer/sendContributionConfirmedEmail' +import { sendContributionRejectedEmail } from '@/mailer/sendContributionRejectedEmail' import { sendAddedContributionMessageEmail } from '@/mailer/sendAddedContributionMessageEmail' import { eventProtocol } from '@/event/EventProtocolEmitter' import { @@ -455,6 +456,10 @@ export class AdminResolver { ) { throw new Error('Own contribution can not be deleted as admin') } + const user = await dbUser.findOneOrFail( + { id: contribution.userId }, + { relations: ['emailContact'] }, + ) contribution.contributionStatus = ContributionStatus.DELETED contribution.deletedBy = moderator.id await contribution.save() @@ -468,6 +473,18 @@ export class AdminResolver { await eventProtocol.writeEvent( event.setEventAdminContributionDelete(eventAdminContributionDelete), ) + // TODO: Send email + // const user = contribution.user + sendContributionRejectedEmail({ + senderFirstName: moderator.firstName, + senderLastName: moderator.lastName, + recipientEmail: user.emailContact.email, + recipientFirstName: user.firstName, + recipientLastName: user.lastName, + contributionMemo: contribution.memo, + contributionAmount: contribution.amount, + overviewURL: CONFIG.EMAIL_LINK_OVERVIEW, + }) return !!res } From 7d26669f99b6275c1ccd9bd29f43c1a1e3a47bbe Mon Sep 17 00:00:00 2001 From: Hannes Heine Date: Wed, 9 Nov 2022 09:28:07 +0100 Subject: [PATCH 5/5] Update backend/src/graphql/resolver/AdminResolver.ts Co-authored-by: Ulf Gebhardt --- backend/src/graphql/resolver/AdminResolver.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 837eb5b3d..479d020ea 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -473,8 +473,6 @@ export class AdminResolver { await eventProtocol.writeEvent( event.setEventAdminContributionDelete(eventAdminContributionDelete), ) - // TODO: Send email - // const user = contribution.user sendContributionRejectedEmail({ senderFirstName: moderator.firstName, senderLastName: moderator.lastName,