@codee-sh/medusa-plugin-automations 1.0.9 → 1.0.10
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/src/admin/_chunks/{__admin-extensions__-BZrUHl9N → __admin-extensions__-CzXvFkp_} +5 -1
- package/.medusa/server/src/admin/_chunks/{__admin-extensions__-BV7n9V1I → __admin-extensions__-FXmyAEGa} +5 -1
- package/.medusa/server/src/admin/_chunks/{base-config-D0IqhDVr → base-config-CjqEuEOM} +7 -9
- package/.medusa/server/src/admin/_chunks/{base-config-CbWD1XMk → base-config-fXd1L6SD} +7 -9
- package/.medusa/server/src/admin/index.js +1 -1
- package/.medusa/server/src/admin/index.mjs +1 -1
- package/.medusa/server/src/api/admin/mpn/automations/actions/route.js +1 -20
- package/.medusa/server/src/api/admin/mpn/automations/available-actions/route.js +20 -3
- package/.medusa/server/src/modules/mpn-automation/index.js +6 -3
- package/.medusa/server/src/modules/mpn-automation/service.js +261 -0
- package/.medusa/server/src/modules/mpn-automation/services-local/base-action-service.js +117 -0
- package/.medusa/server/src/modules/mpn-automation/services-local/email-action-service.js +130 -0
- package/.medusa/server/src/modules/mpn-automation/services-local/slack-action-service.js +84 -0
- package/.medusa/server/src/providers/slack/service.js +4 -7
- package/.medusa/server/src/subscribers/mpn.automation.action.email.executed.js +9 -2
- package/.medusa/server/src/subscribers/mpn.automation.action.slack.executed.js +8 -6
- package/.medusa/server/src/subscribers/product-updated.js +1 -2
- package/.medusa/server/src/utils/validate-rules.js +8 -8
- package/.medusa/server/src/workflows/mpn-automation/run-automation.js +5 -6
- package/.medusa/server/src/workflows/mpn-automation/run-email-action.js +7 -7
- package/.medusa/server/src/workflows/mpn-automation/run-slack-action.js +12 -13
- package/.medusa/server/src/workflows/notifications/index.js +2 -1
- package/.medusa/server/src/workflows/notifications/send-email.js +7 -7
- package/.medusa/server/src/workflows/notifications/send-slack.js +7 -7
- package/.medusa/server/src/workflows/notifications/steps/index.js +2 -1
- package/.medusa/server/src/workflows/notifications/steps/send-email.js +66 -53
- package/.medusa/server/src/workflows/notifications/steps/send-slack.js +15 -16
- package/package.json +4 -3
- package/.medusa/server/src/modules/mpn-automation/services/base-action-service.js +0 -98
- package/.medusa/server/src/modules/mpn-automation/services/email-action-service.js +0 -94
- package/.medusa/server/src/modules/mpn-automation/services/index.js +0 -15
- package/.medusa/server/src/modules/mpn-automation/services/service.js +0 -356
- package/.medusa/server/src/modules/mpn-automation/services/slack-action-service.js +0 -57
|
@@ -1,356 +0,0 @@
|
|
|
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 types_1 = require("../types");
|
|
6
|
-
const email_action_service_1 = require("./email-action-service");
|
|
7
|
-
const slack_action_service_1 = require("./slack-action-service");
|
|
8
|
-
const utils_2 = require("@medusajs/framework/utils");
|
|
9
|
-
const modules_1 = require("../types/modules");
|
|
10
|
-
class MpnAutomationService extends (0, utils_1.MedusaService)({
|
|
11
|
-
MpnAutomationTrigger: models_1.MpnAutomationTrigger,
|
|
12
|
-
MpnAutomationState: models_1.MpnAutomationState,
|
|
13
|
-
MpnAutomationRule: models_1.MpnAutomationRule,
|
|
14
|
-
MpnAutomationRuleValue: models_1.MpnAutomationRuleValue,
|
|
15
|
-
MpnAutomationAction: models_1.MpnAutomationAction,
|
|
16
|
-
}) {
|
|
17
|
-
constructor({ logger }, options) {
|
|
18
|
-
super(...arguments);
|
|
19
|
-
this.actionHandlers_ = new Map();
|
|
20
|
-
this.logger_ = logger;
|
|
21
|
-
this.options_ = options || {};
|
|
22
|
-
this.events_ =
|
|
23
|
-
this.options_.automations?.extend?.events || [];
|
|
24
|
-
this.actionsEnabled_ = this.options_.automations
|
|
25
|
-
?.actionsEnabled || {
|
|
26
|
-
slack: false,
|
|
27
|
-
email: true,
|
|
28
|
-
};
|
|
29
|
-
// Initialize default action handlers
|
|
30
|
-
this.initializeActionHandlers();
|
|
31
|
-
// Initialize extended actions (custom handlers and templates)
|
|
32
|
-
// Note: templates with import paths will be loaded asynchronously
|
|
33
|
-
this.initializeExtendedActions().catch((error) => {
|
|
34
|
-
this.logger_.error(`Failed to initialize extended actions: ${error?.message || "Unknown error"}`);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Get available triggers for the admin panel form
|
|
39
|
-
*
|
|
40
|
-
* @returns Array of triggers
|
|
41
|
-
*/
|
|
42
|
-
getAvailableTriggers() {
|
|
43
|
-
return [...types_1.TRIGGER_TYPES];
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Get action handlers map
|
|
47
|
-
*
|
|
48
|
-
* @returns Map of action handlers
|
|
49
|
-
*/
|
|
50
|
-
getActionHandlers() {
|
|
51
|
-
return this.actionHandlers_;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Build events list using central metadata registry
|
|
55
|
-
* Supports both Medusa events and custom events
|
|
56
|
-
*
|
|
57
|
-
* @returns Array of events
|
|
58
|
-
*/
|
|
59
|
-
buildAvailableEvents() {
|
|
60
|
-
const events = [
|
|
61
|
-
// Service Events (automatic CRUD events)
|
|
62
|
-
{
|
|
63
|
-
name: "Inventory",
|
|
64
|
-
events: this.buildEvents(utils_2.InventoryEvents) || [],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
name: "Cart",
|
|
68
|
-
events: this.buildEvents(utils_2.CartWorkflowEvents),
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: "Customer",
|
|
72
|
-
events: this.buildEvents(utils_2.CustomerWorkflowEvents),
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
name: "Order",
|
|
76
|
-
events: this.buildEvents(utils_2.OrderWorkflowEvents),
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
name: "Order Edit",
|
|
80
|
-
events: this.buildEvents(utils_2.OrderEditWorkflowEvents),
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: "User",
|
|
84
|
-
events: this.buildEvents(utils_2.UserWorkflowEvents),
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
name: "Auth",
|
|
88
|
-
events: this.buildEvents(utils_2.AuthWorkflowEvents),
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
name: "Sales Channel",
|
|
92
|
-
events: this.buildEvents(utils_2.SalesChannelWorkflowEvents),
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: "Product Category",
|
|
96
|
-
events: this.buildEvents(utils_2.ProductCategoryWorkflowEvents),
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: "Product Collection",
|
|
100
|
-
events: this.buildEvents(utils_2.ProductCollectionWorkflowEvents),
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
name: "Product Variant",
|
|
104
|
-
events: this.buildEvents(utils_2.ProductVariantWorkflowEvents),
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: "Product",
|
|
108
|
-
events: this.buildEvents(utils_2.ProductWorkflowEvents),
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: "Product Type",
|
|
112
|
-
events: this.buildEvents(utils_2.ProductTypeWorkflowEvents),
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
name: "Product Tag",
|
|
116
|
-
events: this.buildEvents(utils_2.ProductTagWorkflowEvents),
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: "Product Option",
|
|
120
|
-
events: this.buildEvents(utils_2.ProductOptionWorkflowEvents),
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
name: "Invite",
|
|
124
|
-
events: this.buildEvents(utils_2.InviteWorkflowEvents),
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
name: "Region",
|
|
128
|
-
events: this.buildEvents(utils_2.RegionWorkflowEvents),
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
name: "Fulfillment",
|
|
132
|
-
events: this.buildEvents(utils_2.FulfillmentWorkflowEvents),
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
name: "Payment Events",
|
|
136
|
-
events: this.buildEvents(utils_2.PaymentEvents) || [],
|
|
137
|
-
},
|
|
138
|
-
];
|
|
139
|
-
// Filter out empty groups and ensure all groups have events array
|
|
140
|
-
return events
|
|
141
|
-
.filter((group) => group &&
|
|
142
|
-
group.events &&
|
|
143
|
-
Array.isArray(group.events) &&
|
|
144
|
-
group.events.length > 0)
|
|
145
|
-
.map((group) => ({
|
|
146
|
-
name: String(group.name || ""),
|
|
147
|
-
events: group.events || [],
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Get available events for the admin panel form
|
|
152
|
-
* Combines Medusa events with custom events
|
|
153
|
-
*
|
|
154
|
-
* @returns Array of events
|
|
155
|
-
*/
|
|
156
|
-
getAvailableEvents() {
|
|
157
|
-
const medusaEvents = this.buildAvailableEvents();
|
|
158
|
-
if (!this.events_ || this.events_.length === 0) {
|
|
159
|
-
return medusaEvents;
|
|
160
|
-
}
|
|
161
|
-
// If there are custom events, add them to the result
|
|
162
|
-
if (this.events_.length > 0) {
|
|
163
|
-
return [...medusaEvents, ...this.events_];
|
|
164
|
-
}
|
|
165
|
-
return medusaEvents;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Get available templates for a given event name
|
|
169
|
-
* Uses getAvailableEvents() to find the event and extract template
|
|
170
|
-
*
|
|
171
|
-
* @param eventName - Event name to search for
|
|
172
|
-
* @returns Array of template options
|
|
173
|
-
*/
|
|
174
|
-
getTemplatesForEvent(eventName) {
|
|
175
|
-
if (!eventName) {
|
|
176
|
-
return [];
|
|
177
|
-
}
|
|
178
|
-
const allEvents = this.getAvailableEvents();
|
|
179
|
-
// Search through all event groups
|
|
180
|
-
for (const group of allEvents) {
|
|
181
|
-
const event = group.events?.find((e) => e.value === eventName);
|
|
182
|
-
if (event?.templates && event.templates.length > 0) {
|
|
183
|
-
return event.templates;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return [];
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Initialize action handlers from defaults and options
|
|
190
|
-
*
|
|
191
|
-
* @returns void
|
|
192
|
-
*/
|
|
193
|
-
initializeActionHandlers() {
|
|
194
|
-
const defaultActions = [
|
|
195
|
-
new email_action_service_1.EmailActionService(),
|
|
196
|
-
new slack_action_service_1.SlackActionService(),
|
|
197
|
-
];
|
|
198
|
-
defaultActions.forEach((action) => {
|
|
199
|
-
const isEnabled = this.actionsEnabled_[action.id];
|
|
200
|
-
this.actionHandlers_.set(action.id, {
|
|
201
|
-
handler: action,
|
|
202
|
-
enabled: isEnabled,
|
|
203
|
-
});
|
|
204
|
-
this.logger_.info(`Action handler for ${action.id} registered - ${isEnabled ? "enabled" : "disabled"} in config`);
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Initialize extended actions (custom handlers and templates)
|
|
209
|
-
* Handles both custom handler registration and template loading
|
|
210
|
-
*
|
|
211
|
-
* @returns Promise<void>
|
|
212
|
-
*/
|
|
213
|
-
async initializeExtendedActions() {
|
|
214
|
-
const extendedActions = this.options_.automations?.extend?.actions || [];
|
|
215
|
-
await Promise.all(extendedActions.map(async (actionConfig) => {
|
|
216
|
-
// 1. Register custom handler if provided
|
|
217
|
-
if (actionConfig.handler) {
|
|
218
|
-
if (!this.actionHandlers_.has(actionConfig.id)) {
|
|
219
|
-
const isEnabled = this.actionsEnabled_[actionConfig.id];
|
|
220
|
-
this.actionHandlers_.set(actionConfig.id, {
|
|
221
|
-
handler: actionConfig.handler,
|
|
222
|
-
enabled: isEnabled,
|
|
223
|
-
});
|
|
224
|
-
this.logger_.info(`Custom action handler "${actionConfig.id}" registered - ${isEnabled ? "enabled" : "disabled"}`);
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
this.logger_.warn(`Action handler "${actionConfig.id}" already exists, skipping custom handler registration`);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// 2. Register templates (for existing or newly registered handler)
|
|
231
|
-
if (actionConfig.templates &&
|
|
232
|
-
Array.isArray(actionConfig.templates)) {
|
|
233
|
-
const handlerData = this.getActionHandler(actionConfig.id);
|
|
234
|
-
if (!handlerData) {
|
|
235
|
-
this.logger_.warn(`Cannot register templates for "${actionConfig.id}" - handler not found`);
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
const { handler } = handlerData;
|
|
239
|
-
if (!handler.registerTemplate) {
|
|
240
|
-
this.logger_.warn(`Handler "${actionConfig.id}" does not support template registration`);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
await Promise.all(actionConfig.templates.map(async (template) => {
|
|
244
|
-
const templateName = template.name;
|
|
245
|
-
const templateValue = template.path;
|
|
246
|
-
let renderer = templateValue;
|
|
247
|
-
try {
|
|
248
|
-
const templateModule = await import(templateValue);
|
|
249
|
-
const template = templateModule.default;
|
|
250
|
-
renderer = template?.default || template;
|
|
251
|
-
if (!renderer) {
|
|
252
|
-
this.logger_.warn(`Template module from "${templateValue}" does not export a default function or expected named export`);
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
catch (error) {
|
|
257
|
-
this.logger_.warn(`Failed to load template from "${templateValue}": ${error?.message || "Unknown error"}`);
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
if (templateName) {
|
|
261
|
-
handler.registerTemplate(templateName, renderer);
|
|
262
|
-
this.logger_.info(`Custom template "${templateName}" registered for handler "${actionConfig.id}"`);
|
|
263
|
-
}
|
|
264
|
-
}));
|
|
265
|
-
}
|
|
266
|
-
}));
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Get available actions for the admin panel form
|
|
270
|
-
* If Handler has fields, we can push templateName field to fields array, then in the admin panel form we can render the templateName field as a select field with the templates options.
|
|
271
|
-
*
|
|
272
|
-
* @param eventName - Optional event name to filter templates dynamically
|
|
273
|
-
* @returns Array of actions
|
|
274
|
-
*/
|
|
275
|
-
getAvailableActions(eventName) {
|
|
276
|
-
const handlers = this.getActionHandlers();
|
|
277
|
-
return Array.from(handlers.values()).map((handler) => {
|
|
278
|
-
// Get fields, potentially with dynamic template options
|
|
279
|
-
let fields = handler.handler.fields || [];
|
|
280
|
-
// If eventName is provided, update templateName fields dynamically
|
|
281
|
-
if (eventName && fields.length > 0) {
|
|
282
|
-
const templates = this.getTemplatesForEvent(eventName);
|
|
283
|
-
fields = fields.map((field) => {
|
|
284
|
-
// If this is a templateName field, update its options
|
|
285
|
-
if (field.key === "templateName" &&
|
|
286
|
-
field.type === "select") {
|
|
287
|
-
return {
|
|
288
|
-
...field,
|
|
289
|
-
options: templates.length > 0
|
|
290
|
-
? templates
|
|
291
|
-
: field.options || [],
|
|
292
|
-
defaultValue: templates.length > 0
|
|
293
|
-
? templates[0]?.value
|
|
294
|
-
: field.defaultValue,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
return field;
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
return {
|
|
301
|
-
value: handler.handler.id,
|
|
302
|
-
label: handler.handler.label,
|
|
303
|
-
description: handler.handler.description,
|
|
304
|
-
configComponentKey: handler.handler.configComponentKey,
|
|
305
|
-
templateLoaders: handler.handler.templateLoaders,
|
|
306
|
-
fields: fields,
|
|
307
|
-
enabled: handler.enabled,
|
|
308
|
-
};
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Build events list from Medusa events
|
|
313
|
-
* Supports both Medusa events and custom events
|
|
314
|
-
*
|
|
315
|
-
* @param events - Medusa events object
|
|
316
|
-
* @returns Array of events
|
|
317
|
-
*/
|
|
318
|
-
buildEvents(events) {
|
|
319
|
-
if (!events || typeof events !== "object") {
|
|
320
|
-
return [];
|
|
321
|
-
}
|
|
322
|
-
return Object.values(events)
|
|
323
|
-
.filter((event) => event != null) // Filter out null/undefined
|
|
324
|
-
.map((event) => {
|
|
325
|
-
const eventName = String(event);
|
|
326
|
-
// Skip invalid event names
|
|
327
|
-
if (!eventName ||
|
|
328
|
-
eventName === "undefined" ||
|
|
329
|
-
eventName === "null") {
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
|
-
const metadata = (0, modules_1.getEventMetadata)(eventName);
|
|
333
|
-
return {
|
|
334
|
-
value: eventName,
|
|
335
|
-
label: eventName,
|
|
336
|
-
attributes: metadata.attributes || event.attributes || [],
|
|
337
|
-
templates: metadata.templates || event.templates || [],
|
|
338
|
-
contextType: event.contextType || null, // Only from custom events, not from registry
|
|
339
|
-
};
|
|
340
|
-
})
|
|
341
|
-
.filter((event) => event != null); // Filter out null results
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Get action handler by ID for the admin panel form
|
|
345
|
-
* Used to get the action handler by ID in the Run Automation Actions workflow step
|
|
346
|
-
*
|
|
347
|
-
* @param actionId - Action ID
|
|
348
|
-
* @returns Action handler
|
|
349
|
-
*/
|
|
350
|
-
getActionHandler(actionId) {
|
|
351
|
-
const handlers = this.getActionHandlers();
|
|
352
|
-
return handlers.get(actionId);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
exports.default = MpnAutomationService;
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL21wbi1hdXRvbWF0aW9uL3NlcnZpY2VzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFHa0M7QUFDbEMsc0NBTWtCO0FBQ2xCLG9DQUtpQjtBQUNqQixpRUFBMkQ7QUFDM0QsaUVBQTJEO0FBRTNELHFEQW9Ca0M7QUFDbEMsOENBQW1EO0FBTW5ELE1BQU0sb0JBQXFCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQy9DLG9CQUFvQixFQUFwQiw2QkFBb0I7SUFDcEIsa0JBQWtCLEVBQWxCLDJCQUFrQjtJQUNsQixpQkFBaUIsRUFBakIsMEJBQWlCO0lBQ2pCLHNCQUFzQixFQUF0QiwrQkFBc0I7SUFDdEIsbUJBQW1CLEVBQW5CLDRCQUFtQjtDQUNwQixDQUFDO0lBT0EsWUFDRSxFQUFFLE1BQU0sRUFBd0IsRUFDaEMsT0FBdUI7UUFFdkIsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFOYixvQkFBZSxHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFBO1FBUW5ELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUM3QixJQUFJLENBQUMsT0FBTztZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFBO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXO1lBQzlDLEVBQUUsY0FBYyxJQUFJO1lBQ3BCLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLElBQUk7U0FDWixDQUFBO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1FBRS9CLDhEQUE4RDtRQUM5RCxrRUFBa0U7UUFD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
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SlackActionService = void 0;
|
|
4
|
-
const base_action_service_1 = require("./base-action-service");
|
|
5
|
-
const slack_1 = require("@codee-sh/medusa-plugin-notification-emails/templates/slack");
|
|
6
|
-
const utils_1 = require("@codee-sh/medusa-plugin-notification-emails/utils");
|
|
7
|
-
class SlackActionService extends base_action_service_1.BaseActionService {
|
|
8
|
-
constructor() {
|
|
9
|
-
super();
|
|
10
|
-
this.id = "slack";
|
|
11
|
-
this.label = "Slack";
|
|
12
|
-
this.fields = [
|
|
13
|
-
// Add templateName field - options will be populated dynamically by service based on eventName
|
|
14
|
-
this.addTemplateNameField(),
|
|
15
|
-
];
|
|
16
|
-
this.initializeTemplates();
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Initialize default Slack templates
|
|
20
|
-
* Slack engine already has all prebuild templates registered
|
|
21
|
-
* This method can be used to register custom templates if needed
|
|
22
|
-
*/
|
|
23
|
-
initializeTemplates() {
|
|
24
|
-
// Slack engine already has all prebuild templates registered
|
|
25
|
-
// You can register custom templates here if needed:
|
|
26
|
-
// slackEngine.registerTemplate("custom-template", {
|
|
27
|
-
// ...slackEngine.getBaseTemplate(),
|
|
28
|
-
// getConfig: () => ({ blocks: [...], translations: {...} })
|
|
29
|
-
// })
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Render Slack template
|
|
33
|
-
* @param params - Template rendering parameters
|
|
34
|
-
* @returns Rendered Slack template with text and blocks
|
|
35
|
-
*/
|
|
36
|
-
async renderTemplate(params) {
|
|
37
|
-
const transformedContext = (0, utils_1.transformContext)(params.contextType, params.context);
|
|
38
|
-
const { blocks } = await slack_1.slackService.render({
|
|
39
|
-
templateName: params.templateName,
|
|
40
|
-
data: {
|
|
41
|
-
...transformedContext,
|
|
42
|
-
backend_url: params.options?.backendUrl,
|
|
43
|
-
},
|
|
44
|
-
options: params.options
|
|
45
|
-
});
|
|
46
|
-
// For Slack, the 'text' field is a fallback for notifications that don't support blocks.
|
|
47
|
-
// We can derive it from the first header block or a generic message.
|
|
48
|
-
const fallbackText = blocks.find((b) => b.type === "header" && b.text?.text)?.text?.text ||
|
|
49
|
-
`Notification for ${params.templateName}`;
|
|
50
|
-
return {
|
|
51
|
-
text: fallbackText,
|
|
52
|
-
blocks: blocks,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.SlackActionService = SlackActionService;
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stYWN0aW9uLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tcG4tYXV0b21hdGlvbi9zZXJ2aWNlcy9zbGFjay1hY3Rpb24tc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFBeUQ7QUFDekQsdUZBQTBGO0FBQzFGLDZFQUFvRjtBQUVwRixNQUFhLGtCQUFtQixTQUFRLHVDQUFpQjtJQUl2RDtRQUNFLEtBQUssRUFBRSxDQUFBO1FBSlQsT0FBRSxHQUFHLE9BQU8sQ0FBQTtRQUNaLFVBQUssR0FBRyxPQUFPLENBQUE7UUFPZixXQUFNLEdBQUc7WUFDUCwrRkFBK0Y7WUFDL0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1NBQzVCLENBQUE7UUFOQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBT0Q7Ozs7T0FJRztJQUNPLG1CQUFtQjtRQUMzQiw2REFBNkQ7UUFDN0Qsb0RBQW9EO1FBQ3BELG9EQUFvRDtRQUNwRCxzQ0FBc0M7UUFDdEMsOERBQThEO1FBQzlELEtBQUs7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsTUFLcEI7UUFFQyxNQUFNLGtCQUFrQixHQUFHLElBQUEsd0JBQWdCLEVBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFL0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sb0JBQVksQ0FBQyxNQUFNLENBQUM7WUFDM0MsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLElBQUksRUFBRTtnQkFDSixHQUFHLGtCQUFrQjtnQkFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVTthQUN4QztZQUNELE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDLENBQUE7UUFFRix5RkFBeUY7UUFDekYscUVBQXFFO1FBQ3JFLE1BQU0sWUFBWSxHQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJO1lBQ25FLG9CQUFvQixNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFM0MsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZO1lBQ2xCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTlERCxnREE4REMifQ==
|