medusa-product-helper 0.0.7 → 0.0.9

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.
@@ -4,6 +4,18 @@ exports.GET = void 0;
4
4
  const wishlist_1 = require("../../../../modules/wishlist");
5
5
  const GET = async (req, res) => {
6
6
  try {
7
+ const authContext = req.auth_context;
8
+ const actorId = authContext?.actor_id;
9
+ const actorType = authContext?.actor_type;
10
+ if (!actorId) {
11
+ res.status(401).json({ message: "Unauthorized" });
12
+ return;
13
+ }
14
+ const adminActorTypes = ["user", "api-key"];
15
+ if (!actorType || !adminActorTypes.includes(actorType)) {
16
+ res.status(403).json({ message: "Only admin actors can access wishlist stats" });
17
+ return;
18
+ }
7
19
  const wishlistService = req.scope.resolve(wishlist_1.WISHLIST_MODULE);
8
20
  const productId = req.query.product_id;
9
21
  // If product_id is provided, return count for that product only
@@ -29,4 +41,4 @@ const GET = async (req, res) => {
29
41
  }
30
42
  };
31
43
  exports.GET = GET;
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3dpc2hsaXN0L3N0YXRzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJEQUE4RDtBQUd2RCxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzlELDBCQUFlLENBQ2hCLENBQUE7UUFFRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQWdDLENBQUE7UUFFNUQsZ0VBQWdFO1FBQ2hFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7WUFDbkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQTtZQUU1RCxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUNQLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsSUFBSSxDQUFDO2FBQzNDLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFeEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDaEQsT0FBTTtRQUNSLENBQUM7UUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUE7SUFDNUQsQ0FBQztBQUNILENBQUMsQ0FBQTtBQWxDWSxRQUFBLEdBQUcsT0FrQ2YifQ==
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3dpc2hsaXN0L3N0YXRzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJEQUE4RDtBQUd2RCxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBSSxHQUFXLENBQUMsWUFBWSxDQUFBO1FBQzdDLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxRQUFRLENBQUE7UUFDckMsTUFBTSxTQUFTLEdBQUcsV0FBVyxFQUFFLFVBQVUsQ0FBQTtRQUV6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFBO1lBQ2pELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw2Q0FBNkMsRUFBRSxDQUFDLENBQUE7WUFDaEYsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzlELDBCQUFlLENBQ2hCLENBQUE7UUFFRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQWdDLENBQUE7UUFFNUQsZ0VBQWdFO1FBQ2hFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7WUFDbkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQTtZQUU1RCxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUNQLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsSUFBSSxDQUFDO2FBQzNDLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFeEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDaEQsT0FBTTtRQUNSLENBQUM7UUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUE7SUFDNUQsQ0FBQztBQUNILENBQUMsQ0FBQTtBQWpEWSxRQUFBLEdBQUcsT0FpRGYifQ==
@@ -9,12 +9,17 @@ const DELETE = async (req, res) => {
9
9
  res.status(400).json({ message: "product_id is required" });
10
10
  return;
11
11
  }
12
- // Get customer ID from auth context
13
- const customerId = req.auth_context?.actor_id;
12
+ // Enforce that only authenticated customers can delete wishlist entries
13
+ const authContext = req.auth_context;
14
+ const customerId = authContext?.actor_id;
14
15
  if (!customerId) {
15
16
  res.status(401).json({ message: "Unauthorized" });
16
17
  return;
17
18
  }
19
+ if (authContext?.actor_type !== "customer") {
20
+ res.status(403).json({ message: "Only customers can remove wishlist items" });
21
+ return;
22
+ }
18
23
  // Execute remove from wishlist workflow
19
24
  const { result } = await (0, remove_from_wishlist_1.removeFromWishlistWorkflow)(req.scope).run({
20
25
  input: {
@@ -33,4 +38,4 @@ const DELETE = async (req, res) => {
33
38
  }
34
39
  };
35
40
  exports.DELETE = DELETE;
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3dpc2hsaXN0L1twcm9kdWN0X2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxRkFBdUY7QUFFaEYsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7UUFFakMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQTtZQUMzRCxPQUFNO1FBQ1IsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBSSxHQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQTtRQUV0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQTtZQUNqRCxPQUFNO1FBQ1IsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLGlEQUEwQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakUsS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixVQUFVLEVBQUUsVUFBVTthQUN2QjtTQUNGLENBQUMsQ0FBQTtRQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUNoRCxPQUFNO1FBQ1IsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBcENZLFFBQUEsTUFBTSxVQW9DbEIifQ==
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3dpc2hsaXN0L1twcm9kdWN0X2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxRkFBdUY7QUFFaEYsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7UUFFakMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQTtZQUMzRCxPQUFNO1FBQ1IsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxNQUFNLFdBQVcsR0FBSSxHQUFXLENBQUMsWUFBWSxDQUFBO1FBQzdDLE1BQU0sVUFBVSxHQUFHLFdBQVcsRUFBRSxRQUFRLENBQUE7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUE7WUFDakQsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsMENBQTBDLEVBQUUsQ0FBQyxDQUFBO1lBQzdFLE9BQU07UUFDUixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsaURBQTBCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNqRSxLQUFLLEVBQUU7Z0JBQ0wsV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLFVBQVUsRUFBRSxVQUFVO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQ2hELE9BQU07UUFDUixDQUFDO1FBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBO0lBQzVELENBQUM7QUFDSCxDQUFDLENBQUE7QUExQ1ksUUFBQSxNQUFNLFVBMENsQiJ9
@@ -8,12 +8,17 @@ const POST = async (req, res) => {
8
8
  try {
9
9
  // Validate request body
10
10
  const validated = validators_1.AddToWishlistSchema.parse(req.body);
11
- // Get customer ID from auth context
12
- const customerId = req.auth_context?.actor_id;
11
+ // Enforce that only authenticated customers can mutate wishlists
12
+ const authContext = req.auth_context;
13
+ const customerId = authContext?.actor_id;
13
14
  if (!customerId) {
14
15
  res.status(401).json({ message: "Unauthorized" });
15
16
  return;
16
17
  }
18
+ if (authContext?.actor_type !== "customer") {
19
+ res.status(403).json({ message: "Only customers can update wishlists" });
20
+ return;
21
+ }
17
22
  // Execute add to wishlist workflow
18
23
  const { result } = await (0, add_to_wishlist_1.addToWishlistWorkflow)(req.scope).run({
19
24
  input: {
@@ -34,12 +39,17 @@ const POST = async (req, res) => {
34
39
  exports.POST = POST;
35
40
  const GET = async (req, res) => {
36
41
  try {
37
- // Get customer ID from auth context
38
- const customerId = req.auth_context?.actor_id;
42
+ // Restrict wishlist reads to authenticated customers
43
+ const authContext = req.auth_context;
44
+ const customerId = authContext?.actor_id;
39
45
  if (!customerId) {
40
46
  res.status(401).json({ message: "Unauthorized" });
41
47
  return;
42
48
  }
49
+ if (authContext?.actor_type !== "customer") {
50
+ res.status(403).json({ message: "Only customers can read their wishlist" });
51
+ return;
52
+ }
43
53
  // Parse query parameters
44
54
  const includeDetails = req.query.include_details === "true" ||
45
55
  req.query.include_details === "1";
@@ -63,4 +73,4 @@ const GET = async (req, res) => {
63
73
  }
64
74
  };
65
75
  exports.GET = GET;
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3dpc2hsaXN0L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHdFQUEwRTtBQUMxRSxrRUFBcUU7QUFDckUsNkNBQWtEO0FBRTNDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLElBQUksQ0FBQztRQUNILHdCQUF3QjtRQUN4QixNQUFNLFNBQVMsR0FBRyxnQ0FBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXJELG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBSSxHQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQTtRQUV0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQTtZQUNqRCxPQUFNO1FBQ1IsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHVDQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDNUQsS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7YUFDakM7U0FDRixDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDaEQsT0FBTTtRQUNSLENBQUM7UUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUE7SUFDNUQsQ0FBQztBQUNILENBQUMsQ0FBQTtBQWhDWSxRQUFBLElBQUksUUFnQ2hCO0FBRU0sTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFJLEdBQVcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFBO1FBRXRELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFBO1lBQ2pELE9BQU07UUFDUixDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sY0FBYyxHQUNsQixHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsS0FBSyxNQUFNO1lBQ3BDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLEdBQUcsQ0FBQTtRQUVuQyxnQ0FBZ0M7UUFDaEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxrQ0FBbUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzFELEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsT0FBTyxFQUFFO29CQUNQLGNBQWMsRUFBRSxjQUFjO2lCQUMvQjthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQ2hELE9BQU07UUFDUixDQUFDO1FBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBO0lBQzVELENBQUM7QUFDSCxDQUFDLENBQUE7QUFwQ1ksUUFBQSxHQUFHLE9Bb0NmIn0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3dpc2hsaXN0L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHdFQUEwRTtBQUMxRSxrRUFBcUU7QUFDckUsNkNBQWtEO0FBRTNDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLElBQUksQ0FBQztRQUNILHdCQUF3QjtRQUN4QixNQUFNLFNBQVMsR0FBRyxnQ0FBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXJELGlFQUFpRTtRQUNqRSxNQUFNLFdBQVcsR0FBSSxHQUFXLENBQUMsWUFBWSxDQUFBO1FBQzdDLE1BQU0sVUFBVSxHQUFHLFdBQVcsRUFBRSxRQUFRLENBQUE7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUE7WUFDakQsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3hFLE9BQU07UUFDUixDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsdUNBQXFCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1RCxLQUFLLEVBQUU7Z0JBQ0wsV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTthQUNqQztTQUNGLENB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
@@ -1,40 +1,98 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWishlist = getWishlist;
4
- const wishlist_1 = require("../../modules/wishlist");
5
- /**
6
- * Helper function to get customer's wishlist
7
- * This function can be used directly by UI components without implementing the entire logic
8
- *
9
- * @param container - Medusa container instance
10
- * @param customerId - Customer ID
11
- * @param options - Options for getting wishlist
12
- * @returns Promise of wishlist items (IDs or full details based on options)
13
- *
14
- * @example
15
- * // Get only product IDs
16
- * const wishlist = await getWishlist(container, customerId)
17
- * // Returns: ['prod_123', 'prod_456']
18
- *
19
- * @example
20
- * // Get full product details
21
- * const wishlist = await getWishlist(container, customerId, { includeDetails: true })
22
- * // Returns: [{ product_id: 'prod_123', product: {...}, ... }]
23
- */
24
- async function getWishlist(container, customerId, options = {}) {
25
- const wishlistService = container.resolve(wishlist_1.WISHLIST_MODULE);
26
- const serviceOptions = {
27
- includeDetails: options.includeDetails ?? false,
28
- productIds: options.productIds,
3
+ exports.createWishlistHelpers = exports.createRemoveFromWishlist = exports.createAddToWishlist = exports.createGetWishlist = exports.removeFromWishlist = exports.addToWishlist = exports.getWishlist = void 0;
4
+ const WISHLIST_ENDPOINT = "/store/wishlist";
5
+ const normalizeBaseUrl = (baseUrl) => {
6
+ if (!baseUrl) {
7
+ return "";
8
+ }
9
+ return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
10
+ };
11
+ const getClientRequest = (client) => {
12
+ if (!client) {
13
+ return undefined;
14
+ }
15
+ if ("request" in client && typeof client.request === "function") {
16
+ return client.request.bind(client);
17
+ }
18
+ if ("client" in client && typeof client.client?.request === "function") {
19
+ return client.client.request.bind(client.client);
20
+ }
21
+ return undefined;
22
+ };
23
+ const execute = async (path, init, options) => {
24
+ const headers = {
25
+ ...(init.headers ?? {}),
26
+ ...(options.headers ?? {}),
27
+ };
28
+ const normalizedInit = {
29
+ ...init,
30
+ headers,
29
31
  };
30
- const wishlist = await wishlistService.getWishlist(customerId, serviceOptions);
31
- // If includeDetails is false, wishlist is an array of product IDs
32
- if (!options.includeDetails) {
33
- return wishlist;
34
- }
35
- // If includeDetails is true, we need to enrich with product details
36
- // For now, return the wishlist items as-is (they should already have details if includeDetails was true)
37
- // In a real implementation, you might want to use remote query to enrich here
38
- return wishlist;
39
- }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3NoYXJlZC93aXNobGlzdC9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4Q0Esa0NBeUJDO0FBdEVELHFEQUF3RDtBQTBCeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNJLEtBQUssVUFBVSxXQUFXLENBQy9CLFNBQXdCLEVBQ3hCLFVBQWtCLEVBQ2xCLFVBQW9DLEVBQUU7SUFFdEMsTUFBTSxlQUFlLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQzlELDBCQUFlLENBQ2hCLENBQUE7SUFFRCxNQUFNLGNBQWMsR0FBdUI7UUFDekMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksS0FBSztRQUMvQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7S0FDL0IsQ0FBQTtJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFFOUUsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUIsT0FBTyxRQUFvQixDQUFBO0lBQzdCLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUseUdBQXlHO0lBQ3pHLDhFQUE4RTtJQUM5RSxPQUFPLFFBQWtDLENBQUE7QUFDM0MsQ0FBQyJ9
32
+ const clientRequest = getClientRequest(options.client);
33
+ if (clientRequest) {
34
+ return (await clientRequest(path, normalizedInit));
35
+ }
36
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
37
+ if (!fetchImpl) {
38
+ throw new Error("No fetch implementation available. Provide `fetchImpl` or a Medusa client.");
39
+ }
40
+ const url = `${normalizeBaseUrl(options.baseUrl)}${path}`;
41
+ const response = await fetchImpl(url || path, normalizedInit);
42
+ if (!response.ok) {
43
+ const body = await response.text();
44
+ throw new Error(body || `Request failed with status ${response.status}`);
45
+ }
46
+ return (await response.json());
47
+ };
48
+ const getWishlist = async (input = {}, options = {}) => {
49
+ const params = new URLSearchParams();
50
+ if (input.includeDetails) {
51
+ params.set("include_details", "true");
52
+ }
53
+ const endpoint = params.toString()
54
+ ? `${WISHLIST_ENDPOINT}?${params.toString()}`
55
+ : WISHLIST_ENDPOINT;
56
+ return execute(endpoint, {
57
+ method: "GET",
58
+ }, options);
59
+ };
60
+ exports.getWishlist = getWishlist;
61
+ const addToWishlist = async (input, options = {}) => {
62
+ if (!input.product_id) {
63
+ throw new Error("product_id is required");
64
+ }
65
+ return execute(WISHLIST_ENDPOINT, {
66
+ method: "POST",
67
+ headers: {
68
+ "Content-Type": "application/json",
69
+ },
70
+ body: JSON.stringify({
71
+ product_id: input.product_id,
72
+ }),
73
+ }, options);
74
+ };
75
+ exports.addToWishlist = addToWishlist;
76
+ const removeFromWishlist = async (input, options = {}) => {
77
+ if (!input.product_id) {
78
+ throw new Error("product_id is required");
79
+ }
80
+ const endpoint = `${WISHLIST_ENDPOINT}/${encodeURIComponent(input.product_id)}`;
81
+ return execute(endpoint, {
82
+ method: "DELETE",
83
+ }, options);
84
+ };
85
+ exports.removeFromWishlist = removeFromWishlist;
86
+ const createGetWishlist = (options = {}) => (input) => (0, exports.getWishlist)(input, options);
87
+ exports.createGetWishlist = createGetWishlist;
88
+ const createAddToWishlist = (options = {}) => (input) => (0, exports.addToWishlist)(input, options);
89
+ exports.createAddToWishlist = createAddToWishlist;
90
+ const createRemoveFromWishlist = (options = {}) => (input) => (0, exports.removeFromWishlist)(input, options);
91
+ exports.createRemoveFromWishlist = createRemoveFromWishlist;
92
+ const createWishlistHelpers = (options = {}) => ({
93
+ getWishlist: (0, exports.createGetWishlist)(options),
94
+ addToWishlist: (0, exports.createAddToWishlist)(options),
95
+ removeFromWishlist: (0, exports.createRemoveFromWishlist)(options),
96
+ });
97
+ exports.createWishlistHelpers = createWishlistHelpers;
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3NoYXJlZC93aXNobGlzdC9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtBQXFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUM1QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtBQUMvRCxDQUFDLENBQUE7QUFFRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBeUIsRUFBRSxFQUFFO0lBQ3JELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUVELElBQUksUUFBUSxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3ZFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUNuQixJQUFZLEVBQ1os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
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWishlist = void 0;
3
+ exports.removeFromWishlist = exports.getWishlist = exports.createWishlistHelpers = exports.createRemoveFromWishlist = exports.createGetWishlist = exports.createAddToWishlist = exports.addToWishlist = void 0;
4
4
  var helper_1 = require("./helper");
5
+ Object.defineProperty(exports, "addToWishlist", { enumerable: true, get: function () { return helper_1.addToWishlist; } });
6
+ Object.defineProperty(exports, "createAddToWishlist", { enumerable: true, get: function () { return helper_1.createAddToWishlist; } });
7
+ Object.defineProperty(exports, "createGetWishlist", { enumerable: true, get: function () { return helper_1.createGetWishlist; } });
8
+ Object.defineProperty(exports, "createRemoveFromWishlist", { enumerable: true, get: function () { return helper_1.createRemoveFromWishlist; } });
9
+ Object.defineProperty(exports, "createWishlistHelpers", { enumerable: true, get: function () { return helper_1.createWishlistHelpers; } });
5
10
  Object.defineProperty(exports, "getWishlist", { enumerable: true, get: function () { return helper_1.getWishlist; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2hhcmVkL3dpc2hsaXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFzQztBQUE3QixxR0FBQSxXQUFXLE9BQUEifQ==
11
+ Object.defineProperty(exports, "removeFromWishlist", { enumerable: true, get: function () { return helper_1.removeFromWishlist; } });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2hhcmVkL3dpc2hsaXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQVFpQjtBQVBmLHVHQUFBLGFBQWEsT0FBQTtBQUNiLDZHQUFBLG1CQUFtQixPQUFBO0FBQ25CLDJHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLGtIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLCtHQUFBLHFCQUFxQixPQUFBO0FBQ3JCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLDRHQUFBLGtCQUFrQixPQUFBIn0=
package/README.md CHANGED
@@ -234,6 +234,12 @@ Configure rating-based filtering:
234
234
 
235
235
  The plugin includes a comprehensive wishlist feature that allows customers to save products they're interested in and admins to view wishlist statistics.
236
236
 
237
+ ### Security & Access Control
238
+
239
+ - Store-facing wishlist routes authenticate strictly as customers. Customer IDs are always derived from the session or JWT auth context and never taken from the request payload, so an admin or API client cannot spoof a customer identifier.
240
+ - Admin-facing wishlist statistics are available only to admin actors (`user` sessions or secret API keys). Customer tokens receive a `403` response when attempting to access `/admin/wishlist/stats`.
241
+ - This separation ensures only customers can manage their wishlist entries while only admins can inspect aggregate wishlist state.
242
+
237
243
  ### Module Registration
238
244
 
239
245
  The wishlist module is automatically registered when you add the plugin to your Medusa configuration. No additional configuration is required for basic usage.
@@ -422,59 +428,79 @@ curl "https://your-store.com/admin/wishlist/stats?product_id=prod_123" \
422
428
  -H "Authorization: Bearer ADMIN_TOKEN"
423
429
  ```
424
430
 
425
- ### Helper Function
431
+ ### Helper Functions
426
432
 
427
- The plugin provides a helper function that can be used directly by UI components without implementing the entire logic.
433
+ The plugin exposes lightweight helpers that wrap the Store API endpoints. They are ideal for server-side storefronts that need to call the wishlist endpoints while relying on the authenticated customer's session (no customer ID is ever passed in the payload).
428
434
 
429
- #### Import the Helper
435
+ #### Imports
430
436
 
431
437
  ```typescript
432
- import { getWishlist } from "medusa-product-helper/wishlist-helper"
438
+ import {
439
+ addToWishlist,
440
+ getWishlist,
441
+ removeFromWishlist,
442
+ createWishlistHelpers,
443
+ } from "medusa-product-helper/wishlist-helper"
433
444
  ```
434
445
 
435
- #### Usage Examples
446
+ #### Example Usage
436
447
 
437
- **Get only product IDs**:
438
448
  ```typescript
439
- import { getWishlist } from "medusa-product-helper/wishlist-helper"
449
+ // Add a product
450
+ await addToWishlist(
451
+ { product_id: "prod_123" },
452
+ {
453
+ baseUrl: "https://store.example.com",
454
+ headers: {
455
+ Cookie: "connect.sid=...", // or Authorization header
456
+ },
457
+ }
458
+ )
440
459
 
441
- // In your component or service
442
- const productIds = await getWishlist(container, customerId)
443
- // Returns: ['prod_123', 'prod_456']
460
+ // Read wishlist with details
461
+ const { wishlist } = await getWishlist(
462
+ { includeDetails: true },
463
+ {
464
+ baseUrl: "https://store.example.com",
465
+ headers: {
466
+ Cookie: "connect.sid=...",
467
+ },
468
+ }
469
+ )
470
+
471
+ // Remove a product
472
+ await removeFromWishlist(
473
+ { product_id: "prod_123" },
474
+ {
475
+ baseUrl: "https://store.example.com",
476
+ headers: {
477
+ Cookie: "connect.sid=...",
478
+ },
479
+ }
480
+ )
444
481
  ```
445
482
 
446
- **Get full product details**:
447
- ```typescript
448
- import { getWishlist } from "medusa-product-helper/wishlist-helper"
483
+ #### Configuration Options
449
484
 
450
- const wishlist = await getWishlist(container, customerId, {
451
- includeDetails: true
452
- })
453
- // Returns: [
454
- // {
455
- // product_id: 'prod_123',
456
- // product: { ... },
457
- // id: 'wish_123',
458
- // created_at: Date
459
- // },
460
- // ...
461
- // ]
462
- ```
485
+ All helper calls accept the following options:
463
486
 
464
- **Filter by specific products**:
465
- ```typescript
466
- import { getWishlist } from "medusa-product-helper/wishlist-helper"
487
+ - `client`: Medusa JS/SDK client instance. When provided, network requests are delegated to `client.request`.
488
+ - `baseUrl`: Base URL for the Store API (e.g., `https://store.example.com`). Required when a client is not provided.
489
+ - `fetchImpl`: Custom `fetch` implementation for SSR or React Native environments. Defaults to `globalThis.fetch`.
490
+ - `headers`: Additional headers appended to every request (useful for `Cookie` / `Authorization` headers).
467
491
 
468
- const wishlist = await getWishlist(container, customerId, {
469
- includeDetails: true,
470
- productIds: ['prod_123', 'prod_456']
471
- })
472
- ```
492
+ You can also generate pre-configured helpers:
473
493
 
474
- #### Helper Options
494
+ ```typescript
495
+ const wishlist = createWishlistHelpers({
496
+ baseUrl: "https://store.example.com",
497
+ headers: { Cookie: "connect.sid=..." },
498
+ })
475
499
 
476
- - `includeDetails` (boolean, default: `false`): If `true`, returns full product details. If `false`, returns only product IDs.
477
- - `productIds` (string[], optional): Filter wishlist by specific product IDs.
500
+ await wishlist.addToWishlist({ product_id: "prod_123" })
501
+ const { wishlist: items } = await wishlist.getWishlist({ includeDetails: true })
502
+ await wishlist.removeFromWishlist({ product_id: "prod_123" })
503
+ ```
478
504
 
479
505
  ### Using Workflows Directly
480
506
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-product-helper",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",