@codee-sh/medusa-plugin-notification-emails 0.2.1 → 1.0.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/.medusa/server/emails-previews/contact-form.js +5 -4
- package/.medusa/server/emails-previews/inventory-level.js +5 -4
- package/.medusa/server/emails-previews/order-completed.js +5 -4
- package/.medusa/server/emails-previews/order-placed.js +5 -4
- package/.medusa/server/medusa-config.js +20 -0
- package/.medusa/server/src/admin/index.js +17284 -2259
- package/.medusa/server/src/admin/index.mjs +17135 -2127
- package/.medusa/server/src/api/admin/mpn/available-templates/route.js +14 -0
- package/.medusa/server/src/api/admin/mpn/events/route.js +20 -0
- package/.medusa/server/src/api/admin/mpn/notifications/route.js +31 -0
- package/.medusa/server/src/api/admin/mpn/render-template/route.js +36 -0
- package/.medusa/server/src/api/admin/mpn/templates/[id]/blocks/route.js +119 -0
- package/.medusa/server/src/api/admin/mpn/templates/route.js +72 -0
- package/.medusa/server/src/api/admin/mpn/templates/types/[type]/services/[service]/templates/route.js +18 -0
- package/.medusa/server/src/api/admin/mpn/templates/types/[type]/services/route.js +16 -0
- package/.medusa/server/src/api/admin/mpn/templates/types/route.js +13 -0
- package/.medusa/server/src/api/middlewares.js +69 -3
- package/.medusa/server/src/hooks/api/available-templates/available-templates.js +37 -0
- package/.medusa/server/src/hooks/api/available-templates/index.js +18 -0
- package/.medusa/server/src/hooks/api/events.js +3 -3
- package/.medusa/server/src/hooks/api/notifications.js +4 -4
- package/.medusa/server/src/hooks/api/orders.js +3 -6
- package/.medusa/server/src/hooks/api/preview.js +6 -6
- package/.medusa/server/src/hooks/api/templates/blocks/blocks.js +49 -0
- package/.medusa/server/src/hooks/api/templates/blocks/index.js +18 -0
- package/.medusa/server/src/hooks/api/templates/index.js +18 -0
- package/.medusa/server/src/hooks/api/templates/services/index.js +18 -0
- package/.medusa/server/src/hooks/api/templates/services/services.js +36 -0
- package/.medusa/server/src/hooks/api/templates/services/templates/index.js +18 -0
- package/.medusa/server/src/hooks/api/templates/services/templates/templates.js +38 -0
- package/.medusa/server/src/hooks/api/templates/templates.js +74 -0
- package/.medusa/server/src/hooks/api/templates/types/index.js +18 -0
- package/.medusa/server/src/hooks/api/templates/types/types.js +34 -0
- package/.medusa/server/src/modules/mpn-builder/index.js +13 -0
- package/.medusa/server/src/modules/mpn-builder/migrations/Migration20260126192907.js +23 -0
- package/.medusa/server/src/modules/mpn-builder/migrations/Migration20260129194255.js +20 -0
- package/.medusa/server/src/modules/mpn-builder/migrations/Migration20260202123904.js +14 -0
- package/.medusa/server/src/modules/mpn-builder/models/builder_template.js +32 -0
- package/.medusa/server/src/modules/mpn-builder/models/builder_template_block.js +30 -0
- package/.medusa/server/src/modules/mpn-builder/models/index.js +11 -0
- package/.medusa/server/src/modules/mpn-builder/service.js +167 -0
- package/.medusa/server/src/modules/mpn-builder/services-local/base-template-service.js +123 -0
- package/.medusa/server/src/modules/mpn-builder/services-local/email-template-service.js +402 -0
- package/.medusa/server/src/modules/mpn-builder/services-local/index.js +13 -0
- package/.medusa/server/src/modules/mpn-builder/services-local/slack-template-service.js +452 -0
- package/.medusa/server/src/modules/mpn-builder/types/constants.js +14 -0
- package/.medusa/server/src/modules/mpn-builder/types/index.js +24 -0
- package/.medusa/server/src/modules/mpn-builder/types/interfaces.js +3 -0
- package/.medusa/server/src/modules/mpn-builder/types/template-service-interface.js +3 -0
- package/.medusa/server/src/{templates/emails/blocks → modules/mpn-builder/types}/types.js +1 -1
- package/.medusa/server/src/subscribers/order-completed.js +17 -14
- package/.medusa/server/src/subscribers/order-placed.js +29 -17
- package/.medusa/server/src/templates/emails/base-template/index.js +1 -1
- package/.medusa/server/src/templates/emails/base-template/template.js +2 -2
- package/.medusa/server/src/templates/emails/blocks/components/group.js +14 -0
- package/.medusa/server/src/templates/emails/blocks/components/heading.js +1 -1
- package/.medusa/server/src/templates/emails/blocks/components/product-item.js +4 -3
- package/.medusa/server/src/templates/emails/blocks/components/repeater.js +1 -1
- package/.medusa/server/src/templates/emails/blocks/components/row.js +4 -2
- package/.medusa/server/src/templates/emails/blocks/components/section.js +1 -1
- package/.medusa/server/src/templates/emails/blocks/components/separator.js +2 -2
- package/.medusa/server/src/templates/emails/blocks/components/text.js +2 -2
- package/.medusa/server/src/templates/emails/blocks/index.js +5 -2
- package/.medusa/server/src/templates/emails/contact-form/config.js +4 -4
- package/.medusa/server/src/templates/emails/contact-form/index.js +1 -1
- package/.medusa/server/src/templates/emails/index.js +1 -10
- package/.medusa/server/src/templates/emails/inventory-level/config.js +4 -4
- package/.medusa/server/src/templates/emails/inventory-level/index.js +1 -1
- package/.medusa/server/src/templates/emails/inventory-level/translations/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/completed/config.js +7 -7
- package/.medusa/server/src/templates/emails/order/completed/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/completed/translations/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/placed/config.js +7 -7
- package/.medusa/server/src/templates/emails/order/placed/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/placed/translations/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/updated/config.js +7 -7
- package/.medusa/server/src/templates/emails/order/updated/index.js +1 -1
- package/.medusa/server/src/templates/emails/order/updated/translations/index.js +1 -1
- package/.medusa/server/src/templates/emails/types/index.js +18 -0
- package/.medusa/server/src/templates/emails/types/types.js +12 -0
- package/.medusa/server/src/templates/shared/abstract-template-service.js +4 -2
- package/.medusa/server/src/templates/shared/theme/index.js +1 -1
- package/.medusa/server/src/templates/shared/theme/presets/default/index.js +1 -1
- package/.medusa/server/src/templates/shared/utils/index.js +1 -1
- package/.medusa/server/src/templates/slack/index.js +1 -10
- package/.medusa/server/src/templates/slack/inventory-level/config.js +5 -5
- package/.medusa/server/src/templates/slack/inventory-level/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/archived/config.js +1 -1
- package/.medusa/server/src/templates/slack/order/archived/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/archived/translations/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/canceled/config.js +1 -1
- package/.medusa/server/src/templates/slack/order/canceled/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/canceled/translations/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/completed/config.js +1 -1
- package/.medusa/server/src/templates/slack/order/completed/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/completed/translations/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/placed/config.js +1 -1
- package/.medusa/server/src/templates/slack/order/placed/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/placed/translations/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/updated/config.js +1 -1
- package/.medusa/server/src/templates/slack/order/updated/index.js +1 -1
- package/.medusa/server/src/templates/slack/order/updated/translations/index.js +1 -1
- package/.medusa/server/src/templates/slack/product/config.js +2 -2
- package/.medusa/server/src/templates/slack/product/index.js +1 -1
- package/.medusa/server/src/templates/slack/product-variant/config.js +2 -2
- package/.medusa/server/src/templates/slack/product-variant/index.js +1 -1
- package/.medusa/server/src/templates/slack/types/index.js +18 -0
- package/.medusa/server/src/templates/slack/types/types.js +15 -0
- package/.medusa/server/src/utils/addresses.js +4 -2
- package/.medusa/server/src/utils/data/countries.js +1 -1
- package/.medusa/server/src/utils/data/country-states.js +1 -1
- package/.medusa/server/src/utils/data/modules/inventory/inventory.js +6 -2
- package/.medusa/server/src/utils/data/modules/order/order.js +43 -42
- package/.medusa/server/src/utils/data/modules/product/helpers.js +1 -1
- package/.medusa/server/src/utils/data/modules/product/product.js +27 -7
- package/.medusa/server/src/utils/data/modules/product-category/product-category.js +19 -5
- package/.medusa/server/src/utils/data/modules/product-tag/product-tag.js +16 -4
- package/.medusa/server/src/utils/data/modules/product-type/product-type.js +16 -4
- package/.medusa/server/src/utils/data/modules/product-variant/product-variant.js +19 -5
- package/.medusa/server/src/utils/dnd/handle-drag-end.js +22 -0
- package/.medusa/server/src/utils/dnd/index.js +6 -0
- package/.medusa/server/src/utils/i18n/i18n.js +6 -5
- package/.medusa/server/src/utils/index.js +4 -1
- package/.medusa/server/src/utils/money-amount-helpers.js +9 -4
- package/.medusa/server/src/utils/omit.js +1 -1
- package/.medusa/server/src/utils/payment.js +1 -1
- package/.medusa/server/src/utils/pick-value-from-object.js +4 -2
- package/.medusa/server/src/utils/plugins.js +4 -2
- package/.medusa/server/src/utils/string-helpers.js +21 -0
- package/.medusa/server/src/utils/transforms/index.js +2 -2
- package/.medusa/server/src/utils/transforms/order-transformer.js +22 -8
- package/.medusa/server/src/utils/tree.js +34 -0
- package/.medusa/server/src/workflows/mpn-builder/create-template.js +24 -0
- package/.medusa/server/src/workflows/mpn-builder/delete-template.js +24 -0
- package/.medusa/server/src/workflows/mpn-builder/edit-template-blocks.js +26 -0
- package/.medusa/server/src/workflows/mpn-builder/edit-template.js +25 -0
- package/.medusa/server/src/workflows/mpn-builder/get-blocks-by-template-id.js +23 -0
- package/.medusa/server/src/workflows/mpn-builder/get-services-types-templates.js +23 -0
- package/.medusa/server/src/workflows/mpn-builder/get-template.js +28 -0
- package/.medusa/server/src/workflows/mpn-builder/get-templates-by-type-service.js +22 -0
- package/.medusa/server/src/workflows/mpn-builder/get-templates-services.js +21 -0
- package/.medusa/server/src/workflows/mpn-builder/get-templates-types.js +19 -0
- package/.medusa/server/src/workflows/mpn-builder/index.js +21 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/create-template.js +28 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/delete-template.js +22 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/edit-template-blocks.js +128 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/edit-template.js +29 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-blocks-by-template-id.js +61 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-services-types-templates.js +53 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-template-services.js +24 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-template-types.js +22 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-template.js +71 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/get-templates-by-type-service.js +45 -0
- package/.medusa/server/src/workflows/mpn-builder/steps/index.js +21 -0
- package/.medusa/server/src/workflows/mpn-builder-services/email-service.js +32 -0
- package/.medusa/server/src/workflows/mpn-builder-services/slack-service.js +33 -0
- package/.medusa/server/src/workflows/mpn-builder-services/steps/email-service.js +69 -0
- package/.medusa/server/src/workflows/mpn-builder-services/steps/slack-service.js +67 -0
- package/.medusa/server/src/workflows/order/steps/get-order-by-id.js +1 -1
- package/.medusa/server/src/workflows/region/get-region-by-id.js +25 -0
- package/.medusa/server/src/workflows/region/index.js +18 -0
- package/.medusa/server/src/workflows/region/steps/get-region-by-id.js +26 -0
- package/.medusa/server/src/workflows/region/steps/index.js +18 -0
- package/.medusa/server/src/workflows/steps/log-step.js +16 -0
- package/.medusa/server/src/workflows/store/get-store-by-id.js +23 -0
- package/.medusa/server/src/workflows/store/index.js +18 -0
- package/.medusa/server/src/workflows/store/steps/get-store-by-id.js +25 -0
- package/.medusa/server/src/workflows/store/steps/index.js +18 -0
- package/README.md +40 -103
- package/package.json +21 -8
- package/.medusa/server/src/api/admin/notification-plugin/events/route.js +0 -20
- package/.medusa/server/src/api/admin/notification-plugin/notifications/route.js +0 -31
- package/.medusa/server/src/api/admin/notification-plugin/render-template/route.js +0 -33
- package/.medusa/server/src/templates/emails/email-template-service.js +0 -210
- package/.medusa/server/src/templates/emails/types.js +0 -12
- package/.medusa/server/src/templates/slack/slack-template-service.js +0 -219
- package/.medusa/server/src/templates/slack/types.js +0 -15
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const models_1 = require("./models");
|
|
5
|
+
const email_template_service_1 = require("./services-local/email-template-service");
|
|
6
|
+
const slack_template_service_1 = require("./services-local/slack-template-service");
|
|
7
|
+
const constants_1 = require("./types/constants");
|
|
8
|
+
class MpnBuilderService extends (0, utils_1.MedusaService)({
|
|
9
|
+
MpnBuilderTemplate: models_1.MpnBuilderTemplate,
|
|
10
|
+
MpnBuilderTemplateBlock: models_1.MpnBuilderTemplateBlock,
|
|
11
|
+
}) {
|
|
12
|
+
constructor({ logger }, options) {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.templateServices_ = new Map();
|
|
15
|
+
this.logger_ = logger;
|
|
16
|
+
this.options_ = options || {};
|
|
17
|
+
// Initialize default templates
|
|
18
|
+
this.initializeTemplateServices();
|
|
19
|
+
// Initialize extended services (custom handlers and templates)
|
|
20
|
+
// Note: templates with import paths will be loaded asynchronously
|
|
21
|
+
this.initializeExtendedServices().catch((error) => {
|
|
22
|
+
this.logger_.error(`Failed to initialize extended services: ${error?.message || "Unknown error"}`);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize template services from defaults and options
|
|
27
|
+
*
|
|
28
|
+
* @returns void
|
|
29
|
+
*/
|
|
30
|
+
initializeTemplateServices() {
|
|
31
|
+
const defaultTemplateServices = [
|
|
32
|
+
new email_template_service_1.EmailTemplateService(),
|
|
33
|
+
new slack_template_service_1.SlackTemplateService(),
|
|
34
|
+
];
|
|
35
|
+
defaultTemplateServices.forEach((templateService) => {
|
|
36
|
+
this.templateServices_.set(templateService.id, {
|
|
37
|
+
templateService: templateService,
|
|
38
|
+
enabled: true,
|
|
39
|
+
});
|
|
40
|
+
this.logger_.info(`Template service for ${templateService.id} registered`);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize extended actions (custom handlers and templates)
|
|
45
|
+
* Handles both custom handler registration and template loading
|
|
46
|
+
*
|
|
47
|
+
* @returns Promise<void>
|
|
48
|
+
*/
|
|
49
|
+
async initializeExtendedServices() {
|
|
50
|
+
const extendedServices = this.options_.extend?.services || [];
|
|
51
|
+
await Promise.all(extendedServices.map(async (serviceConfig) => {
|
|
52
|
+
// 2. Register templates (for existing or newly registered handler)
|
|
53
|
+
if (serviceConfig.templates) {
|
|
54
|
+
const handlerData = this.getTemplateService(serviceConfig.id);
|
|
55
|
+
if (!handlerData) {
|
|
56
|
+
this.logger_.warn(`Cannot register templates for "${serviceConfig.id}" - handler not found`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const { templateService } = handlerData;
|
|
60
|
+
if (!templateService.registerTemplate) {
|
|
61
|
+
this.logger_.warn(`Handler "${serviceConfig.id}" does not support template registration`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
await Promise.all(serviceConfig.templates.map(async (template) => {
|
|
65
|
+
const templateName = template.name;
|
|
66
|
+
const templateValue = template.path;
|
|
67
|
+
let renderer = templateValue;
|
|
68
|
+
try {
|
|
69
|
+
const templateModule = await import(templateValue);
|
|
70
|
+
const template = templateModule.default;
|
|
71
|
+
// renderer = template?.default || template
|
|
72
|
+
renderer = template?.default || templateModule;
|
|
73
|
+
if (!renderer) {
|
|
74
|
+
this.logger_.warn(`Template module from "${templateValue}" does not export a default function or expected named export`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.logger_.warn(`Failed to load template from "${templateValue}": ${error?.message || "Unknown error"}`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (templateName) {
|
|
83
|
+
templateService.registerTemplate(templateName, renderer, "external");
|
|
84
|
+
this.logger_.info(`Custom template "${templateName}" registered for handler "${serviceConfig.id}"`);
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get template types
|
|
92
|
+
*
|
|
93
|
+
* @returns Array of template types with key, value, and name
|
|
94
|
+
*/
|
|
95
|
+
getTemplateTypes() {
|
|
96
|
+
return [
|
|
97
|
+
{
|
|
98
|
+
id: constants_1.TEMPLATE_TYPES.DB_TEMPLATE,
|
|
99
|
+
name: constants_1.TEMPLATE_TYPES_NAMES.DB_TEMPLATE,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: constants_1.TEMPLATE_TYPES.SYSTEM_TEMPLATE,
|
|
103
|
+
name: constants_1.TEMPLATE_TYPES_NAMES.SYSTEM_TEMPLATE,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: constants_1.TEMPLATE_TYPES.EXTERNAL_TEMPLATE,
|
|
107
|
+
name: constants_1.TEMPLATE_TYPES_NAMES.EXTERNAL_TEMPLATE,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get template services map
|
|
113
|
+
*
|
|
114
|
+
* @returns Map of template services
|
|
115
|
+
*/
|
|
116
|
+
getTemplateServices() {
|
|
117
|
+
return this.templateServices_;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get template service by ID for the admin panel form
|
|
121
|
+
*
|
|
122
|
+
* @param templateServiceId - Template service ID
|
|
123
|
+
* @returns Template service
|
|
124
|
+
*/
|
|
125
|
+
getTemplateService(templateServiceId) {
|
|
126
|
+
const templateServices = this.getTemplateServices();
|
|
127
|
+
return templateServices.get(templateServiceId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all registered template services (e.g., email, slack)
|
|
131
|
+
*
|
|
132
|
+
* @param type - Optional type to filter by service ID
|
|
133
|
+
* @returns Array of template service configurations
|
|
134
|
+
*/
|
|
135
|
+
listTemplateServices(type) {
|
|
136
|
+
let templates = this.getTemplateServices();
|
|
137
|
+
if (type) {
|
|
138
|
+
const templateService = templates.get(type);
|
|
139
|
+
const template = templateService?.templateService;
|
|
140
|
+
const enabled = templateService?.enabled ?? true;
|
|
141
|
+
const templateBlocks = template?.blocks || [];
|
|
142
|
+
return [
|
|
143
|
+
{
|
|
144
|
+
id: template?.id,
|
|
145
|
+
label: template?.label,
|
|
146
|
+
description: template?.description,
|
|
147
|
+
configComponentKey: template?.configComponentKey,
|
|
148
|
+
blocks: templateBlocks,
|
|
149
|
+
enabled: enabled,
|
|
150
|
+
}
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
return Array.from(templates.values()).map((template) => {
|
|
154
|
+
let blocks = template.templateService.blocks || [];
|
|
155
|
+
return {
|
|
156
|
+
id: template.templateService.id,
|
|
157
|
+
label: template.templateService.label,
|
|
158
|
+
description: template.templateService.description,
|
|
159
|
+
configComponentKey: template.templateService.configComponentKey,
|
|
160
|
+
blocks: blocks,
|
|
161
|
+
enabled: template.enabled,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.default = MpnBuilderService;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL21wbi1idWlsZGVyL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFHa0M7QUFDbEMscUNBR2lCO0FBS2pCLG9GQUE4RTtBQUU5RSxvRkFBOEU7QUFDOUUsaURBQXdFO0FBTXhFLE1BQU0saUJBQWtCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQzVDLGtCQUFrQixFQUFsQiwyQkFBa0I7SUFDbEIsdUJBQXVCLEVBQXZCLGdDQUF1QjtDQUN4QixDQUFDO0lBS0EsWUFDRSxFQUFFLE1BQU0sRUFBd0IsRUFDaEMsT0FBdUI7UUFFdkIsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFOYixzQkFBaUIsR0FBNEUsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQVE1RyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFN0IsK0JBQStCO1FBQy9CLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1FBRWpDLCtEQUErRDtRQUMvRCxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ2hCLDJDQUEyQyxLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUMvRSxDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDBCQUEwQjtRQUNoQyxNQUFNLHVCQUF1QixHQUEwQjtZQUNyRCxJQUFJLDZDQUFvQixFQUFFO1lBQzFCLElBQUksNkNBQW9CLEVBQUU7U0FDM0IsQ0FBQTtRQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFF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
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseTemplateService = void 0;
|
|
4
|
+
const constants_1 = require("../types/constants");
|
|
5
|
+
const utils_1 = require("../../../utils");
|
|
6
|
+
/**
|
|
7
|
+
* Base action service class
|
|
8
|
+
*
|
|
9
|
+
* @param id - Action ID (default: "base")
|
|
10
|
+
* @param label - Template label (default: "Base")
|
|
11
|
+
* @param description - Template description (default: "")
|
|
12
|
+
* @param configComponentKey - Template config component key (default: "BaseConfigComponent")
|
|
13
|
+
* @param blocks - Template blocks (default: [])
|
|
14
|
+
*/
|
|
15
|
+
class BaseTemplateService {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.id = "base";
|
|
18
|
+
this.label = "Base";
|
|
19
|
+
this.description = "";
|
|
20
|
+
this.configComponentKey = "BaseConfigComponent";
|
|
21
|
+
// Fields for the Template configuration rendered in the admin panel then saved in the metadata config
|
|
22
|
+
this.blocks = [];
|
|
23
|
+
// Template registry - each service manages its own templates
|
|
24
|
+
this.templates_ = new Map();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Register a template for this service
|
|
28
|
+
* @param name - Template name
|
|
29
|
+
* @param renderer - Template renderer function
|
|
30
|
+
* @param type - Template type (default: "system")
|
|
31
|
+
*/
|
|
32
|
+
registerTemplate(name, renderer, type = constants_1.TEMPLATE_TYPES.SYSTEM_TEMPLATE) {
|
|
33
|
+
this.templates_.set(name, { renderer, type: type });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get template by name
|
|
37
|
+
*
|
|
38
|
+
* @param name - Template name
|
|
39
|
+
* @returns Template renderer
|
|
40
|
+
* @throws Error if template not found
|
|
41
|
+
*/
|
|
42
|
+
getTemplate(name) {
|
|
43
|
+
const template = this.templates_.get(name);
|
|
44
|
+
if (!template) {
|
|
45
|
+
throw new Error(`Template "${name}" not found. Available templates: ${Array.from(this.templates_.keys()).join(", ")}`);
|
|
46
|
+
}
|
|
47
|
+
return template.renderer;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get templates by type
|
|
51
|
+
* @param type - Template type (TEMPLATE_TYPES.SYSTEM_TEMPLATE or TEMPLATE_TYPES.EXTERNAL_TEMPLATE)
|
|
52
|
+
* @returns Array of templates matching the specified type
|
|
53
|
+
*/
|
|
54
|
+
getTemplatesByType(type) {
|
|
55
|
+
return Array.from(this.templates_.entries())
|
|
56
|
+
.filter(([_, renderer]) => renderer.type === type)
|
|
57
|
+
.map(([name, renderer]) => ({
|
|
58
|
+
id: name,
|
|
59
|
+
name,
|
|
60
|
+
label: name,
|
|
61
|
+
description: null,
|
|
62
|
+
channel: this.id,
|
|
63
|
+
is_system: type === constants_1.TEMPLATE_TYPES.SYSTEM_TEMPLATE,
|
|
64
|
+
is_active: true,
|
|
65
|
+
type: renderer.type,
|
|
66
|
+
blocks: renderer.renderer?.getConfig?.()?.blocks || [],
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get system templates (type: "system")
|
|
71
|
+
* @returns Array of system templates
|
|
72
|
+
*/
|
|
73
|
+
getSystemTemplates() {
|
|
74
|
+
return this.getTemplatesByType(constants_1.TEMPLATE_TYPES.SYSTEM_TEMPLATE);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get external templates (type: "external")
|
|
78
|
+
* @returns Array of external templates
|
|
79
|
+
*/
|
|
80
|
+
getExternalTemplates() {
|
|
81
|
+
return this.getTemplatesByType(constants_1.TEMPLATE_TYPES.EXTERNAL_TEMPLATE);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Prepare template data.
|
|
85
|
+
*
|
|
86
|
+
* This method prepares the data for the template renderer.
|
|
87
|
+
* Merge translations from template config and options (if provided),
|
|
88
|
+
* then interpolate blocks using the interpolate function.
|
|
89
|
+
*
|
|
90
|
+
* @param params - Parameters object
|
|
91
|
+
* @returns Prepared template data
|
|
92
|
+
*/
|
|
93
|
+
prepareData(params) {
|
|
94
|
+
// Get locale from options or default to "en"
|
|
95
|
+
const locale = params.options?.locale || "en";
|
|
96
|
+
// Get registered template
|
|
97
|
+
const template = this.getTemplate(params.templateName);
|
|
98
|
+
const config = (template)?.getConfig?.() || {};
|
|
99
|
+
const configTranslations = config?.translations || {};
|
|
100
|
+
const configBlocks = config?.blocks || [];
|
|
101
|
+
const optionsBlocks = params.options?.blocks || []; // blocks from data in mpn builder
|
|
102
|
+
const optionsTranslations = params.options?.translations;
|
|
103
|
+
// If blocks are not provided in options, use basic blocks from config
|
|
104
|
+
const blocks = optionsBlocks.length > 0
|
|
105
|
+
? optionsBlocks
|
|
106
|
+
: configBlocks;
|
|
107
|
+
// Merge translations
|
|
108
|
+
const mergedTranslations = (0, utils_1.mergeTranslations)(configTranslations, optionsTranslations);
|
|
109
|
+
// Create translator function
|
|
110
|
+
const translator = (0, utils_1.createTranslator)(locale, mergedTranslations);
|
|
111
|
+
// Interpolate blocks using the interpolate function
|
|
112
|
+
const interpolatedBlocks = blocks.length > 0
|
|
113
|
+
? this.interpolateFunction(blocks, params.data, translator)
|
|
114
|
+
: blocks;
|
|
115
|
+
return {
|
|
116
|
+
template,
|
|
117
|
+
translator,
|
|
118
|
+
blocks: interpolatedBlocks,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.BaseTemplateService = BaseTemplateService;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10ZW1wbGF0ZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvbXBuLWJ1aWxkZXIvc2VydmljZXMtbG9jYWwvYmFzZS10ZW1wbGF0ZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtEQUFtRDtBQUNuRCwwQ0FHdUI7QUFFdkI7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLG1CQUFtQjtJQUFoQztRQUNFLE9BQUUsR0FBRyxNQUFNLENBQUE7UUFDWCxVQUFLLEdBQUcsTUFBTSxDQUFBO1FBQ2QsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFFaEIsdUJBQWtCLEdBQUcscUJBQXFCLENBQUE7UUFFMUMsc0dBQXNHO1FBQ3RHLFdBQU0sR0FBZ0IsRUFBRSxDQUFBO1FBRXhCLDZEQUE2RDtRQUNuRCxlQUFVLEdBQ2xCLElBQUksR0FBRyxFQUFFLENBQUE7SUF5SmIsQ0FBQztJQXZKQzs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUNkLElBQVksRUFDWixRQUEwQixFQUMxQixPQUFlLDBCQUFjLENBQUMsZUFBZTtRQUU3QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2IsYUFBYSxJQUFJLHFDQUFxQyxLQUFLLENBQUMsSUFBSSxDQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUN2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNm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
|