order-management 0.0.15 → 0.0.16
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/api/store/otp/request/route.js +54 -91
- package/.medusa/server/src/config.js +28 -0
- package/.medusa/server/src/subscribers/send-order-email.js +13 -138
- package/.medusa/server/src/utils/resolve-options.js +5 -3
- package/.medusa/server/src/workflows/steps/index.js +4 -2
- package/.medusa/server/src/workflows/steps/send-notification-step.js +121 -0
- package/README.md +8 -3
- package/package.json +1 -1
|
@@ -1,13 +1,11 @@
|
|
|
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
|
exports.POST = POST;
|
|
7
4
|
const otp_service_1 = require("../../../../services/otp-service");
|
|
8
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
9
6
|
const template_1 = require("../../../../utils/template");
|
|
10
|
-
const
|
|
7
|
+
const send_notification_step_1 = require("../../../../workflows/steps/send-notification-step");
|
|
8
|
+
const resolve_options_1 = require("../../../../utils/resolve-options");
|
|
11
9
|
const otpService = new otp_service_1.OtpService();
|
|
12
10
|
async function POST(req, res) {
|
|
13
11
|
const { email, phone } = req.body;
|
|
@@ -21,6 +19,28 @@ async function POST(req, res) {
|
|
|
21
19
|
return;
|
|
22
20
|
}
|
|
23
21
|
try {
|
|
22
|
+
// Check if OTP template is configured (mandatory)
|
|
23
|
+
let templatePath = null;
|
|
24
|
+
try {
|
|
25
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
26
|
+
const pluginOptions = (0, resolve_options_1.extractOrderManagementOptions)(configModule);
|
|
27
|
+
const options = (0, resolve_options_1.resolveOrderManagementOptions)(pluginOptions);
|
|
28
|
+
templatePath = options.email.otpTemplate;
|
|
29
|
+
if (!templatePath) {
|
|
30
|
+
console.error("[OTP Service] OTP template path not configured");
|
|
31
|
+
res.status(500).json({
|
|
32
|
+
message: "OTP template is not configured. Please configure email.otpTemplate in plugin options."
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("[OTP Service] Could not resolve config:", error);
|
|
39
|
+
res.status(500).json({
|
|
40
|
+
message: "Failed to resolve plugin configuration. OTP template is required."
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
24
44
|
// Resolve Query to check for registered customers
|
|
25
45
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
26
46
|
const { data: customers } = await query.graph({
|
|
@@ -36,106 +56,49 @@ async function POST(req, res) {
|
|
|
36
56
|
return;
|
|
37
57
|
}
|
|
38
58
|
const otp = await otpService.generate(identifier);
|
|
39
|
-
// Generate content using template
|
|
40
|
-
const templatePath = path_1.default.join("src", "templates", "emails", "otp-verification-default.html");
|
|
59
|
+
// Generate content using configured template
|
|
41
60
|
const renderedTemplate = (0, template_1.loadAndRenderTemplate)(templatePath, {
|
|
42
61
|
otp,
|
|
43
62
|
});
|
|
63
|
+
if (!renderedTemplate) {
|
|
64
|
+
console.error(`[OTP Service] Failed to load or render template from ${templatePath}`);
|
|
65
|
+
res.status(500).json({
|
|
66
|
+
message: "Failed to load or render OTP template",
|
|
67
|
+
error: `Template file not found or invalid: ${templatePath}`
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
44
71
|
const subject = `Your Verification Code: ${otp}`;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
72
|
+
// Prepare template data for notification
|
|
73
|
+
const templateData = {
|
|
74
|
+
otp,
|
|
75
|
+
otp_code: otp,
|
|
76
|
+
};
|
|
77
|
+
// Send notification using the standardized helper function
|
|
49
78
|
try {
|
|
50
|
-
|
|
51
|
-
let notificationService = req.scope.resolve(utils_1.Modules.NOTIFICATION, { allowUnregistered: true });
|
|
52
|
-
if (!notificationService) {
|
|
53
|
-
try {
|
|
54
|
-
notificationService = req.scope.resolve("notificationService");
|
|
55
|
-
}
|
|
56
|
-
catch (e) { }
|
|
57
|
-
}
|
|
58
|
-
if (!notificationService) {
|
|
59
|
-
console.error("[OTP Service] No notification service found");
|
|
60
|
-
res.status(200).json({ message: "OTP generated but notification service unavailable" });
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
// Inspect provider if possible
|
|
64
|
-
try {
|
|
65
|
-
const provider = req.scope.resolve("notificationProvider_email", { allowUnregistered: true });
|
|
66
|
-
if (provider) {
|
|
67
|
-
console.log(`[OTP Debug] Email provider detected: ${provider.constructor?.name}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (e) { }
|
|
71
|
-
// EXACT structure from send-order-email.ts
|
|
72
|
-
const payload = {
|
|
79
|
+
await (0, send_notification_step_1.sendNotification)({
|
|
73
80
|
to: identifier,
|
|
74
|
-
channel: "email",
|
|
75
81
|
subject: subject,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
subject: subject,
|
|
81
|
-
html: htmlContent,
|
|
82
|
-
text: textContent,
|
|
83
|
-
otp,
|
|
84
|
-
otp_code: otp,
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
console.log(`[!!! OTP VERSION 5 !!!] Sending to: ${identifier}. OTP: ${otp}`);
|
|
88
|
-
try {
|
|
89
|
-
if (typeof notificationService.createNotifications === "function") {
|
|
90
|
-
console.log("[OTP Debug] Executing createNotifications");
|
|
91
|
-
await notificationService.createNotifications([payload]);
|
|
92
|
-
}
|
|
93
|
-
else if (typeof notificationService.create === "function") {
|
|
94
|
-
console.log("[OTP Debug] Executing create");
|
|
95
|
-
await notificationService.create(payload);
|
|
96
|
-
}
|
|
97
|
-
else if (typeof notificationService.send === "function") {
|
|
98
|
-
console.log("[OTP Debug] Executing send");
|
|
99
|
-
await notificationService.send("otp-request", {
|
|
100
|
-
to: identifier,
|
|
101
|
-
data: payload.data
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
// SMTP Fallback for debugging
|
|
105
|
-
if (process.env.OTP_DEBUG_SMTP === "true") {
|
|
106
|
-
try {
|
|
107
|
-
const nodemailer = require("nodemailer");
|
|
108
|
-
const transporter = nodemailer.createTransport({
|
|
109
|
-
host: process.env.SMTP_HOST,
|
|
110
|
-
port: process.env.SMTP_PORT ? Number(process.env.SMTP_PORT) : undefined,
|
|
111
|
-
secure: process.env.SMTP_SECURE === "true",
|
|
112
|
-
auth: process.env.SMTP_AUTH_USER ? { user: process.env.SMTP_AUTH_USER, pass: process.env.SMTP_AUTH_PASS } : undefined,
|
|
113
|
-
});
|
|
114
|
-
await transporter.sendMail({
|
|
115
|
-
from: process.env.SMTP_FROM || process.env.SMTP_AUTH_USER,
|
|
116
|
-
to: identifier,
|
|
117
|
-
subject: subject,
|
|
118
|
-
html: htmlContent,
|
|
119
|
-
text: textContent,
|
|
120
|
-
});
|
|
121
|
-
console.log("[OTP Debug] SMTP Direct sent");
|
|
122
|
-
}
|
|
123
|
-
catch (sErr) { }
|
|
124
|
-
}
|
|
125
|
-
console.log(`[!!! OTP VERSION 5 !!!] Completed for ${identifier}.`);
|
|
126
|
-
}
|
|
127
|
-
catch (sendError) {
|
|
128
|
-
console.error(`[OTP Service] Send failed: ${sendError}`);
|
|
129
|
-
}
|
|
82
|
+
renderedContent: renderedTemplate,
|
|
83
|
+
templateData: templateData,
|
|
84
|
+
}, req.scope);
|
|
85
|
+
console.log(`[OTP Service] OTP sent successfully to ${identifier}`);
|
|
130
86
|
}
|
|
131
|
-
catch (
|
|
132
|
-
|
|
87
|
+
catch (error) {
|
|
88
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
89
|
+
console.error(`[OTP Service] Failed to send OTP to ${identifier}:`, errorMessage);
|
|
90
|
+
res.status(500).json({
|
|
91
|
+
message: "Failed to send OTP",
|
|
92
|
+
error: errorMessage
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
133
95
|
}
|
|
134
96
|
res.status(200).json({ message: "OTP sent successfully" });
|
|
135
97
|
}
|
|
136
98
|
catch (error) {
|
|
137
99
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
100
|
+
console.error(`[OTP Service] Error processing OTP request:`, errorMessage);
|
|
138
101
|
res.status(500).json({ message: "Failed to generate OTP", error: errorMessage });
|
|
139
102
|
}
|
|
140
103
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL290cC9yZXF1ZXN0L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsb0JBOEdDO0FBekhELGtFQUE2RDtBQUM3RCxxREFBcUU7QUFDckUseURBQTBGO0FBQzFGLCtGQUFxRjtBQUNyRix1RUFHMEM7QUFFMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSx3QkFBVSxFQUFFLENBQUE7QUFFNUIsS0FBSyxVQUFVLElBQUksQ0FDdEIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBMEMsQ0FBQTtJQUV2RSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQyxDQUFBO1FBQ3RFLE9BQU07SUFDVixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQTtJQUNqQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDZCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUE7UUFDdkQsT0FBTTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxrREFBa0Q7UUFDbEQsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQTtRQUN0QyxJQUFJLENBQUM7WUFDRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMvRSxNQUFNLGFBQWEsR0FBRyxJQUFBLCtDQUE2QixFQUFDLFlBQVksQ0FB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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration file for order-management plugin
|
|
4
|
+
* Centralizes environment variable access per environment-config rule
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.config = exports.smtpConfig = exports.storefrontConfig = void 0;
|
|
8
|
+
exports.storefrontConfig = {
|
|
9
|
+
storefrontUrl: process.env.STOREFRONT_URL || "http://localhost:8000",
|
|
10
|
+
};
|
|
11
|
+
exports.smtpConfig = {
|
|
12
|
+
enabled: process.env.FORCE_SMTP_REDELIVER === "true",
|
|
13
|
+
host: process.env.SMTP_HOST,
|
|
14
|
+
port: process.env.SMTP_PORT ? Number(process.env.SMTP_PORT) : undefined,
|
|
15
|
+
secure: process.env.SMTP_SECURE === "true",
|
|
16
|
+
auth: process.env.SMTP_AUTH_USER
|
|
17
|
+
? {
|
|
18
|
+
user: process.env.SMTP_AUTH_USER,
|
|
19
|
+
pass: process.env.SMTP_AUTH_PASS || "",
|
|
20
|
+
}
|
|
21
|
+
: undefined,
|
|
22
|
+
from: process.env.SMTP_FROM || process.env.SMTP_AUTH_USER,
|
|
23
|
+
};
|
|
24
|
+
exports.config = {
|
|
25
|
+
storefront: exports.storefrontConfig,
|
|
26
|
+
smtp: exports.smtpConfig,
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFrQlUsUUFBQSxnQkFBZ0IsR0FBcUI7SUFDaEQsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLHVCQUF1QjtDQUNyRSxDQUFBO0FBRVksUUFBQSxVQUFVLEdBQWU7SUFDcEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEtBQUssTUFBTTtJQUNwRCxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO0lBQzNCLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7SUFDdkUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU07SUFDMUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztRQUM5QixDQUFDLENBQUM7WUFDRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1lBQ2hDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxFQUFFO1NBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLFNBQVM7SUFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO0NBQzFELENBQUE7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixVQUFVLEVBQUUsd0JBQWdCO0lBQzVCLElBQUksRUFBRSxrQkFBVTtDQUNSLENBQUEifQ==
|
|
@@ -5,35 +5,8 @@ exports.default = sendOrderEmailHandler;
|
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const resolve_options_1 = require("../utils/resolve-options");
|
|
7
7
|
const template_1 = require("../utils/template");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
function prepareEmailPayload(to, subject, htmlContent) {
|
|
12
|
-
// Create plain text version from HTML
|
|
13
|
-
const textContent = htmlContent
|
|
14
|
-
.replace(/<[^>]*>/g, '') // Remove HTML tags
|
|
15
|
-
.replace(/\s+/g, ' ') // Collapse whitespace
|
|
16
|
-
.trim();
|
|
17
|
-
const payload = {
|
|
18
|
-
to,
|
|
19
|
-
channel: "email",
|
|
20
|
-
subject,
|
|
21
|
-
// Root level fields for SMTP providers
|
|
22
|
-
html: htmlContent,
|
|
23
|
-
text: textContent,
|
|
24
|
-
body: htmlContent, // Some providers expect 'body' field
|
|
25
|
-
// NOTE: We intentionally do NOT set `template` to raw HTML here. Some
|
|
26
|
-
// notification providers interpret `template` as a template identifier and
|
|
27
|
-
// may switch to template-based sending which can ignore or strip content.
|
|
28
|
-
// Omit `template` when sending raw HTML content.
|
|
29
|
-
data: {
|
|
30
|
-
subject,
|
|
31
|
-
html: htmlContent,
|
|
32
|
-
text: textContent,
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
return payload;
|
|
36
|
-
}
|
|
8
|
+
const send_notification_step_1 = require("../workflows/steps/send-notification-step");
|
|
9
|
+
const config_1 = require("../config");
|
|
37
10
|
/**
|
|
38
11
|
* Subscriber handler for order.placed event
|
|
39
12
|
* Sends email with order data when an order is placed (if template is configured)
|
|
@@ -46,7 +19,7 @@ async function sendOrderEmailHandler({ event: { data }, container, }) {
|
|
|
46
19
|
const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
47
20
|
const pluginOptions = (0, resolve_options_1.extractOrderManagementOptions)(configModule);
|
|
48
21
|
const options = (0, resolve_options_1.resolveOrderManagementOptions)(pluginOptions);
|
|
49
|
-
templatePath = options.email.
|
|
22
|
+
templatePath = options.email.orderConfirmTemplate;
|
|
50
23
|
if (!templatePath) {
|
|
51
24
|
console.log("[Order Email Subscriber] Email template path not configured, skipping email");
|
|
52
25
|
return;
|
|
@@ -117,8 +90,7 @@ async function sendOrderEmailHandler({ event: { data }, container, }) {
|
|
|
117
90
|
filters: { email: email, has_account: true }
|
|
118
91
|
});
|
|
119
92
|
const isRegistered = customers.length > 0;
|
|
120
|
-
const
|
|
121
|
-
const claimLink = `${storefrontUrl}/account/orders/claim?order_id=${orderData.id}`;
|
|
93
|
+
const claimLink = `${config_1.storefrontConfig.storefrontUrl}/account/orders/claim?order_id=${orderData.id}`;
|
|
122
94
|
const templateData = {
|
|
123
95
|
order_id: orderData.id || "N/A",
|
|
124
96
|
order_status: orderData.status || "N/A",
|
|
@@ -138,112 +110,15 @@ async function sendOrderEmailHandler({ event: { data }, container, }) {
|
|
|
138
110
|
console.error(`[Order Email Subscriber] Failed to load or render template from ${templatePath}`);
|
|
139
111
|
return;
|
|
140
112
|
}
|
|
141
|
-
//
|
|
142
|
-
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
143
|
-
if (!notificationService) {
|
|
144
|
-
console.error("[Order Email Subscriber] Notification service is not configured");
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
// Prepare email payload
|
|
148
|
-
const subject = "Order Confirmation";
|
|
149
|
-
const payload = prepareEmailPayload(email, subject, renderedTemplate);
|
|
150
|
-
// Diagnostic summary & send email
|
|
151
|
-
console.log(`[Order Email Subscriber] Payload keys: ${Object.keys(payload).join(", ")} ; templatePresent=${payload.template ? 'yes' : 'no'}`);
|
|
113
|
+
// Send notification using helper function
|
|
152
114
|
try {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
console.log(`[Order Email Subscriber] createNotifications response: <non-serializable>`);
|
|
161
|
-
}
|
|
162
|
-
console.log(`[Order Email Subscriber] Email sent successfully for order ${orderId}`);
|
|
163
|
-
// Optional SMTP fallback for debugging/delivery verification. Enable by
|
|
164
|
-
// setting FORCE_SMTP_REDELIVER=true. This attempts a direct Nodemailer
|
|
165
|
-
// send using SMTP env vars and logs the SMTP response (messageId, accepted, etc.).
|
|
166
|
-
if (process.env.FORCE_SMTP_REDELIVER === "true") {
|
|
167
|
-
try {
|
|
168
|
-
console.log("[Order Email Subscriber] SMTP fallback enabled - attempting direct send via Nodemailer");
|
|
169
|
-
// @ts-ignore - optional dependency
|
|
170
|
-
const nodemailer = require("nodemailer");
|
|
171
|
-
const transportOpts = {
|
|
172
|
-
host: process.env.SMTP_HOST,
|
|
173
|
-
port: process.env.SMTP_PORT ? Number(process.env.SMTP_PORT) : undefined,
|
|
174
|
-
secure: process.env.SMTP_SECURE === "true",
|
|
175
|
-
auth: process.env.SMTP_AUTH_USER ? { user: process.env.SMTP_AUTH_USER, pass: process.env.SMTP_AUTH_PASS } : undefined,
|
|
176
|
-
logger: true,
|
|
177
|
-
debug: true,
|
|
178
|
-
};
|
|
179
|
-
const transporter = nodemailer.createTransport(transportOpts);
|
|
180
|
-
const mailOptions = {
|
|
181
|
-
from: process.env.SMTP_FROM || process.env.SMTP_AUTH_USER,
|
|
182
|
-
to: payload.to,
|
|
183
|
-
subject: payload.subject,
|
|
184
|
-
html: payload.html,
|
|
185
|
-
text: payload.text,
|
|
186
|
-
};
|
|
187
|
-
const sendRes = await transporter.sendMail(mailOptions);
|
|
188
|
-
try {
|
|
189
|
-
console.log(`[Order Email Subscriber] SMTP fallback sendMail response: ${JSON.stringify(sendRes)}`);
|
|
190
|
-
}
|
|
191
|
-
catch (e) {
|
|
192
|
-
console.log(`[Order Email Subscriber] SMTP fallback sendMail response: <non-serializable>`);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
console.error("[Order Email Subscriber] SMTP fallback failed:", err instanceof Error ? err.message : String(err));
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
else if (typeof notificationService.create === "function") {
|
|
201
|
-
console.log(`[Order Email Subscriber] Using create to send email`);
|
|
202
|
-
const res = await notificationService.create(payload);
|
|
203
|
-
try {
|
|
204
|
-
console.log(`[Order Email Subscriber] create response: ${JSON.stringify(res)}`);
|
|
205
|
-
}
|
|
206
|
-
catch (e) {
|
|
207
|
-
console.log(`[Order Email Subscriber] create response: <non-serializable>`);
|
|
208
|
-
}
|
|
209
|
-
console.log(`[Order Email Subscriber] Email sent successfully for order ${orderId}`);
|
|
210
|
-
if (process.env.FORCE_SMTP_REDELIVER === "true") {
|
|
211
|
-
try {
|
|
212
|
-
console.log("[Order Email Subscriber] SMTP fallback enabled - attempting direct send via Nodemailer");
|
|
213
|
-
// @ts-ignore - optional dependency
|
|
214
|
-
const nodemailer = require("nodemailer");
|
|
215
|
-
const transportOpts = {
|
|
216
|
-
host: process.env.SMTP_HOST,
|
|
217
|
-
port: process.env.SMTP_PORT ? Number(process.env.SMTP_PORT) : undefined,
|
|
218
|
-
secure: process.env.SMTP_SECURE === "true",
|
|
219
|
-
auth: process.env.SMTP_AUTH_USER ? { user: process.env.SMTP_AUTH_USER, pass: process.env.SMTP_AUTH_PASS } : undefined,
|
|
220
|
-
logger: true,
|
|
221
|
-
debug: true,
|
|
222
|
-
};
|
|
223
|
-
const transporter = nodemailer.createTransport(transportOpts);
|
|
224
|
-
const mailOptions = {
|
|
225
|
-
from: process.env.SMTP_FROM || process.env.SMTP_AUTH_USER,
|
|
226
|
-
to: payload.to,
|
|
227
|
-
subject: payload.subject,
|
|
228
|
-
html: payload.html,
|
|
229
|
-
text: payload.text,
|
|
230
|
-
};
|
|
231
|
-
const sendRes = await transporter.sendMail(mailOptions);
|
|
232
|
-
try {
|
|
233
|
-
console.log(`[Order Email Subscriber] SMTP fallback sendMail response: ${JSON.stringify(sendRes)}`);
|
|
234
|
-
}
|
|
235
|
-
catch (e) {
|
|
236
|
-
console.log(`[Order Email Subscriber] SMTP fallback sendMail response: <non-serializable>`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
catch (err) {
|
|
240
|
-
console.error("[Order Email Subscriber] SMTP fallback failed:", err instanceof Error ? err.message : String(err));
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
console.error("[Order Email Subscriber] Notification service does not support sending notifications");
|
|
246
|
-
}
|
|
115
|
+
await (0, send_notification_step_1.sendNotification)({
|
|
116
|
+
to: email,
|
|
117
|
+
subject: "Order Confirmation",
|
|
118
|
+
renderedContent: renderedTemplate,
|
|
119
|
+
templateData: templateData,
|
|
120
|
+
}, container);
|
|
121
|
+
console.log(`[Order Email Subscriber] Email sent successfully for order ${orderId}`);
|
|
247
122
|
}
|
|
248
123
|
catch (error) {
|
|
249
124
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -263,4 +138,4 @@ async function sendOrderEmailHandler({ event: { data }, container, }) {
|
|
|
263
138
|
exports.config = {
|
|
264
139
|
event: "order.placed",
|
|
265
140
|
};
|
|
266
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1vcmRlci1lbWFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9zZW5kLW9yZGVyLWVtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1FQSx3Q0E4TkM7QUFoU0QscURBQThFO0FBRTlFLDhEQUdpQztBQUNqQyxnREFBaUY7QUFPakY7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixFQUFVLEVBQ1YsT0FBZSxFQUNmLFdBQW1CO0lBRW5CLHNDQUFzQztJQUN0QyxNQUFNLFdBQVcsR0FBRyxXQUFXO1NBQzVCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1NBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsc0JBQXNCO1NBQzNDLElBQUksRUFBRSxDQUFBO0lBRVQsTUFBTSxPQUFPLEdBYVQ7UUFDRixFQUFFO1FBQ0YsT0FBTyxFQUFFLE9BQU87UUFDaEIsT0FBTztRQUNQLHVDQUF1QztRQUN2QyxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsV0FBVyxFQUFFLHFDQUFxQztRQUN4RCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSxpREFBaUQ7UUFDakQsSUFBSSxFQUFFO1lBQ0osT0FBTztZQUNQLElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxXQUFXO1NBQ2xCO0tBQ0YsQ0FBQTtJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDWSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUM0QjtJQUNyQyxJQUFJLENBQUM7UUFDSCx3Q0FBd0M7UUFDeEMsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQTtRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFN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
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1vcmRlci1lbWFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9zZW5kLW9yZGVyLWVtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFCQSx3Q0FnSkM7QUFwS0QscURBQXFFO0FBRXJFLDhEQUdpQztBQUNqQyxnREFBaUY7QUFDakYsc0ZBQTRFO0FBQzVFLHNDQUE0QztBQVE1Qzs7O0dBR0c7QUFDWSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUM0QjtJQUNyQyxJQUFJLENBQUM7UUFDSCx3Q0FBd0M7UUFDeEMsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQTtRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQy9FLE1BQU0sYUFBYSxHQUFHLElBQUEsK0NBQTZCLEVBQUMsWUFBWSxDQUFDLENBQUE7WUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQ0FBNkIsRUFBQyxhQUFhLENBQUMsQ0FBQTtZQUU1RCxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQTtZQUVqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkVBQTZFLENBQUMsQ0FBQTtnQkFDMUYsT0FBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGlEQUFpRDtZQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUE7WUFDbEYsT0FBTTtRQUNSLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQTtRQUV2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7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
|
|
@@ -4,7 +4,8 @@ exports.resolveOrderManagementOptions = resolveOrderManagementOptions;
|
|
|
4
4
|
exports.extractOrderManagementOptions = extractOrderManagementOptions;
|
|
5
5
|
const DEFAULT_OPTIONS = {
|
|
6
6
|
email: {
|
|
7
|
-
|
|
7
|
+
orderConfirmTemplate: null,
|
|
8
|
+
otpTemplate: null,
|
|
8
9
|
},
|
|
9
10
|
};
|
|
10
11
|
/**
|
|
@@ -16,7 +17,8 @@ function resolveOrderManagementOptions(options) {
|
|
|
16
17
|
}
|
|
17
18
|
return {
|
|
18
19
|
email: {
|
|
19
|
-
|
|
20
|
+
orderConfirmTemplate: options.email?.orderConfirmTemplate ?? DEFAULT_OPTIONS.email.orderConfirmTemplate,
|
|
21
|
+
otpTemplate: options.email?.otpTemplate ?? DEFAULT_OPTIONS.email.otpTemplate,
|
|
20
22
|
},
|
|
21
23
|
};
|
|
22
24
|
}
|
|
@@ -52,4 +54,4 @@ function extractOrderManagementOptions(configModule) {
|
|
|
52
54
|
}
|
|
53
55
|
return undefined;
|
|
54
56
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Jlc29sdmUtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSxzRUFhQztBQUtELHNFQW9DQztBQWhFRCxNQUFNLGVBQWUsR0FBbUM7SUFDdEQsS0FBSyxFQUFFO1FBQ0wsb0JBQW9CLEVBQUUsSUFBSTtRQUMxQixXQUFXLEVBQUUsSUFBSTtLQUNsQjtDQUNGLENBQUE7QUFFRDs7R0FFRztBQUNILFNBQWdCLDZCQUE2QixDQUMzQyxPQUE2QztJQUU3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRTtZQUNMLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7WUFDdkcsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsV0FBVyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsV0FBVztTQUM3RTtLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsWUFBa0I7SUFFbEIsdUNBQXVDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLFlBQVksRUFBRSxhQUFhLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUUxRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLENBQUE7WUFDWCxDQUFDO1lBQ0QsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLE1BQU0sRUFBRSxPQUFPLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxPQUFPLE1BQU0sQ0FBQyxPQUF1QyxDQUFBO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLE1BQU0sYUFBYSxHQUFJLFlBQW9CLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUUxRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLENBQUE7WUFDWCxDQUFDO1lBQ0QsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLE1BQU0sRUFBRSxPQUFPLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxPQUFPLE1BQU0sQ0FBQyxPQUF1QyxDQUFBO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyJ9
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.cancelOrderStep = exports.createCartFromOrderStep = exports.transformOrderToCartStep = exports.retrieveOrderStep = void 0;
|
|
3
|
+
exports.sendNotificationStep = exports.cancelOrderStep = exports.createCartFromOrderStep = exports.transformOrderToCartStep = exports.retrieveOrderStep = void 0;
|
|
4
4
|
var retrieve_order_step_1 = require("./retrieve-order-step");
|
|
5
5
|
Object.defineProperty(exports, "retrieveOrderStep", { enumerable: true, get: function () { return retrieve_order_step_1.retrieveOrderStep; } });
|
|
6
6
|
var transform_order_to_cart_step_1 = require("./transform-order-to-cart-step");
|
|
@@ -9,4 +9,6 @@ var create_cart_from_order_step_1 = require("./create-cart-from-order-step");
|
|
|
9
9
|
Object.defineProperty(exports, "createCartFromOrderStep", { enumerable: true, get: function () { return create_cart_from_order_step_1.createCartFromOrderStep; } });
|
|
10
10
|
var cancel_order_step_1 = require("./cancel-order-step");
|
|
11
11
|
Object.defineProperty(exports, "cancelOrderStep", { enumerable: true, get: function () { return cancel_order_step_1.cancelOrderStep; } });
|
|
12
|
-
|
|
12
|
+
var send_notification_step_1 = require("./send-notification-step");
|
|
13
|
+
Object.defineProperty(exports, "sendNotificationStep", { enumerable: true, get: function () { return send_notification_step_1.sendNotificationStep; } });
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUF5RDtBQUFoRCx3SEFBQSxpQkFBaUIsT0FBQTtBQUMxQiwrRUFBeUU7QUFBaEUsd0lBQUEsd0JBQXdCLE9BQUE7QUFDakMsNkVBQXVFO0FBQTlELHNJQUFBLHVCQUF1QixPQUFBO0FBQ2hDLHlEQUFxRDtBQUE1QyxvSEFBQSxlQUFlLE9BQUE7QUFDeEIsbUVBQStEO0FBQXRELDhIQUFBLG9CQUFvQixPQUFBIn0=
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendNotificationStep = void 0;
|
|
4
|
+
exports.prepareEmailPayload = prepareEmailPayload;
|
|
5
|
+
exports.sendNotification = sendNotification;
|
|
6
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
/**
|
|
9
|
+
* Prepare email payload for notification service
|
|
10
|
+
* Matches the structure expected by @medusajs/medusa/core-flows
|
|
11
|
+
*/
|
|
12
|
+
function prepareEmailPayload(to, subject, htmlContent, templateData) {
|
|
13
|
+
// Validate HTML content
|
|
14
|
+
if (!htmlContent || typeof htmlContent !== "string" || htmlContent.trim().length === 0) {
|
|
15
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "HTML content is required and must be a non-empty string");
|
|
16
|
+
}
|
|
17
|
+
// Create plain text version from HTML
|
|
18
|
+
const textContent = htmlContent
|
|
19
|
+
.replace(/<[^>]*>/g, "") // Remove HTML tags
|
|
20
|
+
.replace(/\s+/g, " ") // Collapse whitespace
|
|
21
|
+
.trim();
|
|
22
|
+
const payload = {
|
|
23
|
+
to,
|
|
24
|
+
channel: "email",
|
|
25
|
+
subject,
|
|
26
|
+
// Root level fields for SMTP providers
|
|
27
|
+
html: htmlContent,
|
|
28
|
+
text: textContent,
|
|
29
|
+
body: htmlContent, // Some providers expect 'body' field
|
|
30
|
+
template: htmlContent, // Some providers expect 'template' field (set to HTML content, not template ID)
|
|
31
|
+
data: {
|
|
32
|
+
subject,
|
|
33
|
+
html: htmlContent,
|
|
34
|
+
text: textContent,
|
|
35
|
+
body: htmlContent, // Some providers expect data.body
|
|
36
|
+
content: htmlContent, // Some providers expect data.content
|
|
37
|
+
// Include template data for notification providers that support it
|
|
38
|
+
...templateData,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Helper function to send notification (can be called directly from subscribers)
|
|
45
|
+
*/
|
|
46
|
+
async function sendNotification(input, container) {
|
|
47
|
+
if (!input.renderedContent) {
|
|
48
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Rendered content is required to send notification");
|
|
49
|
+
}
|
|
50
|
+
const payload = prepareEmailPayload(input.to, input.subject, input.renderedContent, input.templateData);
|
|
51
|
+
// Log payload structure for debugging (sanitized)
|
|
52
|
+
console.log("[send-notification] Email payload structure:", {
|
|
53
|
+
to: payload.to,
|
|
54
|
+
channel: payload.channel,
|
|
55
|
+
subject: payload.subject,
|
|
56
|
+
hasHtml: !!payload.html,
|
|
57
|
+
hasText: !!payload.text,
|
|
58
|
+
hasBody: !!payload.body,
|
|
59
|
+
hasTemplate: !!payload.template,
|
|
60
|
+
htmlLength: payload.html?.length || 0,
|
|
61
|
+
textLength: payload.text?.length || 0,
|
|
62
|
+
templateLength: payload.template?.length || 0,
|
|
63
|
+
htmlPreview: payload.html?.substring(0, 200) || "",
|
|
64
|
+
dataKeys: Object.keys(payload.data || {}),
|
|
65
|
+
dataHasHtml: !!payload.data?.html,
|
|
66
|
+
dataHasText: !!payload.data?.text,
|
|
67
|
+
dataHasBody: !!payload.data?.body,
|
|
68
|
+
dataHasContent: !!payload.data?.content,
|
|
69
|
+
});
|
|
70
|
+
// Log full payload structure (for debugging - remove sensitive data in production)
|
|
71
|
+
console.log("[send-notification] Full payload keys:", Object.keys(payload));
|
|
72
|
+
console.log("[send-notification] Payload root level fields:", {
|
|
73
|
+
to: typeof payload.to,
|
|
74
|
+
channel: typeof payload.channel,
|
|
75
|
+
subject: typeof payload.subject,
|
|
76
|
+
html: typeof payload.html,
|
|
77
|
+
text: typeof payload.text,
|
|
78
|
+
body: typeof payload.body,
|
|
79
|
+
template: typeof payload.template,
|
|
80
|
+
});
|
|
81
|
+
// Resolve notification service
|
|
82
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
83
|
+
if (!notificationService) {
|
|
84
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Notification service is not configured.");
|
|
85
|
+
}
|
|
86
|
+
// Use create method with payload structure matching @medusajs/medusa/core-flows
|
|
87
|
+
try {
|
|
88
|
+
if (typeof notificationService.create === "function") {
|
|
89
|
+
console.log("[send-notification] Using notificationService.create");
|
|
90
|
+
await notificationService.create(payload);
|
|
91
|
+
}
|
|
92
|
+
else if (typeof notificationService.createNotifications === "function") {
|
|
93
|
+
console.log("[send-notification] Using notificationService.createNotifications");
|
|
94
|
+
await notificationService.createNotifications([payload]);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Notification service does not support sending notifications.");
|
|
98
|
+
}
|
|
99
|
+
console.log("[send-notification] Notification sent successfully");
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error("[send-notification] Error sending notification:", error);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Send notification step for order emails
|
|
108
|
+
* Uses the notification service to send email notifications
|
|
109
|
+
*/
|
|
110
|
+
exports.sendNotificationStep = (0, workflows_sdk_1.createStep)("send-notification", async (input, { container }) => {
|
|
111
|
+
try {
|
|
112
|
+
await sendNotification(input, container);
|
|
113
|
+
return new workflows_sdk_1.StepResponse({
|
|
114
|
+
sent: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to send notification: ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1ub3RpZmljYXRpb24tc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc2VuZC1ub3RpZmljYXRpb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQkEsa0RBeUNDO0FBS0QsNENBa0ZDO0FBcEpELHFFQUE0RTtBQUM1RSxxREFBZ0U7QUFlaEU7OztHQUdHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLEVBQVUsRUFDVixPQUFlLEVBQ2YsV0FBbUIsRUFDbkIsWUFBK0I7SUFFL0Isd0JBQXdCO0lBQ3hCLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkYsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseURBQXlELENBQzFELENBQUE7SUFDSCxDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLFdBQVc7U0FDNUIsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7U0FDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7U0FDM0MsSUFBSSxFQUFFLENBQUE7SUFFVCxNQUFNLE9BQU8sR0FBUTtRQUNuQixFQUFFO1FBQ0YsT0FBTyxFQUFFLE9BQU87UUFDaEIsT0FBTztRQUNQLHVDQUF1QztRQUN2QyxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsV0FBVyxFQUFFLHFDQUFxQztRQUN4RCxRQUFRLEVBQUUsV0FBVyxFQUFFLGdGQUFnRjtRQUN2RyxJQUFJLEVBQUU7WUFDSixPQUFPO1lBQ1AsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLFdBQVc7WUFD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
|
package/README.md
CHANGED
|
@@ -56,7 +56,8 @@ module.exports = defineConfig({
|
|
|
56
56
|
resolve: "order-management",
|
|
57
57
|
options: {
|
|
58
58
|
email: {
|
|
59
|
-
|
|
59
|
+
orderConfirmTemplate: "src/templates/emails/order-confirmation.html", // Path to HTML template file
|
|
60
|
+
otpTemplate: "src/templates/emails/otp-verification.html", // Path to HTML template file (required)
|
|
60
61
|
},
|
|
61
62
|
},
|
|
62
63
|
},
|
|
@@ -68,9 +69,13 @@ module.exports = defineConfig({
|
|
|
68
69
|
|
|
69
70
|
| Option | Type | Default | Description |
|
|
70
71
|
|--------|------|---------|-------------|
|
|
71
|
-
| `email.
|
|
72
|
+
| `email.orderConfirmTemplate` | `string \| null` | `null` | Path to HTML template file for order confirmation emails (relative to project root or absolute path) |
|
|
73
|
+
| `email.otpTemplate` | `string \| null` | `null` | Path to HTML template file for OTP verification emails (relative to project root or absolute path). **Required** for guest OTP functionality. |
|
|
72
74
|
|
|
73
|
-
**
|
|
75
|
+
**Notes**:
|
|
76
|
+
- Order confirmation emails are only sent if a template path is provided. If no template is configured, emails will not be sent.
|
|
77
|
+
- OTP template is **mandatory**. The guest OTP request API will return an error if `email.otpTemplate` is not configured.
|
|
78
|
+
- OTP templates should include `{{otp}}` placeholder for the verification code.
|
|
74
79
|
|
|
75
80
|
## Return Orders Admin Panel
|
|
76
81
|
|