-
Notifications
You must be signed in to change notification settings - Fork 14
/
ses.provider.ts
95 lines (88 loc) · 2.71 KB
/
ses.provider.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import {inject, Provider} from '@loopback/core';
import {HttpErrors} from '@loopback/rest';
import {SES} from 'aws-sdk';
import {NotificationBindings} from '../../../keys';
import {INotificationConfig} from '../../../types';
import {SESBindings} from './keys';
import {SESMessage, SESNotification} from './types';
export class SesProvider implements Provider<SESNotification> {
constructor(
@inject(NotificationBindings.Config, {
optional: true,
})
private readonly config?: INotificationConfig,
@inject(SESBindings.Config, {
optional: true,
})
private readonly sesConfig?: SES.Types.ClientConfiguration,
) {
if (this.sesConfig) {
this.sesService = new SES(this.sesConfig);
} else {
throw new HttpErrors.PreconditionFailed('AWS SES Config missing !');
}
}
sesService: SES;
value() {
return {
publish: async (message: SESMessage) => {
const fromEmail =
message.options?.fromEmail ?? this.config?.senderEmail;
if (!fromEmail) {
throw new HttpErrors.BadRequest(
'Message sender not found in request',
);
}
if (message.receiver.to.length === 0) {
throw new HttpErrors.BadRequest(
'Message receiver not found in request',
);
}
if (!message.subject || !message.body) {
throw new HttpErrors.BadRequest('Message data incomplete');
}
if (this.config?.sendToMultipleReceivers) {
const receivers = message.receiver.to.map(receiver => receiver.id);
const emailReq: SES.SendEmailRequest = {
Source: fromEmail ?? '',
Destination: {
ToAddresses: receivers,
},
Message: {
Subject: {
Data: message.subject ?? '',
},
Body: {
Html: {
Data: message.body || '',
},
},
},
};
await this.sesService.sendEmail(emailReq).promise();
} else {
const publishes = message.receiver.to.map(receiver => {
const emailReq: SES.SendEmailRequest = {
Source: fromEmail ?? '',
Destination: {
ToAddresses: [receiver.id],
},
Message: {
Subject: {
Data: message.subject ?? '',
},
Body: {
Html: {
Data: message.body || '',
},
},
},
};
return this.sesService.sendEmail(emailReq).promise();
});
await Promise.all(publishes);
}
},
};
}
}