@lodashventure/medusa-notification-webhook 4.1.0 → 4.1.2
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/subscribers/admin-invite-accepted.js +83 -0
- package/.medusa/server/src/subscribers/admin-invite-created.js +114 -0
- package/.medusa/server/src/subscribers/admin-invite-resent.js +112 -0
- package/.medusa/server/src/subscribers/admin-invite-revoked.js +73 -0
- package/.medusa/server/src/subscribers/password-reset.js +88 -0
- package/.medusa/server/src/workflows/call-external-api.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = adminInviteAcceptedHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const event_hook_1 = require("../modules/event-hook");
|
|
10
|
+
const call_external_api_1 = __importDefault(require("../workflows/call-external-api"));
|
|
11
|
+
async function adminInviteAcceptedHandler({ event: { data }, container, }) {
|
|
12
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
13
|
+
const eventHookService = container.resolve(event_hook_1.EVENT_HOOK_MODULE);
|
|
14
|
+
const webHookOptions = await eventHookService.getWebHookOptions();
|
|
15
|
+
const webHookOption = webHookOptions.adminInviteAcceptedHook;
|
|
16
|
+
// Prepare user name
|
|
17
|
+
const userName = data.user.first_name && data.user.last_name
|
|
18
|
+
? `${data.user.first_name} ${data.user.last_name}`
|
|
19
|
+
: data.user.first_name || data.user.email;
|
|
20
|
+
// Send notification to inviter if available
|
|
21
|
+
if (data.invited_by) {
|
|
22
|
+
try {
|
|
23
|
+
await notificationService.createNotifications({
|
|
24
|
+
to: data.invited_by, // This should be the inviter's email
|
|
25
|
+
channel: "email",
|
|
26
|
+
template: "admin-invitation-accepted",
|
|
27
|
+
data: {
|
|
28
|
+
new_admin_name: userName,
|
|
29
|
+
new_admin_email: data.user.email,
|
|
30
|
+
new_admin_role: data.user.role,
|
|
31
|
+
accepted_at: new Date(data.accepted_at).toLocaleString(),
|
|
32
|
+
organization_name: process.env.STORE_NAME || "Our Store",
|
|
33
|
+
preview: `${userName} accepted your invitation`,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
console.log(`Invitation acceptance notification sent for ${data.user.email}`);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error(`Failed to send invitation acceptance notification:`, error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Execute webhook if configured
|
|
43
|
+
if (webHookOption?.url) {
|
|
44
|
+
if (!webHookOption.authHeader?.headerAuthKey ||
|
|
45
|
+
!webHookOption.authHeader?.headerAuthValue) {
|
|
46
|
+
console.error("Admin invitation accepted webhook configured but missing auth headers");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const payload = {
|
|
51
|
+
name: webHookOption.name || "admin-invitation-accepted",
|
|
52
|
+
payload: {
|
|
53
|
+
invitation_id: data.invitation_id,
|
|
54
|
+
user: {
|
|
55
|
+
id: data.user.id,
|
|
56
|
+
email: data.user.email,
|
|
57
|
+
name: userName,
|
|
58
|
+
role: data.user.role,
|
|
59
|
+
},
|
|
60
|
+
accepted_at: data.accepted_at,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
await call_external_api_1.default.run({
|
|
64
|
+
input: {
|
|
65
|
+
name: webHookOption.name ?? "admin-invitation-accepted",
|
|
66
|
+
url: webHookOption.url,
|
|
67
|
+
authKey: webHookOption.authHeader.headerAuthKey,
|
|
68
|
+
authValue: webHookOption.authHeader.headerAuthValue,
|
|
69
|
+
type: "ADMIN_INVITATION_ACCEPTED",
|
|
70
|
+
payload,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
console.log(`Admin invitation accepted webhook called for ${data.user.email}`);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`Failed to call admin invitation accepted webhook:`, error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.config = {
|
|
81
|
+
event: "user.invite.accepted",
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4taW52aXRlLWFjY2VwdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2FkbWluLWludml0ZS1hY2NlcHRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFPQSw2Q0FzR0M7QUEzR0QscURBQW9EO0FBQ3BELHNEQUEwRDtBQUUxRCx1RkFBcUU7QUFFdEQsS0FBSyxVQUFVLDBCQUEwQixDQUFDLEVBQ3ZELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FZVDtJQUNBLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsZUFBTyxDQUFDLFlBQVksQ0FDckIsQ0FBQztJQUNGLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDeEMsOEJBQWlCLENBQ2xCLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixDQUFDO0lBRTdELG9CQUFvQjtJQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFDMUQsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRTVDLDRDQUE0QztJQUM1QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDO2dCQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxxQ0FBcUM7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
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = adminInviteCreatedHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const event_hook_1 = require("../modules/event-hook");
|
|
10
|
+
const call_external_api_1 = __importDefault(require("../workflows/call-external-api"));
|
|
11
|
+
async function adminInviteCreatedHandler({ event: { data }, container, }) {
|
|
12
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
13
|
+
const userService = container.resolve(utils_1.Modules.USER);
|
|
14
|
+
const eventHookService = container.resolve(event_hook_1.EVENT_HOOK_MODULE);
|
|
15
|
+
const webHookOptions = await eventHookService.getWebHookOptions();
|
|
16
|
+
const webHookOption = webHookOptions.adminInviteHook;
|
|
17
|
+
// Generate invitation URL with token
|
|
18
|
+
const adminUrl = process.env.ADMIN_URL || "http://localhost:9000/app";
|
|
19
|
+
const invitation_url = `${adminUrl}/invite/accept?token=${data.token}`;
|
|
20
|
+
// Get inviter details
|
|
21
|
+
let inviterName = "Admin";
|
|
22
|
+
let inviterEmail = "";
|
|
23
|
+
try {
|
|
24
|
+
const inviter = await userService.retrieveUser(data.invited_by, {
|
|
25
|
+
select: ["id", "email", "first_name", "last_name"],
|
|
26
|
+
});
|
|
27
|
+
inviterName = inviter.first_name && inviter.last_name
|
|
28
|
+
? `${inviter.first_name} ${inviter.last_name}`
|
|
29
|
+
: inviter.first_name || inviter.email || "Admin";
|
|
30
|
+
inviterEmail = inviter.email;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`Failed to retrieve inviter details:`, error);
|
|
34
|
+
}
|
|
35
|
+
// Calculate expiration in days
|
|
36
|
+
const expiresIn = Math.ceil((new Date(data.expires_at).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
|
|
37
|
+
// Prepare recipient name
|
|
38
|
+
const recipientName = data.first_name && data.last_name
|
|
39
|
+
? `${data.first_name} ${data.last_name}`
|
|
40
|
+
: data.first_name || data.email;
|
|
41
|
+
try {
|
|
42
|
+
// Send invitation email
|
|
43
|
+
await notificationService.createNotifications({
|
|
44
|
+
to: data.email,
|
|
45
|
+
channel: "email",
|
|
46
|
+
template: "admin-invitation",
|
|
47
|
+
data: {
|
|
48
|
+
invitation_url,
|
|
49
|
+
inviter_name: inviterName,
|
|
50
|
+
inviter_email: inviterEmail,
|
|
51
|
+
recipient_email: data.email,
|
|
52
|
+
recipient_name: recipientName,
|
|
53
|
+
role: data.role,
|
|
54
|
+
expires_in: `${expiresIn} days`,
|
|
55
|
+
organization_name: process.env.STORE_NAME || "Our Store",
|
|
56
|
+
personal_message: data.metadata?.message,
|
|
57
|
+
preview: `You're invited to join as ${data.role}`,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
console.log(`Admin invitation email sent to ${data.email}`);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(`Failed to send admin invitation email to ${data.email}:`, error);
|
|
64
|
+
// Don't throw error to prevent blocking the flow
|
|
65
|
+
}
|
|
66
|
+
// Execute webhook if configured
|
|
67
|
+
if (webHookOption?.url) {
|
|
68
|
+
if (!webHookOption.authHeader?.headerAuthKey ||
|
|
69
|
+
!webHookOption.authHeader?.headerAuthValue) {
|
|
70
|
+
console.error("Admin invitation webhook configured but missing auth headers");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const payload = {
|
|
75
|
+
name: webHookOption.name || "admin-invitation-created",
|
|
76
|
+
payload: {
|
|
77
|
+
invitation: {
|
|
78
|
+
id: data.id,
|
|
79
|
+
email: data.email,
|
|
80
|
+
role: data.role,
|
|
81
|
+
expires_at: data.expires_at,
|
|
82
|
+
metadata: data.metadata,
|
|
83
|
+
},
|
|
84
|
+
inviter: {
|
|
85
|
+
id: data.invited_by,
|
|
86
|
+
email: inviterEmail,
|
|
87
|
+
name: inviterName,
|
|
88
|
+
},
|
|
89
|
+
invitation_url,
|
|
90
|
+
created_at: new Date().toISOString(),
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
await call_external_api_1.default.run({
|
|
94
|
+
input: {
|
|
95
|
+
name: webHookOption.name ?? "admin-invitation-created",
|
|
96
|
+
url: webHookOption.url,
|
|
97
|
+
authKey: webHookOption.authHeader.headerAuthKey,
|
|
98
|
+
authValue: webHookOption.authHeader.headerAuthValue,
|
|
99
|
+
type: "ADMIN_INVITATION_CREATED",
|
|
100
|
+
payload,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
console.log(`Admin invitation webhook called for ${data.email}`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(`Failed to call admin invitation webhook for ${data.email}:`, error);
|
|
107
|
+
// Don't throw error to prevent blocking the flow
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.config = {
|
|
112
|
+
event: "user.invite.created",
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4taW52aXRlLWNyZWF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvYWRtaW4taW52aXRlLWNyZWF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsNENBdUlDO0FBNUlELHFEQUFpRTtBQUNqRSxzREFBMEQ7QUFFMUQsdUZBQXFFO0FBRXRELEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxFQUN0RCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBV1Q7SUFDQSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzNDLGVBQU8sQ0FBQyxZQUFZLENBQ3JCLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFxQixlQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN4Qyw4QkFBaUIsQ0FDbEIsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNsRSxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO0lBRXJELHFDQUFxQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSwyQkFBMkIsQ0FBQztJQUN0RSxNQUFNLGNBQWMsR0FBRyxHQUFHLFFBQVEsd0JBQXdCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUV2RSxzQkFBc0I7SUFDdEIsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDO0lBQzFCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUV0QixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5RCxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUs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
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = adminInviteResentHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const event_hook_1 = require("../modules/event-hook");
|
|
10
|
+
const call_external_api_1 = __importDefault(require("../workflows/call-external-api"));
|
|
11
|
+
async function adminInviteResentHandler({ event: { data }, container, }) {
|
|
12
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
13
|
+
const userService = container.resolve(utils_1.Modules.USER);
|
|
14
|
+
const eventHookService = container.resolve(event_hook_1.EVENT_HOOK_MODULE);
|
|
15
|
+
const webHookOptions = await eventHookService.getWebHookOptions();
|
|
16
|
+
const webHookOption = webHookOptions.adminInviteHook; // Use same hook as create
|
|
17
|
+
// Generate new invitation URL with new token
|
|
18
|
+
const adminUrl = process.env.ADMIN_URL || "http://localhost:9000/app";
|
|
19
|
+
const invitation_url = `${adminUrl}/invite/accept?token=${data.token}`;
|
|
20
|
+
// Get inviter details
|
|
21
|
+
let inviterName = "Admin";
|
|
22
|
+
let inviterEmail = "";
|
|
23
|
+
try {
|
|
24
|
+
const inviter = await userService.retrieveUser(data.invited_by, {
|
|
25
|
+
select: ["id", "email", "first_name", "last_name"],
|
|
26
|
+
});
|
|
27
|
+
inviterName = inviter.first_name && inviter.last_name
|
|
28
|
+
? `${inviter.first_name} ${inviter.last_name}`
|
|
29
|
+
: inviter.first_name || inviter.email || "Admin";
|
|
30
|
+
inviterEmail = inviter.email;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`Failed to retrieve inviter details:`, error);
|
|
34
|
+
}
|
|
35
|
+
// Calculate expiration in days
|
|
36
|
+
const expiresIn = Math.ceil((new Date(data.expires_at).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
|
|
37
|
+
// Prepare recipient name
|
|
38
|
+
const recipientName = data.first_name && data.last_name
|
|
39
|
+
? `${data.first_name} ${data.last_name}`
|
|
40
|
+
: data.first_name || data.email;
|
|
41
|
+
try {
|
|
42
|
+
// Send reminder/resend email with new token
|
|
43
|
+
await notificationService.createNotifications({
|
|
44
|
+
to: data.email,
|
|
45
|
+
channel: "email",
|
|
46
|
+
template: "admin-invitation-reminder",
|
|
47
|
+
data: {
|
|
48
|
+
invitation_url,
|
|
49
|
+
inviter_name: inviterName,
|
|
50
|
+
inviter_email: inviterEmail,
|
|
51
|
+
recipient_email: data.email,
|
|
52
|
+
recipient_name: recipientName,
|
|
53
|
+
role: data.role,
|
|
54
|
+
expires_in: `${expiresIn} days`,
|
|
55
|
+
organization_name: process.env.STORE_NAME || "Our Store",
|
|
56
|
+
personal_message: data.metadata?.message,
|
|
57
|
+
is_reminder: true,
|
|
58
|
+
preview: `Reminder: You're invited to join as ${data.role}`,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
console.log(`Admin invitation reminder sent to ${data.email}`);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error(`Failed to send admin invitation reminder to ${data.email}:`, error);
|
|
65
|
+
}
|
|
66
|
+
// Execute webhook if configured (optional for resends)
|
|
67
|
+
if (webHookOption?.url && data.is_resend) {
|
|
68
|
+
if (!webHookOption.authHeader?.headerAuthKey ||
|
|
69
|
+
!webHookOption.authHeader?.headerAuthValue) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const payload = {
|
|
74
|
+
name: webHookOption.name || "admin-invitation-resent",
|
|
75
|
+
payload: {
|
|
76
|
+
invitation: {
|
|
77
|
+
id: data.id,
|
|
78
|
+
email: data.email,
|
|
79
|
+
role: data.role,
|
|
80
|
+
expires_at: data.expires_at,
|
|
81
|
+
is_resend: true,
|
|
82
|
+
},
|
|
83
|
+
inviter: {
|
|
84
|
+
id: data.invited_by,
|
|
85
|
+
email: inviterEmail,
|
|
86
|
+
name: inviterName,
|
|
87
|
+
},
|
|
88
|
+
invitation_url,
|
|
89
|
+
resent_at: new Date().toISOString(),
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
await call_external_api_1.default.run({
|
|
93
|
+
input: {
|
|
94
|
+
name: webHookOption.name ?? "admin-invitation-resent",
|
|
95
|
+
url: webHookOption.url,
|
|
96
|
+
authKey: webHookOption.authHeader.headerAuthKey,
|
|
97
|
+
authValue: webHookOption.authHeader.headerAuthValue,
|
|
98
|
+
type: "ADMIN_INVITATION_CREATED", // Reuse the same type
|
|
99
|
+
payload,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
console.log(`Admin invitation resend webhook called for ${data.email}`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`Failed to call admin invitation resend webhook:`, error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.config = {
|
|
110
|
+
event: "user.invite.resent",
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4taW52aXRlLXJlc2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9hZG1pbi1pbnZpdGUtcmVzZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQU9BLDJDQXVJQztBQTVJRCxxREFBb0Q7QUFDcEQsc0RBQTBEO0FBRTFELHVGQUFxRTtBQUV0RCxLQUFLLFVBQVUsd0JBQXdCLENBQUMsRUFDckQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQVlUO0lBQ0EsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUMzQyxlQUFPLENBQUMsWUFBWSxDQUNyQixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBcUIsZUFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDeEMsOEJBQWlCLENBQ2xCLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLDBCQUEwQjtJQUVoRiw2Q0FBNkM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksMkJBQTJCLENBQUM7SUFDdEUsTUFBTSxjQUFjLEdBQUcsR0FBRyxRQUFRLHdCQUF3QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFdkUsc0JBQXNCO0lBQ3RCLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFdEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDOUQsTUFBTSxFQUFFLENBQUMs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
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = adminInviteRevokedHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const event_hook_1 = require("../modules/event-hook");
|
|
10
|
+
const call_external_api_1 = __importDefault(require("../workflows/call-external-api"));
|
|
11
|
+
async function adminInviteRevokedHandler({ event: { data }, container, }) {
|
|
12
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
13
|
+
const eventHookService = container.resolve(event_hook_1.EVENT_HOOK_MODULE);
|
|
14
|
+
const webHookOptions = await eventHookService.getWebHookOptions();
|
|
15
|
+
const webHookOption = webHookOptions.adminInviteRevokedHook;
|
|
16
|
+
// Optionally send notification to the invited email about revocation
|
|
17
|
+
try {
|
|
18
|
+
await notificationService.createNotifications({
|
|
19
|
+
to: data.email,
|
|
20
|
+
channel: "email",
|
|
21
|
+
template: "admin-invitation-revoked",
|
|
22
|
+
data: {
|
|
23
|
+
email: data.email,
|
|
24
|
+
revoked_at: new Date(data.revoked_at).toLocaleString(),
|
|
25
|
+
reason: data.reason || "No reason provided",
|
|
26
|
+
organization_name: process.env.STORE_NAME || "Our Store",
|
|
27
|
+
preview: "Your invitation has been revoked",
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
console.log(`Invitation revocation notification sent to ${data.email}`);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`Failed to send invitation revocation notification to ${data.email}:`, error);
|
|
34
|
+
}
|
|
35
|
+
// Execute webhook if configured
|
|
36
|
+
if (webHookOption?.url) {
|
|
37
|
+
if (!webHookOption.authHeader?.headerAuthKey ||
|
|
38
|
+
!webHookOption.authHeader?.headerAuthValue) {
|
|
39
|
+
console.error("Admin invitation revoked webhook configured but missing auth headers");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const payload = {
|
|
44
|
+
name: webHookOption.name || "admin-invitation-revoked",
|
|
45
|
+
payload: {
|
|
46
|
+
invitation_id: data.invitation_id,
|
|
47
|
+
email: data.email,
|
|
48
|
+
revoked_by: data.revoked_by,
|
|
49
|
+
revoked_at: data.revoked_at,
|
|
50
|
+
reason: data.reason,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
await call_external_api_1.default.run({
|
|
54
|
+
input: {
|
|
55
|
+
name: webHookOption.name ?? "admin-invitation-revoked",
|
|
56
|
+
url: webHookOption.url,
|
|
57
|
+
authKey: webHookOption.authHeader.headerAuthKey,
|
|
58
|
+
authValue: webHookOption.authHeader.headerAuthValue,
|
|
59
|
+
type: "ADMIN_INVITATION_REVOKED",
|
|
60
|
+
payload,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
console.log(`Admin invitation revoked webhook called for ${data.email}`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error(`Failed to call admin invitation revoked webhook:`, error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.config = {
|
|
71
|
+
event: "user.invite.revoked",
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4taW52aXRlLXJldm9rZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvYWRtaW4taW52aXRlLXJldm9rZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsNENBc0ZDO0FBM0ZELHFEQUFvRDtBQUNwRCxzREFBMEQ7QUFFMUQsdUZBQXFFO0FBRXRELEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxFQUN0RCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBT1Q7SUFDQSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzNDLGVBQU8sQ0FBQyxZQUFZLENBQ3JCLENBQUM7SUFDRixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLDhCQUFpQixDQUNsQixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQztJQUU1RCxxRUFBcUU7SUFDckUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQztZQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDZCxPQUFPLEVBQUUsT0FBTztZQUNoQixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxFQUFFO2dCQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxvQkFBb0I7Z0JBQzNDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7Z0JBQ3hELE9BQU8sRUFBRSxrQ0FBa0M7YUFDNUM7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQ1gsd0RBQXdELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFDckUsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLElBQUksYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQ0UsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLGFBQWE7WUFDeEMsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFDMUMsQ0FBQztZQUNELE9BQU8sQ0FBQyxLQUFLLENBQ1gsc0VBQXNFLENBQ3ZFLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHO2dCQUNkLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLDBCQUEwQjtnQkFDdEQsT0FBTyxFQUFFO29CQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2lCQUNwQjthQUNGLENBQUM7WUFFRixNQUFNLDJCQUF1QixDQUFDLEdBQUcsQ0FBQztnQkFDaEMsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLDBCQUEwQjtvQkFDdEQsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHO29CQUN0QixPQUFPLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhO29CQUMvQyxTQUFTLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxlQUFlO29CQUNuRCxJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxPQUFPO2lCQUNSO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUNYLGtEQUFrRCxFQUNsRCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUscUJBQXFCO0NBQzdCLENBQUMifQ==
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = passwordResetHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const event_hook_1 = require("../modules/event-hook");
|
|
10
|
+
const call_external_api_1 = __importDefault(require("../workflows/call-external-api"));
|
|
11
|
+
async function passwordResetHandler({ event: { data }, container, }) {
|
|
12
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
13
|
+
const eventHookService = container.resolve(event_hook_1.EVENT_HOOK_MODULE);
|
|
14
|
+
const webHookOptions = await eventHookService.getWebHookOptions();
|
|
15
|
+
const webHookOption = webHookOptions.passwordResetHook;
|
|
16
|
+
// Determine the base URL based on user role
|
|
17
|
+
const baseUrl = data.role === "admin" || data.role === "member"
|
|
18
|
+
? process.env.ADMIN_URL || "http://localhost:9000/app"
|
|
19
|
+
: process.env.STOREFRONT_URL || "http://localhost:8000";
|
|
20
|
+
// Generate the password reset URL
|
|
21
|
+
const reset_url = `${baseUrl}/reset-password?token=${data.token}`;
|
|
22
|
+
// Prepare user display name
|
|
23
|
+
const userName = data.first_name && data.last_name
|
|
24
|
+
? `${data.first_name} ${data.last_name}`
|
|
25
|
+
: data.first_name || data.email;
|
|
26
|
+
try {
|
|
27
|
+
// Send email notification
|
|
28
|
+
await notificationService.createNotifications({
|
|
29
|
+
to: data.email,
|
|
30
|
+
channel: "email",
|
|
31
|
+
template: "password-reset",
|
|
32
|
+
data: {
|
|
33
|
+
reset_url,
|
|
34
|
+
email: data.email,
|
|
35
|
+
name: userName,
|
|
36
|
+
expires_in: "24 hours",
|
|
37
|
+
preview: `Reset your password`,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
console.log(`Password reset email sent to ${data.email}`);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error(`Failed to send password reset email to ${data.email}:`, error);
|
|
44
|
+
// Don't throw error to prevent blocking the flow
|
|
45
|
+
}
|
|
46
|
+
// Execute webhook if configured
|
|
47
|
+
if (webHookOption?.url) {
|
|
48
|
+
if (!webHookOption.authHeader?.headerAuthKey ||
|
|
49
|
+
!webHookOption.authHeader?.headerAuthValue) {
|
|
50
|
+
console.error("Password reset webhook configured but missing auth headers");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const payload = {
|
|
55
|
+
name: webHookOption.name || "password-reset",
|
|
56
|
+
payload: {
|
|
57
|
+
user: {
|
|
58
|
+
id: data.id,
|
|
59
|
+
email: data.email,
|
|
60
|
+
role: data.role || "customer",
|
|
61
|
+
name: userName,
|
|
62
|
+
},
|
|
63
|
+
reset_url,
|
|
64
|
+
requested_at: new Date().toISOString(),
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
await call_external_api_1.default.run({
|
|
68
|
+
input: {
|
|
69
|
+
name: webHookOption.name ?? "password-reset",
|
|
70
|
+
url: webHookOption.url,
|
|
71
|
+
authKey: webHookOption.authHeader.headerAuthKey,
|
|
72
|
+
authValue: webHookOption.authHeader.headerAuthValue,
|
|
73
|
+
type: "PASSWORD_RESET",
|
|
74
|
+
payload,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
console.log(`Password reset webhook called for ${data.email}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error(`Failed to call password reset webhook for ${data.email}:`, error);
|
|
81
|
+
// Don't throw error to prevent blocking the flow
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.config = {
|
|
86
|
+
event: "auth.password_reset",
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcmVzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGFzc3dvcmQtcmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsdUNBc0dDO0FBM0dELHFEQUFpRTtBQUNqRSxzREFBMEQ7QUFFMUQsdUZBQXFFO0FBRXRELEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxFQUNqRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBUVQ7SUFDQSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzNDLGVBQU8sQ0FBQyxZQUFZLENBQ3JCLENBQUM7SUFDRixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3hDLDhCQUFpQixDQUNsQixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztJQUV2RCw0Q0FBNEM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQzdELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSwyQkFBMkI7UUFDdEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLHVCQUF1QixDQUFDO0lBRTFELGtDQUFrQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLE9BQU8seUJBQXlCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVsRSw0QkFBNEI7SUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUztRQUNoRCxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEVB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
|
|
@@ -20,4 +20,4 @@ const callExternalApiWorkflow = (0, workflows_sdk_1.createWorkflow)("call-extern
|
|
|
20
20
|
return new workflows_sdk_1.WorkflowResponse(input);
|
|
21
21
|
});
|
|
22
22
|
exports.default = callExternalApiWorkflow;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1leHRlcm5hbC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2NhbGwtZXh0ZXJuYWwtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUVBSzJDO0FBb0IzQyxNQUFNLG1CQUFtQixHQUFHLElBQUEsMEJBQVUsRUFDcEMsbUJBQW1CLEVBQ25CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFpQixFQUFFLEVBQUU7SUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFOUMsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUztTQUNyQjtRQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztLQUM5QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksNEJBQVksQ0FBQztRQUN0QixPQUFPLEVBQUUsV0FBVyxJQUFJLElBQUksSUFBSSxhQUFhLEdBQUcsZUFBZTtLQUNoRSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQ0YsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQUcsSUFBQSw4QkFBYyxFQUM1QyxtQkFBbUIsRUFDbkIsQ0FBQyxLQUFvQixFQUFFLEVBQUU7SUFDdkIsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0IsT0FBTyxJQUFJLGdDQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FDRixDQUFDO0FBRUYsa0JBQWUsdUJBQXVCLENBQUMifQ==
|