@lodashventure/medusa-notification-webhook 0.4.0 → 0.4.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.
|
@@ -0,0 +1,62 @@
|
|
|
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.POST = POST;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
+
/**
|
|
10
|
+
* POST /store/customers/password-reset
|
|
11
|
+
* Verifies a reset token and updates the password for the associated customer.
|
|
12
|
+
*/
|
|
13
|
+
async function POST(req, res) {
|
|
14
|
+
const { token, password } = req.body ?? {};
|
|
15
|
+
if (!token || typeof token !== "string") {
|
|
16
|
+
return res.status(400).json({
|
|
17
|
+
message: "A valid reset token is required.",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (!password || typeof password !== "string" || password.length < 8) {
|
|
21
|
+
return res.status(400).json({
|
|
22
|
+
message: "Password must be at least 8 characters long.",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
26
|
+
const { http } = configModule.projectConfig;
|
|
27
|
+
let payload;
|
|
28
|
+
try {
|
|
29
|
+
payload = jsonwebtoken_1.default.verify(token, http.jwtSecret, http.jwtOptions);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The reset token is invalid or has expired.");
|
|
33
|
+
}
|
|
34
|
+
const { entity_id: entityId, provider, actor_type: actorType } = payload;
|
|
35
|
+
if (!entityId || !provider || actorType !== "customer") {
|
|
36
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The reset token payload is invalid.");
|
|
37
|
+
}
|
|
38
|
+
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
39
|
+
const { success, error } = await authService.updateProvider(provider, {
|
|
40
|
+
password,
|
|
41
|
+
entity_id: entityId,
|
|
42
|
+
});
|
|
43
|
+
if (!success) {
|
|
44
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, error || "Unable to reset password.");
|
|
45
|
+
}
|
|
46
|
+
const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
|
|
47
|
+
let customer = null;
|
|
48
|
+
try {
|
|
49
|
+
const customers = await customerService.listCustomers({
|
|
50
|
+
email: entityId,
|
|
51
|
+
});
|
|
52
|
+
customer = customers?.[0] ?? null;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Customer retrieval is best-effort; proceed without blocking reset.
|
|
56
|
+
}
|
|
57
|
+
return res.status(200).json({
|
|
58
|
+
message: "Password updated successfully.",
|
|
59
|
+
customer,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9wYXNzd29yZC1yZXNldC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXlCQSxvQkFvRUM7QUE1RkQscURBSW1DO0FBR25DLGdFQUErQjtBQWEvQjs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBSSxHQUFHLENBQUMsSUFBc0MsSUFBSSxFQUFFLENBQUM7SUFFOUUsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxrQ0FBa0M7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixPQUFPLEVBQUUsOENBQThDO1NBQ3hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUU1QyxJQUFJLE9BQTBCLENBQUM7SUFFL0IsSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLHNCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQXNCLENBQUM7SUFDcEYsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw0Q0FBNEMsQ0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUV6RSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQ0FBcUMsQ0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1FBQ3BFLFFBQVE7UUFDUixTQUFTLEVBQUUsUUFBUTtLQUNwQixDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixLQUFLLElBQUksMkJBQTJCLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVELElBQUksUUFBUSxHQUF1QixJQUFJLENBQUM7SUFFeEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUFDO1lBQ3BELEtBQUssRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQztRQUNILFFBQVEsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixxRUFBcUU7SUFDdkUsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUIsT0FBTyxFQUFFLGdDQUFnQztRQUN6QyxRQUFRO0tBQ1QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
/**
|
|
7
|
+
* POST /store/customers/password-token
|
|
8
|
+
* Generates a password reset token for customer email identities.
|
|
9
|
+
* The underlying workflow emits `auth.password_reset`, which our subscriber
|
|
10
|
+
* uses to dispatch the Novu notification.
|
|
11
|
+
*/
|
|
12
|
+
async function POST(req, res) {
|
|
13
|
+
const body = req.body;
|
|
14
|
+
const rawEmail = body?.email;
|
|
15
|
+
const email = typeof rawEmail === "string" ? rawEmail.trim().toLowerCase() : "";
|
|
16
|
+
if (!email || !email.includes("@")) {
|
|
17
|
+
return res.status(400).json({
|
|
18
|
+
message: "A valid email address is required.",
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
22
|
+
const { http } = configModule.projectConfig;
|
|
23
|
+
await (0, core_flows_1.generateResetPasswordTokenWorkflow)(req.scope).run({
|
|
24
|
+
input: {
|
|
25
|
+
entityId: email,
|
|
26
|
+
actorType: "customer",
|
|
27
|
+
provider: "emailpass",
|
|
28
|
+
secret: http.jwtSecret,
|
|
29
|
+
jwtOptions: http.jwtOptions,
|
|
30
|
+
},
|
|
31
|
+
// Suppress errors to avoid leaking whether the email exists.
|
|
32
|
+
throwOnError: false,
|
|
33
|
+
});
|
|
34
|
+
return res.status(201).json({
|
|
35
|
+
message: "If an account exists for this email, a password reset link will be sent shortly.",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9wYXNzd29yZC10b2tlbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLG9CQThCQztBQTNDRCxxREFBc0U7QUFDdEUsNERBQWlGO0FBTWpGOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFxQyxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVoRixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLG9DQUFvQztTQUM5QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEYsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUM7SUFFNUMsTUFBTSxJQUFBLCtDQUFrQyxFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEQsS0FBSyxFQUFFO1lBQ0wsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsVUFBVTtZQUNyQixRQUFRLEVBQUUsV0FBVztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCO1FBQ0QsNkRBQTZEO1FBQzdELFlBQVksRUFBRSxLQUFLO0tBQ3BCLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUIsT0FBTyxFQUNMLGtGQUFrRjtLQUNyRixDQUFDLENBQUM7QUFDTCxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-notification-webhook",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "A starter for Medusa plugins.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,24 +27,17 @@
|
|
|
27
27
|
"dev": "medusa plugin:develop"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@medusajs/admin-sdk": "2.
|
|
31
|
-
"@medusajs/cli": "2.
|
|
32
|
-
"@medusajs/framework": "2.
|
|
33
|
-
"@medusajs/icons": "^2.
|
|
34
|
-
"@medusajs/medusa": "2.
|
|
35
|
-
"@medusajs/test-utils": "2.
|
|
30
|
+
"@medusajs/admin-sdk": "2.11.1",
|
|
31
|
+
"@medusajs/cli": "2.11.1",
|
|
32
|
+
"@medusajs/framework": "2.11.1",
|
|
33
|
+
"@medusajs/icons": "^2.11.1",
|
|
34
|
+
"@medusajs/medusa": "2.11.1",
|
|
35
|
+
"@medusajs/test-utils": "2.11.1",
|
|
36
36
|
"@medusajs/ui": "4.0.4",
|
|
37
|
-
"@mikro-orm/cli": "6.4.3",
|
|
38
|
-
"@mikro-orm/core": "6.4.3",
|
|
39
|
-
"@mikro-orm/knex": "6.4.3",
|
|
40
|
-
"@mikro-orm/migrations": "6.4.3",
|
|
41
|
-
"@mikro-orm/postgresql": "6.4.3",
|
|
42
37
|
"@swc/core": "1.5.7",
|
|
43
38
|
"@types/node": "^20.0.0",
|
|
44
39
|
"@types/react": "^18.3.2",
|
|
45
40
|
"@types/react-dom": "^18.2.25",
|
|
46
|
-
"awilix": "^8.0.1",
|
|
47
|
-
"pg": "^8.13.0",
|
|
48
41
|
"prop-types": "^15.8.1",
|
|
49
42
|
"react": "^18.2.0",
|
|
50
43
|
"react-dom": "^18.2.0",
|
|
@@ -54,20 +47,13 @@
|
|
|
54
47
|
"yalc": "^1.0.0-pre.53"
|
|
55
48
|
},
|
|
56
49
|
"peerDependencies": {
|
|
57
|
-
"@medusajs/admin-sdk": "2.
|
|
58
|
-
"@medusajs/cli": "2.
|
|
59
|
-
"@medusajs/framework": "2.
|
|
60
|
-
"@medusajs/icons": "^2.
|
|
61
|
-
"@medusajs/medusa": "2.
|
|
62
|
-
"@medusajs/test-utils": "2.
|
|
63
|
-
"@medusajs/ui": "4.0.3"
|
|
64
|
-
"@mikro-orm/cli": "6.4.3",
|
|
65
|
-
"@mikro-orm/core": "6.4.3",
|
|
66
|
-
"@mikro-orm/knex": "6.4.3",
|
|
67
|
-
"@mikro-orm/migrations": "6.4.3",
|
|
68
|
-
"@mikro-orm/postgresql": "6.4.3",
|
|
69
|
-
"awilix": "^8.0.1",
|
|
70
|
-
"pg": "^8.13.0"
|
|
50
|
+
"@medusajs/admin-sdk": "2.11.1",
|
|
51
|
+
"@medusajs/cli": "2.11.1",
|
|
52
|
+
"@medusajs/framework": "2.11.1",
|
|
53
|
+
"@medusajs/icons": "^2.11.1",
|
|
54
|
+
"@medusajs/medusa": "2.11.1",
|
|
55
|
+
"@medusajs/test-utils": "2.11.1",
|
|
56
|
+
"@medusajs/ui": "4.0.3"
|
|
71
57
|
},
|
|
72
58
|
"engines": {
|
|
73
59
|
"node": ">=20"
|