@twin.org/messaging-service 0.0.3-next.5 → 0.9.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/entities/templateEntry.js +1 -1
- package/dist/es/entities/templateEntry.js.map +1 -1
- package/dist/es/messagingAdminService.js +5 -4
- package/dist/es/messagingAdminService.js.map +1 -1
- package/dist/es/messagingService.js +9 -9
- package/dist/es/messagingService.js.map +1 -1
- package/dist/es/models/IMessagingAdminServiceConfig.js.map +1 -1
- package/dist/es/schema.js +1 -1
- package/dist/es/schema.js.map +1 -1
- package/dist/types/entities/templateEntry.d.ts +1 -1
- package/dist/types/messagingAdminService.d.ts +4 -8
- package/dist/types/messagingService.d.ts +7 -7
- package/dist/types/models/IMessagingAdminServiceConfig.d.ts +1 -1
- package/dist/types/schema.d.ts +1 -1
- package/docs/changelog.md +46 -0
- package/docs/reference/classes/MessagingAdminService.md +4 -4
- package/docs/reference/classes/MessagingService.md +7 -7
- package/docs/reference/classes/TemplateEntry.md +1 -1
- package/docs/reference/functions/initSchema.md +1 -1
- package/docs/reference/interfaces/IMessagingAdminServiceConfig.md +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateEntry.js","sourceRoot":"","sources":["../../../src/entities/templateEntry.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;GAEG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACzB;;OAEG;IAEI,EAAE,CAAU;IAEnB;;OAEG;IAEI,KAAK,CAAU;IAEtB;;OAEG;IAEI,OAAO,CAAU;IAExB;;OAEG;IAEI,WAAW,CAAU;CAC5B,CAAA;AAnBO;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;yCAC3B;AAMZ;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;4CACP;AAMf;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;8CACL;AAMjB;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;;kDAC/D;AAvBhB,aAAa;IADzB,MAAM,EAAE;GACI,aAAa,CAwBzB","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { entity, property, SortDirection } from \"@twin.org/entity\";\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"templateEntry.js","sourceRoot":"","sources":["../../../src/entities/templateEntry.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;GAEG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACzB;;OAEG;IAEI,EAAE,CAAU;IAEnB;;OAEG;IAEI,KAAK,CAAU;IAEtB;;OAEG;IAEI,OAAO,CAAU;IAExB;;OAEG;IAEI,WAAW,CAAU;CAC5B,CAAA;AAnBO;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;yCAC3B;AAMZ;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;4CACP;AAMf;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;8CACL;AAMjB;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;;kDAC/D;AAvBhB,aAAa;IADzB,MAAM,EAAE;GACI,aAAa,CAwBzB","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { entity, property, SortDirection } from \"@twin.org/entity\";\n\n/**\n * Class defining a message template entry.\n */\n@entity()\nexport class TemplateEntry {\n\t/**\n\t * The id.\n\t */\n\t@property({ type: \"string\", isPrimary: true })\n\tpublic id!: string;\n\n\t/**\n\t * The title.\n\t */\n\t@property({ type: \"string\" })\n\tpublic title!: string;\n\n\t/**\n\t * The content.\n\t */\n\t@property({ type: \"string\" })\n\tpublic content!: string;\n\n\t/**\n\t * The timestamp of the template entry.\n\t */\n\t@property({ type: \"string\", format: \"date-time\", sortDirection: SortDirection.Descending })\n\tpublic dateCreated!: string;\n}\n"]}
|
|
@@ -4,7 +4,7 @@ import { GeneralError, Guards, Is } from "@twin.org/core";
|
|
|
4
4
|
import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
|
|
5
5
|
import { TemplateEntry } from "./entities/templateEntry.js";
|
|
6
6
|
/**
|
|
7
|
-
* Service for
|
|
7
|
+
* Service for managing message templates stored via entity storage.
|
|
8
8
|
*/
|
|
9
9
|
export class MessagingAdminService {
|
|
10
10
|
/**
|
|
@@ -13,6 +13,7 @@ export class MessagingAdminService {
|
|
|
13
13
|
static CLASS_NAME = "MessagingAdminService";
|
|
14
14
|
/**
|
|
15
15
|
* Default locale for the messaging service.
|
|
16
|
+
* @internal
|
|
16
17
|
*/
|
|
17
18
|
static _DEFAULT_LOCALE = "en";
|
|
18
19
|
/**
|
|
@@ -27,7 +28,7 @@ export class MessagingAdminService {
|
|
|
27
28
|
_defaultLocale;
|
|
28
29
|
/**
|
|
29
30
|
* Create a new instance of MessagingAdminService.
|
|
30
|
-
* @param options The options for the
|
|
31
|
+
* @param options The options for the service.
|
|
31
32
|
*/
|
|
32
33
|
constructor(options) {
|
|
33
34
|
this._entityStorageConnector = EntityStorageConnectorFactory.get(options?.templateEntryStorageConnectorType ?? "template-entry");
|
|
@@ -46,7 +47,7 @@ export class MessagingAdminService {
|
|
|
46
47
|
* @param locale The locale of the template.
|
|
47
48
|
* @param title The title of the template.
|
|
48
49
|
* @param content The content of the template.
|
|
49
|
-
* @returns
|
|
50
|
+
* @returns A promise that resolves when the template has been stored.
|
|
50
51
|
*/
|
|
51
52
|
async setTemplate(templateId, locale, title, content) {
|
|
52
53
|
Guards.stringValue(MessagingAdminService.CLASS_NAME, "templateId", templateId);
|
|
@@ -95,7 +96,7 @@ export class MessagingAdminService {
|
|
|
95
96
|
* Remove a template.
|
|
96
97
|
* @param templateId The id of the template.
|
|
97
98
|
* @param locale The locale of the template.
|
|
98
|
-
* @returns
|
|
99
|
+
* @returns A promise that resolves when the template has been removed.
|
|
99
100
|
*/
|
|
100
101
|
async removeTemplate(templateId, locale) {
|
|
101
102
|
Guards.stringValue(MessagingAdminService.CLASS_NAME, "templateId", templateId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagingAdminService.js","sourceRoot":"","sources":["../../src/messagingAdminService.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACN,6BAA6B,EAE7B,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACjC;;OAEG;IACI,MAAM,CAAU,UAAU,2BAA2C;IAE5E
|
|
1
|
+
{"version":3,"file":"messagingAdminService.js","sourceRoot":"","sources":["../../src/messagingAdminService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError, Guards, Is } from \"@twin.org/core\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IMessagingAdminComponent } from \"@twin.org/messaging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { TemplateEntry } from \"./entities/templateEntry.js\";\nimport type { IMessagingAdminServiceConstructorOptions } from \"./models/IMessagingAdminServiceConstructorOptions.js\";\n\n/**\n * Service for managing message templates stored via entity storage.\n */\nexport class MessagingAdminService implements IMessagingAdminComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<MessagingAdminService>();\n\n\t/**\n\t * Default locale for the messaging service.\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_LOCALE: string = \"en\";\n\n\t/**\n\t * Entity storage connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _entityStorageConnector: IEntityStorageConnector<TemplateEntry>;\n\n\t/**\n\t * The default locale to use for the messaging service.\n\t * @internal\n\t */\n\tprivate readonly _defaultLocale: string;\n\n\t/**\n\t * Create a new instance of MessagingAdminService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IMessagingAdminServiceConstructorOptions) {\n\t\tthis._entityStorageConnector = EntityStorageConnectorFactory.get(\n\t\t\toptions?.templateEntryStorageConnectorType ?? \"template-entry\"\n\t\t);\n\n\t\tthis._defaultLocale = options?.config?.defaultLocale ?? MessagingAdminService._DEFAULT_LOCALE;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn MessagingAdminService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create or update a template.\n\t * @param templateId The id of the template.\n\t * @param locale The locale of the template.\n\t * @param title The title of the template.\n\t * @param content The content of the template.\n\t * @returns A promise that resolves when the template has been stored.\n\t */\n\tpublic async setTemplate(\n\t\ttemplateId: string,\n\t\tlocale: string,\n\t\ttitle: string,\n\t\tcontent: string\n\t): Promise<void> {\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(locale), locale);\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(title), title);\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(content), content);\n\n\t\tconst templateEntry = new TemplateEntry();\n\t\ttemplateEntry.id = `${templateId}:${locale}`;\n\t\ttemplateEntry.dateCreated = new Date(Date.now()).toISOString();\n\t\ttemplateEntry.title = title;\n\t\ttemplateEntry.content = content;\n\n\t\tawait this._entityStorageConnector.set(templateEntry);\n\t}\n\n\t/**\n\t * Get the email template by id and locale.\n\t * @param templateId The id of the email template.\n\t * @param locale The locale of the email template.\n\t * @returns The email template.\n\t */\n\tpublic async getTemplate(\n\t\ttemplateId: string,\n\t\tlocale: string\n\t): Promise<{ title: string; content: string }> {\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(locale), locale);\n\n\t\tlet templateEntry;\n\n\t\ttry {\n\t\t\t// First try to get the template for the requested locale\n\t\t\ttemplateEntry = await this._entityStorageConnector.get(`${templateId}:${locale}`);\n\t\t} catch {}\n\n\t\t// If the template is not found for the requested locale, try to get it for the default locale\n\t\t// only if the requested locale is different from the default locale\n\t\tif (Is.empty(templateEntry) && this._defaultLocale !== locale) {\n\t\t\ttry {\n\t\t\t\ttemplateEntry = await this._entityStorageConnector.get(\n\t\t\t\t\t`${templateId}:${this._defaultLocale}`\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t}\n\n\t\tif (Is.empty(templateEntry)) {\n\t\t\tthrow new GeneralError(MessagingAdminService.CLASS_NAME, \"getTemplateFailed\", {\n\t\t\t\ttemplateId,\n\t\t\t\tlocale\n\t\t\t});\n\t\t}\n\n\t\treturn templateEntry;\n\t}\n\n\t/**\n\t * Remove a template.\n\t * @param templateId The id of the template.\n\t * @param locale The locale of the template.\n\t * @returns A promise that resolves when the template has been removed.\n\t */\n\tpublic async removeTemplate(templateId: string, locale: string): Promise<void> {\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.stringValue(MessagingAdminService.CLASS_NAME, nameof(locale), locale);\n\n\t\treturn this._entityStorageConnector.remove(`${templateId}:${locale}`);\n\t}\n}\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { ComponentFactory, GeneralError, Guards, Is } from "@twin.org/core";
|
|
4
4
|
import { MessagingEmailConnectorFactory, MessagingPushNotificationsConnectorFactory, MessagingSmsConnectorFactory } from "@twin.org/messaging-models";
|
|
5
5
|
/**
|
|
6
|
-
* Service for
|
|
6
|
+
* Service for dispatching messages via configured email, push notification, and SMS connectors.
|
|
7
7
|
*/
|
|
8
8
|
export class MessagingService {
|
|
9
9
|
/**
|
|
@@ -32,7 +32,7 @@ export class MessagingService {
|
|
|
32
32
|
_messagingAdminComponent;
|
|
33
33
|
/**
|
|
34
34
|
* Create a new instance of MessagingService.
|
|
35
|
-
* @param options The options for the
|
|
35
|
+
* @param options The options for the service.
|
|
36
36
|
*/
|
|
37
37
|
constructor(options) {
|
|
38
38
|
if (Is.stringValue(options?.messagingEmailConnectorType)) {
|
|
@@ -60,7 +60,7 @@ export class MessagingService {
|
|
|
60
60
|
* @param templateId The id of the email template.
|
|
61
61
|
* @param data The data to populate the email template.
|
|
62
62
|
* @param locale The locale of the email template.
|
|
63
|
-
* @returns
|
|
63
|
+
* @returns True if the email was sent successfully.
|
|
64
64
|
*/
|
|
65
65
|
async sendCustomEmail(sender, recipients, templateId, data, locale) {
|
|
66
66
|
if (Is.empty(this._emailMessagingConnector)) {
|
|
@@ -76,10 +76,10 @@ export class MessagingService {
|
|
|
76
76
|
return this._emailMessagingConnector.sendCustomEmail(sender, recipients, populatedTemplate.title, populatedTemplate.content);
|
|
77
77
|
}
|
|
78
78
|
/**
|
|
79
|
-
* Registers a device to
|
|
79
|
+
* Registers a device to a specific application in order to send notifications to it.
|
|
80
80
|
* @param applicationId The application address.
|
|
81
81
|
* @param deviceToken The device token.
|
|
82
|
-
* @returns
|
|
82
|
+
* @returns The address assigned to the registered device.
|
|
83
83
|
*/
|
|
84
84
|
async registerDevice(applicationId, deviceToken) {
|
|
85
85
|
if (Is.empty(this._pushNotificationMessagingConnector)) {
|
|
@@ -95,7 +95,7 @@ export class MessagingService {
|
|
|
95
95
|
* @param templateId The id of the push notification template.
|
|
96
96
|
* @param data The data to populate the push notification template.
|
|
97
97
|
* @param locale The locale of the push notification template.
|
|
98
|
-
* @returns
|
|
98
|
+
* @returns True if the notification was sent successfully.
|
|
99
99
|
*/
|
|
100
100
|
async sendSinglePushNotification(deviceAddress, templateId, data, locale) {
|
|
101
101
|
if (Is.empty(this._pushNotificationMessagingConnector)) {
|
|
@@ -115,7 +115,7 @@ export class MessagingService {
|
|
|
115
115
|
* @param templateId The id of the SMS template.
|
|
116
116
|
* @param data The data to populate the SMS template.
|
|
117
117
|
* @param locale The locale of the SMS template.
|
|
118
|
-
* @returns
|
|
118
|
+
* @returns True if the SMS was sent successfully.
|
|
119
119
|
*/
|
|
120
120
|
async sendSMS(phoneNumber, templateId, data, locale) {
|
|
121
121
|
if (Is.empty(this._smsMessagingConnector)) {
|
|
@@ -130,13 +130,13 @@ export class MessagingService {
|
|
|
130
130
|
return this._smsMessagingConnector.sendSMS(phoneNumber, populatedTemplate.content);
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
|
-
*
|
|
133
|
+
* Populates a template by replacing placeholders with the provided data values.
|
|
134
134
|
* @param template The template.
|
|
135
135
|
* @param template.title The title of the template.
|
|
136
136
|
* @param template.content The content of the template.
|
|
137
137
|
* @param data The data to populate the template.
|
|
138
|
+
* @returns The template with all placeholders replaced.
|
|
138
139
|
* @internal
|
|
139
|
-
* @returns The populated template.
|
|
140
140
|
*/
|
|
141
141
|
populateTemplate(template, data) {
|
|
142
142
|
let populatedTitle = template.title;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagingService.js","sourceRoot":"","sources":["../../src/messagingService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { ComponentFactory, GeneralError, Guards, Is } from \"@twin.org/core\";\nimport {\n\ttype IMessagingAdminComponent,\n\tMessagingEmailConnectorFactory,\n\tMessagingPushNotificationsConnectorFactory,\n\tMessagingSmsConnectorFactory,\n\ttype IMessagingComponent,\n\ttype IMessagingEmailConnector,\n\ttype IMessagingPushNotificationsConnector,\n\ttype IMessagingSmsConnector\n} from \"@twin.org/messaging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IMessagingServiceConstructorOptions } from \"./models/IMessagingServiceConstructorOptions.js\";\n\n/**\n * Service for performing email messaging operations to a connector.\n */\nexport class MessagingService implements IMessagingComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<MessagingService>();\n\n\t/**\n\t * Emails messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _emailMessagingConnector?: IMessagingEmailConnector;\n\n\t/**\n\t * Push notifications messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _pushNotificationMessagingConnector?: IMessagingPushNotificationsConnector;\n\n\t/**\n\t * SMS messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _smsMessagingConnector?: IMessagingSmsConnector;\n\n\t/**\n\t * The admin component for the messaging.\n\t * @internal\n\t */\n\tprivate readonly _messagingAdminComponent: IMessagingAdminComponent;\n\n\t/**\n\t * Create a new instance of MessagingService.\n\t * @param options The options for the connector.\n\t */\n\tconstructor(options?: IMessagingServiceConstructorOptions) {\n\t\tif (Is.stringValue(options?.messagingEmailConnectorType)) {\n\t\t\tthis._emailMessagingConnector = MessagingEmailConnectorFactory.get(\n\t\t\t\toptions.messagingEmailConnectorType\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(options?.messagingPushNotificationConnectorType)) {\n\t\t\tthis._pushNotificationMessagingConnector = MessagingPushNotificationsConnectorFactory.get(\n\t\t\t\toptions.messagingPushNotificationConnectorType\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(options?.messagingSmsConnectorType)) {\n\t\t\tthis._smsMessagingConnector = MessagingSmsConnectorFactory.get(\n\t\t\t\toptions.messagingSmsConnectorType\n\t\t\t);\n\t\t}\n\n\t\tthis._messagingAdminComponent = ComponentFactory.get(\n\t\t\toptions?.messagingAdminComponentType ?? \"messaging-admin\"\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn MessagingService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Send a custom email.\n\t * @param sender The sender email address.\n\t * @param recipients An array of recipients email addresses.\n\t * @param templateId The id of the email template.\n\t * @param data The data to populate the email template.\n\t * @param locale The locale of the email template.\n\t * @returns If the email was sent successfully.\n\t */\n\tpublic async sendCustomEmail(\n\t\tsender: string,\n\t\trecipients: string[],\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._emailMessagingConnector)) {\n\t\t\tthrow new GeneralError(MessagingService.CLASS_NAME, \"notConfiguredEmailMessagingConnector\");\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(sender), sender);\n\t\tGuards.arrayValue(MessagingService.CLASS_NAME, nameof(recipients), recipients);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._emailMessagingConnector.sendCustomEmail(\n\t\t\tsender,\n\t\t\trecipients,\n\t\t\tpopulatedTemplate.title,\n\t\t\tpopulatedTemplate.content\n\t\t);\n\t}\n\n\t/**\n\t * Registers a device to an specific app in order to send notifications to it.\n\t * @param applicationId The application address.\n\t * @param deviceToken The device token.\n\t * @returns If the device was registered successfully.\n\t */\n\tpublic async registerDevice(applicationId: string, deviceToken: string): Promise<string> {\n\t\tif (Is.empty(this._pushNotificationMessagingConnector)) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tMessagingService.CLASS_NAME,\n\t\t\t\t\"notConfiguredPushNotificationMessagingConnector\"\n\t\t\t);\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(applicationId), applicationId);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(deviceToken), deviceToken);\n\n\t\treturn this._pushNotificationMessagingConnector.registerDevice(applicationId, deviceToken);\n\t}\n\n\t/**\n\t * Send a push notification to a device.\n\t * @param deviceAddress The address of the device.\n\t * @param templateId The id of the push notification template.\n\t * @param data The data to populate the push notification template.\n\t * @param locale The locale of the push notification template.\n\t * @returns If the notification was sent successfully.\n\t */\n\tpublic async sendSinglePushNotification(\n\t\tdeviceAddress: string,\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._pushNotificationMessagingConnector)) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tMessagingService.CLASS_NAME,\n\t\t\t\t\"notConfiguredPushNotificationMessagingConnector\"\n\t\t\t);\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(deviceAddress), deviceAddress);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._pushNotificationMessagingConnector.sendSinglePushNotification(\n\t\t\tdeviceAddress,\n\t\t\tpopulatedTemplate.title,\n\t\t\tpopulatedTemplate.content\n\t\t);\n\t}\n\n\t/**\n\t * Send a SMS message to a phone number.\n\t * @param phoneNumber The recipient phone number.\n\t * @param templateId The id of the SMS template.\n\t * @param data The data to populate the SMS template.\n\t * @param locale The locale of the SMS template.\n\t * @returns If the SMS was sent successfully.\n\t */\n\tpublic async sendSMS(\n\t\tphoneNumber: string,\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._smsMessagingConnector)) {\n\t\t\tthrow new GeneralError(MessagingService.CLASS_NAME, \"notConfiguredSmsMessagingConnector\");\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(phoneNumber), phoneNumber);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._smsMessagingConnector.sendSMS(phoneNumber, populatedTemplate.content);\n\t}\n\n\t/**\n\t * Populate the template with data.\n\t * @param template The template.\n\t * @param template.title The title of the template.\n\t * @param template.content The content of the template.\n\t * @param data The data to populate the template.\n\t * @internal\n\t * @returns The populated template.\n\t */\n\tprivate populateTemplate(\n\t\ttemplate: { title: string; content: string },\n\t\tdata: { [key: string]: string }\n\t): { title: string; content: string } {\n\t\tlet populatedTitle = template.title;\n\t\tlet populatedContent = template.content;\n\n\t\tfor (const key in data) {\n\t\t\tconst value = data[key];\n\t\t\tconst placeholder = `{{${key}}}`;\n\t\t\tpopulatedTitle = populatedTitle.replace(new RegExp(placeholder, \"g\"), value);\n\t\t\tpopulatedContent = populatedContent.replace(new RegExp(placeholder, \"g\"), value);\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: populatedTitle,\n\t\t\tcontent: populatedContent\n\t\t};\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"messagingService.js","sourceRoot":"","sources":["../../src/messagingService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { ComponentFactory, GeneralError, Guards, Is } from \"@twin.org/core\";\nimport {\n\ttype IMessagingAdminComponent,\n\tMessagingEmailConnectorFactory,\n\tMessagingPushNotificationsConnectorFactory,\n\tMessagingSmsConnectorFactory,\n\ttype IMessagingComponent,\n\ttype IMessagingEmailConnector,\n\ttype IMessagingPushNotificationsConnector,\n\ttype IMessagingSmsConnector\n} from \"@twin.org/messaging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IMessagingServiceConstructorOptions } from \"./models/IMessagingServiceConstructorOptions.js\";\n\n/**\n * Service for dispatching messages via configured email, push notification, and SMS connectors.\n */\nexport class MessagingService implements IMessagingComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<MessagingService>();\n\n\t/**\n\t * Emails messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _emailMessagingConnector?: IMessagingEmailConnector;\n\n\t/**\n\t * Push notifications messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _pushNotificationMessagingConnector?: IMessagingPushNotificationsConnector;\n\n\t/**\n\t * SMS messaging connector used by the service.\n\t * @internal\n\t */\n\tprivate readonly _smsMessagingConnector?: IMessagingSmsConnector;\n\n\t/**\n\t * The admin component for the messaging.\n\t * @internal\n\t */\n\tprivate readonly _messagingAdminComponent: IMessagingAdminComponent;\n\n\t/**\n\t * Create a new instance of MessagingService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IMessagingServiceConstructorOptions) {\n\t\tif (Is.stringValue(options?.messagingEmailConnectorType)) {\n\t\t\tthis._emailMessagingConnector = MessagingEmailConnectorFactory.get(\n\t\t\t\toptions.messagingEmailConnectorType\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(options?.messagingPushNotificationConnectorType)) {\n\t\t\tthis._pushNotificationMessagingConnector = MessagingPushNotificationsConnectorFactory.get(\n\t\t\t\toptions.messagingPushNotificationConnectorType\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(options?.messagingSmsConnectorType)) {\n\t\t\tthis._smsMessagingConnector = MessagingSmsConnectorFactory.get(\n\t\t\t\toptions.messagingSmsConnectorType\n\t\t\t);\n\t\t}\n\n\t\tthis._messagingAdminComponent = ComponentFactory.get(\n\t\t\toptions?.messagingAdminComponentType ?? \"messaging-admin\"\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn MessagingService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Send a custom email.\n\t * @param sender The sender email address.\n\t * @param recipients An array of recipients email addresses.\n\t * @param templateId The id of the email template.\n\t * @param data The data to populate the email template.\n\t * @param locale The locale of the email template.\n\t * @returns True if the email was sent successfully.\n\t */\n\tpublic async sendCustomEmail(\n\t\tsender: string,\n\t\trecipients: string[],\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._emailMessagingConnector)) {\n\t\t\tthrow new GeneralError(MessagingService.CLASS_NAME, \"notConfiguredEmailMessagingConnector\");\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(sender), sender);\n\t\tGuards.arrayValue(MessagingService.CLASS_NAME, nameof(recipients), recipients);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._emailMessagingConnector.sendCustomEmail(\n\t\t\tsender,\n\t\t\trecipients,\n\t\t\tpopulatedTemplate.title,\n\t\t\tpopulatedTemplate.content\n\t\t);\n\t}\n\n\t/**\n\t * Registers a device to a specific application in order to send notifications to it.\n\t * @param applicationId The application address.\n\t * @param deviceToken The device token.\n\t * @returns The address assigned to the registered device.\n\t */\n\tpublic async registerDevice(applicationId: string, deviceToken: string): Promise<string> {\n\t\tif (Is.empty(this._pushNotificationMessagingConnector)) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tMessagingService.CLASS_NAME,\n\t\t\t\t\"notConfiguredPushNotificationMessagingConnector\"\n\t\t\t);\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(applicationId), applicationId);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(deviceToken), deviceToken);\n\n\t\treturn this._pushNotificationMessagingConnector.registerDevice(applicationId, deviceToken);\n\t}\n\n\t/**\n\t * Send a push notification to a device.\n\t * @param deviceAddress The address of the device.\n\t * @param templateId The id of the push notification template.\n\t * @param data The data to populate the push notification template.\n\t * @param locale The locale of the push notification template.\n\t * @returns True if the notification was sent successfully.\n\t */\n\tpublic async sendSinglePushNotification(\n\t\tdeviceAddress: string,\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._pushNotificationMessagingConnector)) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tMessagingService.CLASS_NAME,\n\t\t\t\t\"notConfiguredPushNotificationMessagingConnector\"\n\t\t\t);\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(deviceAddress), deviceAddress);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._pushNotificationMessagingConnector.sendSinglePushNotification(\n\t\t\tdeviceAddress,\n\t\t\tpopulatedTemplate.title,\n\t\t\tpopulatedTemplate.content\n\t\t);\n\t}\n\n\t/**\n\t * Send a SMS message to a phone number.\n\t * @param phoneNumber The recipient phone number.\n\t * @param templateId The id of the SMS template.\n\t * @param data The data to populate the SMS template.\n\t * @param locale The locale of the SMS template.\n\t * @returns True if the SMS was sent successfully.\n\t */\n\tpublic async sendSMS(\n\t\tphoneNumber: string,\n\t\ttemplateId: string,\n\t\tdata: { [key: string]: string },\n\t\tlocale: string\n\t): Promise<boolean> {\n\t\tif (Is.empty(this._smsMessagingConnector)) {\n\t\t\tthrow new GeneralError(MessagingService.CLASS_NAME, \"notConfiguredSmsMessagingConnector\");\n\t\t}\n\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(phoneNumber), phoneNumber);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(templateId), templateId);\n\t\tGuards.object(MessagingService.CLASS_NAME, nameof(data), data);\n\t\tGuards.stringValue(MessagingService.CLASS_NAME, nameof(locale), locale);\n\n\t\tconst template = await this._messagingAdminComponent.getTemplate(templateId, locale);\n\t\tconst populatedTemplate = this.populateTemplate(template, data);\n\n\t\treturn this._smsMessagingConnector.sendSMS(phoneNumber, populatedTemplate.content);\n\t}\n\n\t/**\n\t * Populates a template by replacing placeholders with the provided data values.\n\t * @param template The template.\n\t * @param template.title The title of the template.\n\t * @param template.content The content of the template.\n\t * @param data The data to populate the template.\n\t * @returns The template with all placeholders replaced.\n\t * @internal\n\t */\n\tprivate populateTemplate(\n\t\ttemplate: { title: string; content: string },\n\t\tdata: { [key: string]: string }\n\t): { title: string; content: string } {\n\t\tlet populatedTitle = template.title;\n\t\tlet populatedContent = template.content;\n\n\t\tfor (const key in data) {\n\t\t\tconst value = data[key];\n\t\t\tconst placeholder = `{{${key}}}`;\n\t\t\tpopulatedTitle = populatedTitle.replace(new RegExp(placeholder, \"g\"), value);\n\t\t\tpopulatedContent = populatedContent.replace(new RegExp(placeholder, \"g\"), value);\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: populatedTitle,\n\t\t\tcontent: populatedContent\n\t\t};\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IMessagingAdminServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IMessagingAdminServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"IMessagingAdminServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IMessagingAdminServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the messaging admin service.\n */\nexport interface IMessagingAdminServiceConfig {\n\t/**\n\t * The default locale to use for the messaging service.\n\t * @default en\n\t */\n\tdefaultLocale?: string;\n}\n"]}
|
package/dist/es/schema.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { EntitySchemaFactory, EntitySchemaHelper } from "@twin.org/entity";
|
|
4
4
|
import { TemplateEntry } from "./entities/templateEntry.js";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Registers entity schemas required by the messaging service.
|
|
7
7
|
*/
|
|
8
8
|
export function initSchema() {
|
|
9
9
|
EntitySchemaFactory.register("TemplateEntry", () => EntitySchemaHelper.getSchema(TemplateEntry));
|
package/dist/es/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,UAAU;IACzB,mBAAmB,CAAC,QAAQ,kBAA0B,GAAG,EAAE,CAC1D,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC,CAC3C,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { EntitySchemaFactory, EntitySchemaHelper } from \"@twin.org/entity\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { TemplateEntry } from \"./entities/templateEntry.js\";\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,UAAU;IACzB,mBAAmB,CAAC,QAAQ,kBAA0B,GAAG,EAAE,CAC1D,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC,CAC3C,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { EntitySchemaFactory, EntitySchemaHelper } from \"@twin.org/entity\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { TemplateEntry } from \"./entities/templateEntry.js\";\n\n/**\n * Registers entity schemas required by the messaging service.\n */\nexport function initSchema(): void {\n\tEntitySchemaFactory.register(nameof<TemplateEntry>(), () =>\n\t\tEntitySchemaHelper.getSchema(TemplateEntry)\n\t);\n}\n"]}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import type { IMessagingAdminComponent } from "@twin.org/messaging-models";
|
|
2
2
|
import type { IMessagingAdminServiceConstructorOptions } from "./models/IMessagingAdminServiceConstructorOptions.js";
|
|
3
3
|
/**
|
|
4
|
-
* Service for
|
|
4
|
+
* Service for managing message templates stored via entity storage.
|
|
5
5
|
*/
|
|
6
6
|
export declare class MessagingAdminService implements IMessagingAdminComponent {
|
|
7
7
|
/**
|
|
8
8
|
* Runtime name for the class.
|
|
9
9
|
*/
|
|
10
10
|
static readonly CLASS_NAME: string;
|
|
11
|
-
/**
|
|
12
|
-
* Default locale for the messaging service.
|
|
13
|
-
*/
|
|
14
|
-
private static readonly _DEFAULT_LOCALE;
|
|
15
11
|
/**
|
|
16
12
|
* Create a new instance of MessagingAdminService.
|
|
17
|
-
* @param options The options for the
|
|
13
|
+
* @param options The options for the service.
|
|
18
14
|
*/
|
|
19
15
|
constructor(options?: IMessagingAdminServiceConstructorOptions);
|
|
20
16
|
/**
|
|
@@ -28,7 +24,7 @@ export declare class MessagingAdminService implements IMessagingAdminComponent {
|
|
|
28
24
|
* @param locale The locale of the template.
|
|
29
25
|
* @param title The title of the template.
|
|
30
26
|
* @param content The content of the template.
|
|
31
|
-
* @returns
|
|
27
|
+
* @returns A promise that resolves when the template has been stored.
|
|
32
28
|
*/
|
|
33
29
|
setTemplate(templateId: string, locale: string, title: string, content: string): Promise<void>;
|
|
34
30
|
/**
|
|
@@ -45,7 +41,7 @@ export declare class MessagingAdminService implements IMessagingAdminComponent {
|
|
|
45
41
|
* Remove a template.
|
|
46
42
|
* @param templateId The id of the template.
|
|
47
43
|
* @param locale The locale of the template.
|
|
48
|
-
* @returns
|
|
44
|
+
* @returns A promise that resolves when the template has been removed.
|
|
49
45
|
*/
|
|
50
46
|
removeTemplate(templateId: string, locale: string): Promise<void>;
|
|
51
47
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IMessagingComponent } from "@twin.org/messaging-models";
|
|
2
2
|
import type { IMessagingServiceConstructorOptions } from "./models/IMessagingServiceConstructorOptions.js";
|
|
3
3
|
/**
|
|
4
|
-
* Service for
|
|
4
|
+
* Service for dispatching messages via configured email, push notification, and SMS connectors.
|
|
5
5
|
*/
|
|
6
6
|
export declare class MessagingService implements IMessagingComponent {
|
|
7
7
|
/**
|
|
@@ -10,7 +10,7 @@ export declare class MessagingService implements IMessagingComponent {
|
|
|
10
10
|
static readonly CLASS_NAME: string;
|
|
11
11
|
/**
|
|
12
12
|
* Create a new instance of MessagingService.
|
|
13
|
-
* @param options The options for the
|
|
13
|
+
* @param options The options for the service.
|
|
14
14
|
*/
|
|
15
15
|
constructor(options?: IMessagingServiceConstructorOptions);
|
|
16
16
|
/**
|
|
@@ -25,16 +25,16 @@ export declare class MessagingService implements IMessagingComponent {
|
|
|
25
25
|
* @param templateId The id of the email template.
|
|
26
26
|
* @param data The data to populate the email template.
|
|
27
27
|
* @param locale The locale of the email template.
|
|
28
|
-
* @returns
|
|
28
|
+
* @returns True if the email was sent successfully.
|
|
29
29
|
*/
|
|
30
30
|
sendCustomEmail(sender: string, recipients: string[], templateId: string, data: {
|
|
31
31
|
[key: string]: string;
|
|
32
32
|
}, locale: string): Promise<boolean>;
|
|
33
33
|
/**
|
|
34
|
-
* Registers a device to
|
|
34
|
+
* Registers a device to a specific application in order to send notifications to it.
|
|
35
35
|
* @param applicationId The application address.
|
|
36
36
|
* @param deviceToken The device token.
|
|
37
|
-
* @returns
|
|
37
|
+
* @returns The address assigned to the registered device.
|
|
38
38
|
*/
|
|
39
39
|
registerDevice(applicationId: string, deviceToken: string): Promise<string>;
|
|
40
40
|
/**
|
|
@@ -43,7 +43,7 @@ export declare class MessagingService implements IMessagingComponent {
|
|
|
43
43
|
* @param templateId The id of the push notification template.
|
|
44
44
|
* @param data The data to populate the push notification template.
|
|
45
45
|
* @param locale The locale of the push notification template.
|
|
46
|
-
* @returns
|
|
46
|
+
* @returns True if the notification was sent successfully.
|
|
47
47
|
*/
|
|
48
48
|
sendSinglePushNotification(deviceAddress: string, templateId: string, data: {
|
|
49
49
|
[key: string]: string;
|
|
@@ -54,7 +54,7 @@ export declare class MessagingService implements IMessagingComponent {
|
|
|
54
54
|
* @param templateId The id of the SMS template.
|
|
55
55
|
* @param data The data to populate the SMS template.
|
|
56
56
|
* @param locale The locale of the SMS template.
|
|
57
|
-
* @returns
|
|
57
|
+
* @returns True if the SMS was sent successfully.
|
|
58
58
|
*/
|
|
59
59
|
sendSMS(phoneNumber: string, templateId: string, data: {
|
|
60
60
|
[key: string]: string;
|
package/dist/types/schema.d.ts
CHANGED
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.9.0-next.1](https://github.com/iotaledger/twin-messaging/compare/messaging-service-v0.9.0-next.0...messaging-service-v0.9.0-next.1) (2026-06-23)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add context id features ([#24](https://github.com/iotaledger/twin-messaging/issues/24)) ([42b94e8](https://github.com/iotaledger/twin-messaging/commit/42b94e8be32c86db6afc5ccf5e9ff2c93d15d05d))
|
|
9
|
+
* add initial templates config ([66b40eb](https://github.com/iotaledger/twin-messaging/commit/66b40eb57a478d9f79de540eb847a4fb37894235))
|
|
10
|
+
* add messaging admin component ([cbaaca3](https://github.com/iotaledger/twin-messaging/commit/cbaaca34db6a9f5c51438c201535b4b43a1aea1f))
|
|
11
|
+
* add validate-locales ([5eeff9b](https://github.com/iotaledger/twin-messaging/commit/5eeff9b9bf6cecf93b249b56c4bb74b4c5bf86c9))
|
|
12
|
+
* eslint migration to flat config ([faa02ec](https://github.com/iotaledger/twin-messaging/commit/faa02ec0ef450db88b08e938415e40cf13625d15))
|
|
13
|
+
* Messaging services ([#3](https://github.com/iotaledger/twin-messaging/issues/3)) ([32571b5](https://github.com/iotaledger/twin-messaging/commit/32571b5abf5d3fc3b168074c23507e926c5d00b0))
|
|
14
|
+
* remove unused namespace ([2201898](https://github.com/iotaledger/twin-messaging/commit/22018988b84e4b3e76da1a1e16f29bfde7e6f0e6))
|
|
15
|
+
* typescript 6 update ([0aabd3e](https://github.com/iotaledger/twin-messaging/commit/0aabd3e05fbdf1cbc5df34cf24c461a75abc9d7e))
|
|
16
|
+
* update dependencies ([eda66c5](https://github.com/iotaledger/twin-messaging/commit/eda66c5c670f36f1ba86a8f768e4781b629c88ff))
|
|
17
|
+
* update dependencies ([53dcde6](https://github.com/iotaledger/twin-messaging/commit/53dcde60d6efaee5957296f6d097cb97c0fb2f9d))
|
|
18
|
+
* update framework core ([fc476b4](https://github.com/iotaledger/twin-messaging/commit/fc476b48e6075de0ae871e3cec1fa179aa04b5eb))
|
|
19
|
+
* use shared store mechanism ([#8](https://github.com/iotaledger/twin-messaging/issues/8)) ([9ad65c2](https://github.com/iotaledger/twin-messaging/commit/9ad65c239ba77bb75604a1f6e51b975357f3228d))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* Adding format to the MessagingEntries ts number ([8b99d4f](https://github.com/iotaledger/twin-messaging/commit/8b99d4f01c4f2b08da8d2affc1b9554fcb0d3690))
|
|
25
|
+
* use async getStore in tests ([bd00e17](https://github.com/iotaledger/twin-messaging/commit/bd00e17218c1954bbb3a740e5628756764fa2598))
|
|
26
|
+
* use async getStore in tests ([50057a6](https://github.com/iotaledger/twin-messaging/commit/50057a6ae962623aaa2ab778ea29c08b6f885452))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Dependencies
|
|
30
|
+
|
|
31
|
+
* The following workspace dependencies were updated
|
|
32
|
+
* dependencies
|
|
33
|
+
* @twin.org/messaging-models bumped from 0.9.0-next.0 to 0.9.0-next.1
|
|
34
|
+
|
|
35
|
+
## [0.0.3-next.6](https://github.com/iotaledger/twin-messaging/compare/messaging-service-v0.0.3-next.5...messaging-service-v0.0.3-next.6) (2026-06-11)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Miscellaneous Chores
|
|
39
|
+
|
|
40
|
+
* **messaging-service:** Synchronize repo versions
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
### Dependencies
|
|
44
|
+
|
|
45
|
+
* The following workspace dependencies were updated
|
|
46
|
+
* dependencies
|
|
47
|
+
* @twin.org/messaging-models bumped from 0.0.3-next.5 to 0.0.3-next.6
|
|
48
|
+
|
|
3
49
|
## [0.0.3-next.5](https://github.com/iotaledger/twin-messaging/compare/messaging-service-v0.0.3-next.4...messaging-service-v0.0.3-next.5) (2026-05-20)
|
|
4
50
|
|
|
5
51
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Class: MessagingAdminService
|
|
2
2
|
|
|
3
|
-
Service for
|
|
3
|
+
Service for managing message templates stored via entity storage.
|
|
4
4
|
|
|
5
5
|
## Implements
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ Create a new instance of MessagingAdminService.
|
|
|
20
20
|
|
|
21
21
|
[`IMessagingAdminServiceConstructorOptions`](../interfaces/IMessagingAdminServiceConstructorOptions.md)
|
|
22
22
|
|
|
23
|
-
The options for the
|
|
23
|
+
The options for the service.
|
|
24
24
|
|
|
25
25
|
#### Returns
|
|
26
26
|
|
|
@@ -90,7 +90,7 @@ The content of the template.
|
|
|
90
90
|
|
|
91
91
|
`Promise`\<`void`\>
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
A promise that resolves when the template has been stored.
|
|
94
94
|
|
|
95
95
|
#### Implementation of
|
|
96
96
|
|
|
@@ -154,7 +154,7 @@ The locale of the template.
|
|
|
154
154
|
|
|
155
155
|
`Promise`\<`void`\>
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
A promise that resolves when the template has been removed.
|
|
158
158
|
|
|
159
159
|
#### Implementation of
|
|
160
160
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Class: MessagingService
|
|
2
2
|
|
|
3
|
-
Service for
|
|
3
|
+
Service for dispatching messages via configured email, push notification, and SMS connectors.
|
|
4
4
|
|
|
5
5
|
## Implements
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ Create a new instance of MessagingService.
|
|
|
20
20
|
|
|
21
21
|
[`IMessagingServiceConstructorOptions`](../interfaces/IMessagingServiceConstructorOptions.md)
|
|
22
22
|
|
|
23
|
-
The options for the
|
|
23
|
+
The options for the service.
|
|
24
24
|
|
|
25
25
|
#### Returns
|
|
26
26
|
|
|
@@ -94,7 +94,7 @@ The locale of the email template.
|
|
|
94
94
|
|
|
95
95
|
`Promise`\<`boolean`\>
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
True if the email was sent successfully.
|
|
98
98
|
|
|
99
99
|
#### Implementation of
|
|
100
100
|
|
|
@@ -106,7 +106,7 @@ If the email was sent successfully.
|
|
|
106
106
|
|
|
107
107
|
> **registerDevice**(`applicationId`, `deviceToken`): `Promise`\<`string`\>
|
|
108
108
|
|
|
109
|
-
Registers a device to
|
|
109
|
+
Registers a device to a specific application in order to send notifications to it.
|
|
110
110
|
|
|
111
111
|
#### Parameters
|
|
112
112
|
|
|
@@ -126,7 +126,7 @@ The device token.
|
|
|
126
126
|
|
|
127
127
|
`Promise`\<`string`\>
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
The address assigned to the registered device.
|
|
130
130
|
|
|
131
131
|
#### Implementation of
|
|
132
132
|
|
|
@@ -168,7 +168,7 @@ The locale of the push notification template.
|
|
|
168
168
|
|
|
169
169
|
`Promise`\<`boolean`\>
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
True if the notification was sent successfully.
|
|
172
172
|
|
|
173
173
|
#### Implementation of
|
|
174
174
|
|
|
@@ -210,7 +210,7 @@ The locale of the SMS template.
|
|
|
210
210
|
|
|
211
211
|
`Promise`\<`boolean`\>
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
True if the SMS was sent successfully.
|
|
214
214
|
|
|
215
215
|
#### Implementation of
|
|
216
216
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/messaging-service",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.9.0-next.1",
|
|
4
4
|
"description": "Implements the messaging service layer that orchestrates delivery workflows across connectors.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/iotaledger/messaging.git",
|
|
7
|
+
"url": "git+https://github.com/iotaledger/twin-messaging.git",
|
|
8
8
|
"directory": "packages/messaging-service"
|
|
9
9
|
},
|
|
10
10
|
"author": "adrian.sanchez.sequeira@iota.org",
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
"node": ">=20.0.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@twin.org/core": "next",
|
|
18
|
-
"@twin.org/entity": "next",
|
|
19
|
-
"@twin.org/entity-storage-models": "next",
|
|
20
|
-
"@twin.org/logging-models": "next",
|
|
21
|
-
"@twin.org/messaging-models": "0.0
|
|
22
|
-
"@twin.org/nameof": "next"
|
|
17
|
+
"@twin.org/core": "0.9.0-next.1",
|
|
18
|
+
"@twin.org/entity": "0.9.0-next.1",
|
|
19
|
+
"@twin.org/entity-storage-models": "0.9.0-next.1",
|
|
20
|
+
"@twin.org/logging-models": "0.9.0-next.1",
|
|
21
|
+
"@twin.org/messaging-models": "0.9.0-next.1",
|
|
22
|
+
"@twin.org/nameof": "0.9.0-next.1"
|
|
23
23
|
},
|
|
24
24
|
"main": "./dist/es/index.js",
|
|
25
25
|
"types": "./dist/types/index.d.ts",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"business-logic"
|
|
49
49
|
],
|
|
50
50
|
"bugs": {
|
|
51
|
-
"url": "git+https://github.com/iotaledger/messaging/issues"
|
|
51
|
+
"url": "git+https://github.com/iotaledger/twin-messaging/issues"
|
|
52
52
|
},
|
|
53
53
|
"homepage": "https://twindev.org"
|
|
54
54
|
}
|