@acmekit/notification 2.13.37 → 2.13.39
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/index.d.ts.map +1 -1
- package/dist/index.js +33 -5
- package/dist/index.js.map +1 -1
- package/dist/services/notification-provider.d.ts +2 -2
- package/dist/services/notification-provider.d.ts.map +1 -1
- package/dist/services/notification-provider.js +2 -34
- package/dist/services/notification-provider.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/sync-database-providers.d.ts +14 -0
- package/dist/utils/sync-database-providers.d.ts.map +1 -0
- package/dist/utils/sync-database-providers.js +63 -0
- package/dist/utils/sync-database-providers.js.map +1 -0
- package/package.json +4 -4
- package/dist/loaders/providers.d.ts +0 -5
- package/dist/loaders/providers.d.ts.map +0 -1
- package/dist/loaders/providers.js +0 -106
- package/dist/loaders/providers.js.map +0 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAA;AAChB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAA;AAChB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;;;;AAWrD,wBAiCE"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
require("./types");
|
|
7
4
|
const _services_1 = require("./services");
|
|
8
|
-
const providers_1 = __importDefault(require("./loaders/providers"));
|
|
9
5
|
const utils_1 = require("@acmekit/framework/utils");
|
|
6
|
+
const modules_sdk_1 = require("@acmekit/framework/modules-sdk");
|
|
7
|
+
const _types_1 = require("./types");
|
|
8
|
+
const acmekit_cloud_email_1 = require("./providers/acmekit-cloud-email");
|
|
9
|
+
const sync_database_providers_1 = require("./utils/sync-database-providers");
|
|
10
10
|
exports.default = (0, utils_1.Module)(utils_1.Modules.NOTIFICATION, {
|
|
11
11
|
service: _services_1.NotificationModuleService,
|
|
12
|
-
loaders: [
|
|
12
|
+
loaders: [
|
|
13
|
+
(0, modules_sdk_1.createProvidersLoader)({
|
|
14
|
+
prefix: _types_1.NotificationProviderRegistrationPrefix,
|
|
15
|
+
identifiersKey: _types_1.NotificationIdentifiersRegistrationName,
|
|
16
|
+
defaults: [
|
|
17
|
+
{
|
|
18
|
+
service: acmekit_cloud_email_1.AcmeKitCloudEmailNotificationProvider,
|
|
19
|
+
id: "cloud",
|
|
20
|
+
options: (opts) => ({
|
|
21
|
+
...(opts.cloud ?? {}),
|
|
22
|
+
channels: ["email"],
|
|
23
|
+
}),
|
|
24
|
+
condition: (opts) => {
|
|
25
|
+
const typedOpts = opts;
|
|
26
|
+
const hasEmailProvider = typedOpts?.providers?.some((provider) => provider.options?.channels?.some((channel) => channel === "email"));
|
|
27
|
+
if (hasEmailProvider)
|
|
28
|
+
return false;
|
|
29
|
+
const c = typedOpts?.cloud;
|
|
30
|
+
if (!c)
|
|
31
|
+
return false;
|
|
32
|
+
if (!c.environment_handle && !c.sandbox_handle)
|
|
33
|
+
return false;
|
|
34
|
+
return !!(c.api_key && c.endpoint);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
onRegistered: sync_database_providers_1.syncDatabaseProviders,
|
|
39
|
+
}),
|
|
40
|
+
],
|
|
13
41
|
});
|
|
14
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,mBAAgB;AAChB,yCAAqD;AACrD,oDAA0D;AAC1D,gEAAsE;AACtE,mCAIe;AACf,yEAAuF;AACvF,6EAAuE;AAEvE,kBAAe,IAAA,cAAM,EAAC,eAAO,CAAC,YAAY,EAAE;IAC1C,OAAO,EAAE,qCAAyB;IAClC,OAAO,EAAE;QACP,IAAA,mCAAqB,EAAC;YACpB,MAAM,EAAE,+CAAsC;YAC9C,cAAc,EAAE,gDAAuC;YACvD,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,2DAAqC;oBAC9C,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,CAAC,IAA6B,EAAE,EAAE,CAAC,CAAC;wBAC3C,GAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA6B;wBAClD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB,CAAC;oBACF,SAAS,EAAE,CAAC,IAA6B,EAAE,EAAE;wBAC3C,MAAM,SAAS,GAAG,IAAiC,CAAA;wBACnD,MAAM,gBAAgB,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/D,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAC9B,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,KAAK,OAAO,CACzC,CACF,CAAA;wBACD,IAAI,gBAAgB;4BAAE,OAAO,KAAK,CAAA;wBAElC,MAAM,CAAC,GAAG,SAAS,EAAE,KAAK,CAAA;wBAC1B,IAAI,CAAC,CAAC;4BAAE,OAAO,KAAK,CAAA;wBACpB,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC,cAAc;4BAAE,OAAO,KAAK,CAAA;wBAC5D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;oBACpC,CAAC;iBACF;aACF;YACD,YAAY,EAAE,+CAAqB;SACpC,CAAC;KACH;CACF,CAAC,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DAL, InferEntityType, Logger, NotificationTypes } from "@acmekit/framework/types";
|
|
2
|
-
import { ModulesSdkUtils } from "@acmekit/framework/utils";
|
|
2
|
+
import { ModulesSdkUtils, ProviderRegistry } from "@acmekit/framework/utils";
|
|
3
3
|
import { NotificationProvider } from "../models";
|
|
4
4
|
import { NotificationProviderRegistrationPrefix } from "../types";
|
|
5
5
|
type InjectedDependencies = {
|
|
@@ -13,8 +13,8 @@ declare const NotificationProviderService_base: {
|
|
|
13
13
|
setEventSubscriber(subscriber: ModulesSdkUtils.AcmeKitMikroOrmEventSubscriber): void;
|
|
14
14
|
};
|
|
15
15
|
export default class NotificationProviderService extends NotificationProviderService_base {
|
|
16
|
-
#private;
|
|
17
16
|
protected readonly notificationProviderRepository_: DAL.RepositoryService<InferEntityType<typeof NotificationProvider>>;
|
|
17
|
+
protected providers: ProviderRegistry<NotificationTypes.INotificationProvider>;
|
|
18
18
|
protected providersCache: Map<string, InferEntityType<typeof NotificationProvider>>;
|
|
19
19
|
constructor(container: InjectedDependencies);
|
|
20
20
|
protected retrieveProviderRegistration(providerId: string): NotificationTypes.INotificationProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-provider.d.ts","sourceRoot":"","sources":["../../src/services/notification-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,eAAe,EACf,MAAM,EACN,iBAAiB,EAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"notification-provider.d.ts","sourceRoot":"","sources":["../../src/services/notification-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,eAAe,EACf,MAAM,EACN,iBAAiB,EAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAEL,sCAAsC,EACvC,MAAM,QAAQ,CAAA;AAEf,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B,EAAE,GAAG,CAAC,iBAAiB,CACnD,eAAe,CAAC,OAAO,oBAAoB,CAAC,CAC7C,CAAA;IACD,CACE,GAAG,EAAE,GAAG,OAAO,sCAAsC,GAAG,MAAM,EAAE,GAC/D,iBAAiB,CAAC,qBAAqB,CAAA;CAC3C,CAAA;AAED,KAAK,QAAQ,GAAG,eAAe,CAAC,OAAO,oBAAoB,CAAC,CAAA;;;;;AAE5D,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,gCAGlC;IACrB,SAAS,CAAC,QAAQ,CAAC,+BAA+B,EAAE,GAAG,CAAC,iBAAiB,CACvE,eAAe,CAAC,OAAO,oBAAoB,CAAC,CAC7C,CAAA;IAED,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAA;IAE9E,SAAS,CAAC,cAAc,EAAE,GAAG,CAC3B,MAAM,EACN,eAAe,CAAC,OAAO,oBAAoB,CAAC,CAC7C,CAAA;gBAEW,SAAS,EAAE,oBAAoB;IAY3C,SAAS,CAAC,4BAA4B,CACpC,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,qBAAqB;IAIpC,sBAAsB,CAC1B,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,EAC5B,OAAO,GAAG,QAAQ,SAAS,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS,EACvE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBjC,IAAI,CACR,QAAQ,EAAE,eAAe,CAAC,OAAO,oBAAoB,CAAC,EACtD,YAAY,EAAE,iBAAiB,CAAC,2BAA2B,GAC1D,OAAO,CAAC,iBAAiB,CAAC,kCAAkC,CAAC;CAIjE"}
|
|
@@ -1,16 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _NotificationProviderService_logger;
|
|
14
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
3
|
const utils_1 = require("@acmekit/framework/utils");
|
|
16
4
|
const _models_1 = require("../models");
|
|
@@ -18,31 +6,12 @@ const _types_1 = require("../types");
|
|
|
18
6
|
class NotificationProviderService extends utils_1.ModulesSdkUtils.AcmeKitInternalService(_models_1.NotificationProvider) {
|
|
19
7
|
constructor(container) {
|
|
20
8
|
super(container);
|
|
21
|
-
|
|
22
|
-
_NotificationProviderService_logger.set(this, void 0);
|
|
9
|
+
this.providers = new utils_1.ProviderRegistry(this.__container__, _types_1.NotificationProviderRegistrationPrefix, _types_1.NotificationIdentifiersRegistrationName, "notification");
|
|
23
10
|
this.notificationProviderRepository_ =
|
|
24
11
|
container.notificationProviderRepository;
|
|
25
|
-
__classPrivateFieldSet(this, _NotificationProviderService_logger, container["logger"]
|
|
26
|
-
? container.logger
|
|
27
|
-
: console, "f");
|
|
28
12
|
}
|
|
29
13
|
retrieveProviderRegistration(providerId) {
|
|
30
|
-
|
|
31
|
-
return this.__container__[`${_types_1.NotificationProviderRegistrationPrefix}${providerId}`];
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
if (err.name === "AwilixResolutionError") {
|
|
35
|
-
const errMessage = `
|
|
36
|
-
Unable to retrieve the notification provider with id: ${providerId}
|
|
37
|
-
Please make sure that the provider is registered in the container and it is configured correctly in your project configuration file.`;
|
|
38
|
-
// Log full error for debugging
|
|
39
|
-
__classPrivateFieldGet(this, _NotificationProviderService_logger, "f").error(`AwilixResolutionError: ${err.message}`, err);
|
|
40
|
-
throw new Error(errMessage);
|
|
41
|
-
}
|
|
42
|
-
const errMessage = `Unable to retrieve the notification provider with id: ${providerId}, the following error occurred: ${err.message}`;
|
|
43
|
-
__classPrivateFieldGet(this, _NotificationProviderService_logger, "f").error(errMessage);
|
|
44
|
-
throw new Error(errMessage);
|
|
45
|
-
}
|
|
14
|
+
return this.providers.resolve(providerId);
|
|
46
15
|
}
|
|
47
16
|
async getProviderForChannels(channels) {
|
|
48
17
|
if (!this.providersCache) {
|
|
@@ -62,6 +31,5 @@ Please make sure that the provider is registered in the container and it is conf
|
|
|
62
31
|
return await providerHandler.send(notification);
|
|
63
32
|
}
|
|
64
33
|
}
|
|
65
|
-
_NotificationProviderService_logger = new WeakMap();
|
|
66
34
|
exports.default = NotificationProviderService;
|
|
67
35
|
//# sourceMappingURL=notification-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-provider.js","sourceRoot":"","sources":["../../src/services/notification-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notification-provider.js","sourceRoot":"","sources":["../../src/services/notification-provider.ts"],"names":[],"mappings":";;AAMA,oDAGiC;AACjC,qCAA8C;AAC9C,mCAGe;AAcf,MAAqB,2BAA4B,SAAQ,uBAAe,CAAC,sBAAsB,CAG7F,8BAAoB,CAAC;IAYrB,YAAY,SAA+B;QACzC,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAgB,CACnC,IAAI,CAAC,aAAwC,EAC7C,+CAAsC,EACtC,gDAAuC,EACvC,cAAc,CACf,CAAA;QACD,IAAI,CAAC,+BAA+B;YAClC,SAAS,CAAC,8BAA8B,CAAA;IAC5C,CAAC;IAES,4BAA4B,CACpC,UAAkB;QAElB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,sBAAsB,CAG1B,QAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC;gBAChE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;aAC5B,CAAC,CAAA;YAEF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAC3B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7B,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAC5C,CACF,CAAA;QACH,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC1E,MAAM,OAAO,GAAG,kBAAkB;aAC/B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aAClD,MAAM,CAAC,OAAO,CAAC,CAAA;QAElB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAY,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAsD,EACtD,YAA2D;QAE3D,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACtE,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACjD,CAAC;CACF;AAhED,8CAgEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts","../src/
|
|
1
|
+
{"root":["../src/index.ts","../src/migrations/migration20240509083918_initialsetupmigration.ts","../src/migrations/migration20240628075401.ts","../src/migrations/migration20240830094712.ts","../src/migrations/migration20250120110514.ts","../src/migrations/migration20251028172715.ts","../src/migrations/migration20251121123942.ts","../src/migrations/migration20251121150408.ts","../src/models/index.ts","../src/models/notification-provider.ts","../src/models/notification.ts","../src/providers/acmekit-cloud-email.ts","../src/services/index.ts","../src/services/notification-module-service.ts","../src/services/notification-provider.ts","../src/types/index.ts","../src/utils/sync-database-providers.ts"],"version":"5.9.3"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AcmeKitContainer, ModuleProvider } from "@acmekit/framework/types";
|
|
2
|
+
/**
|
|
3
|
+
* Post-registration hook for syncing providers to the database.
|
|
4
|
+
* Called by createProvidersLoader's onRegistered.
|
|
5
|
+
*/
|
|
6
|
+
export declare function syncDatabaseProviders({ container, providers: userProviders, registeredDefaults, }: {
|
|
7
|
+
container: AcmeKitContainer;
|
|
8
|
+
providers: ModuleProvider[];
|
|
9
|
+
registeredDefaults: Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
options: Record<string, unknown>;
|
|
12
|
+
}>;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=sync-database-providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-database-providers.d.ts","sourceRoot":"","sources":["../../src/utils/sync-database-providers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,cAAc,EAEf,MAAM,0BAA0B,CAAA;AASjC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,SAAS,EACT,SAAS,EAAE,aAAa,EACxB,kBAAkB,GACnB,EAAE;IACD,SAAS,EAAE,gBAAgB,CAAA;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAC5E,iBA+DA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncDatabaseProviders = syncDatabaseProviders;
|
|
4
|
+
const utils_1 = require("@acmekit/framework/utils");
|
|
5
|
+
const _services_1 = require("../services");
|
|
6
|
+
/**
|
|
7
|
+
* Post-registration hook for syncing providers to the database.
|
|
8
|
+
* Called by createProvidersLoader's onRegistered.
|
|
9
|
+
*/
|
|
10
|
+
async function syncDatabaseProviders({ container, providers: userProviders, registeredDefaults, }) {
|
|
11
|
+
// Build the full providers list: user providers + registered defaults
|
|
12
|
+
const allProviders = [
|
|
13
|
+
...userProviders.filter((p) => p.id).map((p) => ({
|
|
14
|
+
id: p.id,
|
|
15
|
+
channels: p.options?.channels ?? [],
|
|
16
|
+
})),
|
|
17
|
+
...registeredDefaults.map((d) => ({
|
|
18
|
+
id: d.id,
|
|
19
|
+
channels: d.options?.channels ?? [],
|
|
20
|
+
})),
|
|
21
|
+
];
|
|
22
|
+
const normalizedProviders = allProviders.map((provider) => ({
|
|
23
|
+
id: provider.id,
|
|
24
|
+
handle: provider.id,
|
|
25
|
+
name: provider.id,
|
|
26
|
+
is_enabled: true,
|
|
27
|
+
channels: provider.channels,
|
|
28
|
+
}));
|
|
29
|
+
validateProviders(normalizedProviders);
|
|
30
|
+
const providerServiceRegistrationKey = (0, utils_1.lowerCaseFirst)(_services_1.NotificationProviderService.name);
|
|
31
|
+
const providerService = container.resolve(providerServiceRegistrationKey);
|
|
32
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER) ?? console;
|
|
33
|
+
try {
|
|
34
|
+
const providersInDb = await providerService.list({});
|
|
35
|
+
const providersToDisable = providersInDb.filter((dbProvider) => !normalizedProviders.some((normalizedProvider) => normalizedProvider.id === dbProvider.id));
|
|
36
|
+
const promises = [];
|
|
37
|
+
if (normalizedProviders.length) {
|
|
38
|
+
promises.push(providerService.upsert(normalizedProviders));
|
|
39
|
+
}
|
|
40
|
+
if (providersToDisable.length) {
|
|
41
|
+
promises.push(providerService.update(providersToDisable.map((p) => ({
|
|
42
|
+
id: p.id,
|
|
43
|
+
is_enabled: false,
|
|
44
|
+
}))));
|
|
45
|
+
}
|
|
46
|
+
await (0, utils_1.promiseAll)(promises);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logger.error(`Error syncing the notification providers: ${error.message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function validateProviders(providers) {
|
|
53
|
+
const hasForChannel = {};
|
|
54
|
+
providers.forEach((provider) => {
|
|
55
|
+
provider.channels.forEach((channel) => {
|
|
56
|
+
if (hasForChannel[channel]) {
|
|
57
|
+
throw new Error(`Multiple providers are configured for the same channel: ${channel}`);
|
|
58
|
+
}
|
|
59
|
+
hasForChannel[channel] = true;
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=sync-database-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-database-providers.js","sourceRoot":"","sources":["../../src/utils/sync-database-providers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acmekit/notification",
|
|
3
|
-
"version": "2.13.
|
|
3
|
+
"version": "2.13.39",
|
|
4
4
|
"description": "AcmeKit Notification module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"orm:cache:clear": "MIKRO_ORM_CLI_CONFIG=./mikro-orm.config.dev.ts MIKRO_ORM_ALLOW_GLOBAL_CLI=true acmekit-mikro-orm cache:clear"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@acmekit/framework": "2.13.
|
|
40
|
-
"@acmekit/test-utils": "2.13.
|
|
39
|
+
"@acmekit/framework": "2.13.39",
|
|
40
|
+
"@acmekit/test-utils": "2.13.39"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@acmekit/framework": "2.13.
|
|
43
|
+
"@acmekit/framework": "2.13.39"
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { LoaderOptions, ModulesSdkTypes } from "@acmekit/framework/types";
|
|
2
|
-
import { NotificationModuleOptions } from "../types";
|
|
3
|
-
declare const _default: ({ container, options, }: LoaderOptions<(ModulesSdkTypes.ModuleServiceInitializeOptions | ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions) & NotificationModuleOptions>) => Promise<void>;
|
|
4
|
-
export default _default;
|
|
5
|
-
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/loaders/providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAQzE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,QAAQ,CAAA;yBAkCO,yBAGnB,aAAa,CACd,CACI,eAAe,CAAC,8BAA8B,GAC9C,eAAe,CAAC,6CAA6C,CAChE,GACC,yBAAyB,CAC5B,KAAG,OAAO,CAAC,IAAI,CAAC;AATjB,wBAgDC"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const awilix_1 = require("@acmekit/framework/awilix");
|
|
4
|
-
const modules_sdk_1 = require("@acmekit/framework/modules-sdk");
|
|
5
|
-
const utils_1 = require("@acmekit/framework/utils");
|
|
6
|
-
const _services_1 = require("../services");
|
|
7
|
-
const _types_1 = require("../types");
|
|
8
|
-
const acmekit_cloud_email_1 = require("../providers/acmekit-cloud-email");
|
|
9
|
-
const validateCloudOptions = (options) => {
|
|
10
|
-
const { api_key, endpoint, environment_handle, sandbox_handle } = options ?? {};
|
|
11
|
-
if (!environment_handle && !sandbox_handle) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
if (!api_key || !endpoint) {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
18
|
-
};
|
|
19
|
-
const registrationFn = async (klass, container, pluginOptions) => {
|
|
20
|
-
container.register({
|
|
21
|
-
[_types_1.NotificationProviderRegistrationPrefix + pluginOptions.id]: (0, awilix_1.asFunction)((cradle) => new klass(cradle, pluginOptions.options ?? {}), {
|
|
22
|
-
lifetime: klass.LIFE_TIME || awilix_1.Lifetime.SINGLETON,
|
|
23
|
-
}),
|
|
24
|
-
});
|
|
25
|
-
container.registerAdd(_types_1.NotificationIdentifiersRegistrationName, (0, awilix_1.asValue)(pluginOptions.id));
|
|
26
|
-
};
|
|
27
|
-
exports.default = async ({ container, options, }) => {
|
|
28
|
-
let providers = options?.providers || [];
|
|
29
|
-
// We add the AcmeKit Cloud Email provider if there is no other email provider configured
|
|
30
|
-
const hasEmailProvider = options?.providers?.some((provider) => provider.options?.channels?.some((channel) => channel === "email"));
|
|
31
|
-
if (!hasEmailProvider) {
|
|
32
|
-
const shouldRegisterAcmeKitCloudEmailProvider = validateCloudOptions(options?.cloud);
|
|
33
|
-
if (shouldRegisterAcmeKitCloudEmailProvider) {
|
|
34
|
-
await registrationFn(acmekit_cloud_email_1.AcmeKitCloudEmailNotificationProvider, container, {
|
|
35
|
-
options: options?.cloud,
|
|
36
|
-
id: "cloud",
|
|
37
|
-
});
|
|
38
|
-
const provider = {
|
|
39
|
-
id: "cloud",
|
|
40
|
-
resolve: "",
|
|
41
|
-
options: {
|
|
42
|
-
...options?.cloud,
|
|
43
|
-
channels: ["email"],
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
providers = [...providers, provider];
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
await (0, modules_sdk_1.moduleProviderLoader)({
|
|
50
|
-
container,
|
|
51
|
-
providers: options?.providers || [],
|
|
52
|
-
registerServiceFn: registrationFn,
|
|
53
|
-
});
|
|
54
|
-
await syncDatabaseProviders({
|
|
55
|
-
container,
|
|
56
|
-
providers: providers,
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
async function syncDatabaseProviders({ container, providers, }) {
|
|
60
|
-
const providerServiceRegistrationKey = (0, utils_1.lowerCaseFirst)(_services_1.NotificationProviderService.name);
|
|
61
|
-
const providerService = container.resolve(providerServiceRegistrationKey);
|
|
62
|
-
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER) ?? console;
|
|
63
|
-
const normalizedProviders = providers.map((provider) => {
|
|
64
|
-
if (!provider.id) {
|
|
65
|
-
throw new Error("An entry in the provider config is required to initialize notification providers");
|
|
66
|
-
}
|
|
67
|
-
return {
|
|
68
|
-
id: provider.id,
|
|
69
|
-
handle: provider.id,
|
|
70
|
-
name: provider.id,
|
|
71
|
-
is_enabled: true,
|
|
72
|
-
channels: provider.options?.channels ?? [],
|
|
73
|
-
};
|
|
74
|
-
});
|
|
75
|
-
validateProviders(normalizedProviders);
|
|
76
|
-
try {
|
|
77
|
-
const providersInDb = await providerService.list({});
|
|
78
|
-
const providersToDisable = providersInDb.filter((dbProvider) => !normalizedProviders.some((normalizedProvider) => normalizedProvider.id === dbProvider.id));
|
|
79
|
-
const promises = [];
|
|
80
|
-
if (normalizedProviders.length) {
|
|
81
|
-
promises.push(providerService.upsert(normalizedProviders));
|
|
82
|
-
}
|
|
83
|
-
if (providersToDisable.length) {
|
|
84
|
-
promises.push(providerService.update(providersToDisable.map((p) => ({
|
|
85
|
-
id: p.id,
|
|
86
|
-
is_enabled: false,
|
|
87
|
-
}))));
|
|
88
|
-
}
|
|
89
|
-
await (0, utils_1.promiseAll)(promises);
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
logger.error(`Error syncing the notification providers: ${error.message}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function validateProviders(providers) {
|
|
96
|
-
const hasForChannel = {};
|
|
97
|
-
providers.forEach((provider) => {
|
|
98
|
-
provider.channels.forEach((channel) => {
|
|
99
|
-
if (hasForChannel[channel]) {
|
|
100
|
-
throw new Error(`Multiple providers are configured for the same channel: ${channel}`);
|
|
101
|
-
}
|
|
102
|
-
hasForChannel[channel] = true;
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=providers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/loaders/providers.ts"],"names":[],"mappings":"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"}
|