@payloadcms/plugin-ecommerce 3.71.0-internal.ef75fa0 → 3.71.1
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/dist/collections/addresses/createAddressesCollection.d.ts +1 -1
- package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
- package/dist/collections/addresses/createAddressesCollection.js +1 -1
- package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.d.ts +2 -3
- package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.js +7 -3
- package/dist/collections/addresses/hooks/beforeChange.js.map +1 -1
- package/dist/collections/carts/beforeChange.d.ts.map +1 -1
- package/dist/collections/carts/beforeChange.js.map +1 -1
- package/dist/collections/carts/createCartsCollection.d.ts +21 -0
- package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
- package/dist/collections/carts/createCartsCollection.js +27 -2
- package/dist/collections/carts/createCartsCollection.js.map +1 -1
- package/dist/collections/carts/endpoints/addItem.d.ts +19 -0
- package/dist/collections/carts/endpoints/addItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/addItem.js +54 -0
- package/dist/collections/carts/endpoints/addItem.js.map +1 -0
- package/dist/collections/carts/endpoints/clearCart.d.ts +15 -0
- package/dist/collections/carts/endpoints/clearCart.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/clearCart.js +41 -0
- package/dist/collections/carts/endpoints/clearCart.js.map +1 -0
- package/dist/collections/carts/endpoints/mergeCart.d.ts +21 -0
- package/dist/collections/carts/endpoints/mergeCart.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/mergeCart.js +72 -0
- package/dist/collections/carts/endpoints/mergeCart.js.map +1 -0
- package/dist/collections/carts/endpoints/removeItem.d.ts +16 -0
- package/dist/collections/carts/endpoints/removeItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/removeItem.js +51 -0
- package/dist/collections/carts/endpoints/removeItem.js.map +1 -0
- package/dist/collections/carts/endpoints/updateItem.d.ts +40 -0
- package/dist/collections/carts/endpoints/updateItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/updateItem.js +95 -0
- package/dist/collections/carts/endpoints/updateItem.js.map +1 -0
- package/dist/collections/carts/hasCartSecretAccess.d.ts +2 -2
- package/dist/collections/carts/hasCartSecretAccess.js +3 -3
- package/dist/collections/carts/hasCartSecretAccess.js.map +1 -1
- package/dist/collections/carts/operations/addItem.d.ts +24 -0
- package/dist/collections/carts/operations/addItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/addItem.js +95 -0
- package/dist/collections/carts/operations/addItem.js.map +1 -0
- package/dist/collections/carts/operations/clearCart.d.ts +20 -0
- package/dist/collections/carts/operations/clearCart.d.ts.map +1 -0
- package/dist/collections/carts/operations/clearCart.js +53 -0
- package/dist/collections/carts/operations/clearCart.js.map +1 -0
- package/dist/collections/carts/operations/createRequestWithSecret.d.ts +11 -0
- package/dist/collections/carts/operations/createRequestWithSecret.d.ts.map +1 -0
- package/dist/collections/carts/operations/createRequestWithSecret.js +21 -0
- package/dist/collections/carts/operations/createRequestWithSecret.js.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.d.ts +19 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.d.ts.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.js +25 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.js.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +358 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +1 -0
- package/dist/collections/carts/operations/mergeCart.d.ts +54 -0
- package/dist/collections/carts/operations/mergeCart.d.ts.map +1 -0
- package/dist/collections/carts/operations/mergeCart.js +144 -0
- package/dist/collections/carts/operations/mergeCart.js.map +1 -0
- package/dist/collections/carts/operations/removeItem.d.ts +21 -0
- package/dist/collections/carts/operations/removeItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/removeItem.js +69 -0
- package/dist/collections/carts/operations/removeItem.js.map +1 -0
- package/dist/collections/carts/operations/types.d.ts +152 -0
- package/dist/collections/carts/operations/types.d.ts.map +1 -0
- package/dist/collections/carts/operations/types.js +7 -0
- package/dist/collections/carts/operations/types.js.map +1 -0
- package/dist/collections/carts/operations/updateItem.d.ts +41 -0
- package/dist/collections/carts/operations/updateItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/updateItem.js +110 -0
- package/dist/collections/carts/operations/updateItem.js.map +1 -0
- package/dist/collections/variants/createVariantsCollection/index.d.ts +4 -0
- package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/index.js +8 -2
- package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
- package/dist/endpoints/confirmOrder.d.ts.map +1 -1
- package/dist/endpoints/confirmOrder.js +9 -2
- package/dist/endpoints/confirmOrder.js.map +1 -1
- package/dist/endpoints/initiatePayment.d.ts.map +1 -1
- package/dist/endpoints/initiatePayment.js +8 -2
- package/dist/endpoints/initiatePayment.js.map +1 -1
- package/dist/exports/client/react.d.ts +1 -1
- package/dist/exports/client/react.d.ts.map +1 -1
- package/dist/exports/client/react.js +1 -1
- package/dist/exports/client/react.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.js +2 -2
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
- package/dist/react/provider/index.d.ts +5 -4
- package/dist/react/provider/index.d.ts.map +1 -1
- package/dist/react/provider/index.js +449 -265
- package/dist/react/provider/index.js.map +1 -1
- package/dist/translations/index.d.ts +3 -4
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/translations/index.js +80 -2
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts +89 -0
- package/dist/translations/languages/ar.d.ts.map +1 -0
- package/dist/translations/languages/ar.js +92 -0
- package/dist/translations/languages/ar.js.map +1 -0
- package/dist/translations/languages/az.d.ts +89 -0
- package/dist/translations/languages/az.d.ts.map +1 -0
- package/dist/translations/languages/az.js +92 -0
- package/dist/translations/languages/az.js.map +1 -0
- package/dist/translations/languages/bg.d.ts +89 -0
- package/dist/translations/languages/bg.d.ts.map +1 -0
- package/dist/translations/languages/bg.js +92 -0
- package/dist/translations/languages/bg.js.map +1 -0
- package/dist/translations/languages/ca.d.ts +89 -0
- package/dist/translations/languages/ca.d.ts.map +1 -0
- package/dist/translations/languages/ca.js +92 -0
- package/dist/translations/languages/ca.js.map +1 -0
- package/dist/translations/languages/cs.d.ts +89 -0
- package/dist/translations/languages/cs.d.ts.map +1 -0
- package/dist/translations/languages/cs.js +92 -0
- package/dist/translations/languages/cs.js.map +1 -0
- package/dist/translations/languages/da.d.ts +89 -0
- package/dist/translations/languages/da.d.ts.map +1 -0
- package/dist/translations/languages/da.js +92 -0
- package/dist/translations/languages/da.js.map +1 -0
- package/dist/translations/languages/de.d.ts +89 -0
- package/dist/translations/languages/de.d.ts.map +1 -0
- package/dist/translations/languages/de.js +92 -0
- package/dist/translations/languages/de.js.map +1 -0
- package/dist/translations/languages/en.d.ts +89 -0
- package/dist/translations/languages/en.d.ts.map +1 -0
- package/dist/translations/{en.js → languages/en.js} +5 -1
- package/dist/translations/languages/en.js.map +1 -0
- package/dist/translations/languages/es.d.ts +89 -0
- package/dist/translations/languages/es.d.ts.map +1 -0
- package/dist/translations/languages/es.js +92 -0
- package/dist/translations/languages/es.js.map +1 -0
- package/dist/translations/languages/et.d.ts +89 -0
- package/dist/translations/languages/et.d.ts.map +1 -0
- package/dist/translations/languages/et.js +92 -0
- package/dist/translations/languages/et.js.map +1 -0
- package/dist/translations/languages/fa.d.ts +89 -0
- package/dist/translations/languages/fa.d.ts.map +1 -0
- package/dist/translations/languages/fa.js +92 -0
- package/dist/translations/languages/fa.js.map +1 -0
- package/dist/translations/languages/fr.d.ts +89 -0
- package/dist/translations/languages/fr.d.ts.map +1 -0
- package/dist/translations/languages/fr.js +92 -0
- package/dist/translations/languages/fr.js.map +1 -0
- package/dist/translations/languages/he.d.ts +89 -0
- package/dist/translations/languages/he.d.ts.map +1 -0
- package/dist/translations/languages/he.js +92 -0
- package/dist/translations/languages/he.js.map +1 -0
- package/dist/translations/languages/hr.d.ts +89 -0
- package/dist/translations/languages/hr.d.ts.map +1 -0
- package/dist/translations/languages/hr.js +92 -0
- package/dist/translations/languages/hr.js.map +1 -0
- package/dist/translations/languages/hu.d.ts +89 -0
- package/dist/translations/languages/hu.d.ts.map +1 -0
- package/dist/translations/languages/hu.js +92 -0
- package/dist/translations/languages/hu.js.map +1 -0
- package/dist/translations/languages/hy.d.ts +89 -0
- package/dist/translations/languages/hy.d.ts.map +1 -0
- package/dist/translations/languages/hy.js +92 -0
- package/dist/translations/languages/hy.js.map +1 -0
- package/dist/translations/languages/is.d.ts +89 -0
- package/dist/translations/languages/is.d.ts.map +1 -0
- package/dist/translations/languages/is.js +92 -0
- package/dist/translations/languages/is.js.map +1 -0
- package/dist/translations/languages/it.d.ts +89 -0
- package/dist/translations/languages/it.d.ts.map +1 -0
- package/dist/translations/languages/it.js +92 -0
- package/dist/translations/languages/it.js.map +1 -0
- package/dist/translations/languages/ja.d.ts +89 -0
- package/dist/translations/languages/ja.d.ts.map +1 -0
- package/dist/translations/languages/ja.js +92 -0
- package/dist/translations/languages/ja.js.map +1 -0
- package/dist/translations/languages/ko.d.ts +89 -0
- package/dist/translations/languages/ko.d.ts.map +1 -0
- package/dist/translations/languages/ko.js +92 -0
- package/dist/translations/languages/ko.js.map +1 -0
- package/dist/translations/languages/lt.d.ts +89 -0
- package/dist/translations/languages/lt.d.ts.map +1 -0
- package/dist/translations/languages/lt.js +92 -0
- package/dist/translations/languages/lt.js.map +1 -0
- package/dist/translations/languages/my.d.ts +89 -0
- package/dist/translations/languages/my.d.ts.map +1 -0
- package/dist/translations/languages/my.js +92 -0
- package/dist/translations/languages/my.js.map +1 -0
- package/dist/translations/languages/nb.d.ts +89 -0
- package/dist/translations/languages/nb.d.ts.map +1 -0
- package/dist/translations/languages/nb.js +92 -0
- package/dist/translations/languages/nb.js.map +1 -0
- package/dist/translations/languages/nl.d.ts +89 -0
- package/dist/translations/languages/nl.d.ts.map +1 -0
- package/dist/translations/languages/nl.js +92 -0
- package/dist/translations/languages/nl.js.map +1 -0
- package/dist/translations/languages/pl.d.ts +89 -0
- package/dist/translations/languages/pl.d.ts.map +1 -0
- package/dist/translations/languages/pl.js +92 -0
- package/dist/translations/languages/pl.js.map +1 -0
- package/dist/translations/languages/pt.d.ts +89 -0
- package/dist/translations/languages/pt.d.ts.map +1 -0
- package/dist/translations/languages/pt.js +92 -0
- package/dist/translations/languages/pt.js.map +1 -0
- package/dist/translations/languages/ro.d.ts +89 -0
- package/dist/translations/languages/ro.d.ts.map +1 -0
- package/dist/translations/languages/ro.js +92 -0
- package/dist/translations/languages/ro.js.map +1 -0
- package/dist/translations/languages/rs.d.ts +89 -0
- package/dist/translations/languages/rs.d.ts.map +1 -0
- package/dist/translations/languages/rs.js +92 -0
- package/dist/translations/languages/rs.js.map +1 -0
- package/dist/translations/languages/rsLatin.d.ts +89 -0
- package/dist/translations/languages/rsLatin.d.ts.map +1 -0
- package/dist/translations/languages/rsLatin.js +92 -0
- package/dist/translations/languages/rsLatin.js.map +1 -0
- package/dist/translations/languages/ru.d.ts +89 -0
- package/dist/translations/languages/ru.d.ts.map +1 -0
- package/dist/translations/languages/ru.js +92 -0
- package/dist/translations/languages/ru.js.map +1 -0
- package/dist/translations/languages/sk.d.ts +89 -0
- package/dist/translations/languages/sk.d.ts.map +1 -0
- package/dist/translations/languages/sk.js +92 -0
- package/dist/translations/languages/sk.js.map +1 -0
- package/dist/translations/languages/sl.d.ts +89 -0
- package/dist/translations/languages/sl.d.ts.map +1 -0
- package/dist/translations/languages/sl.js +92 -0
- package/dist/translations/languages/sl.js.map +1 -0
- package/dist/translations/languages/sv.d.ts +89 -0
- package/dist/translations/languages/sv.d.ts.map +1 -0
- package/dist/translations/languages/sv.js +92 -0
- package/dist/translations/languages/sv.js.map +1 -0
- package/dist/translations/languages/ta.d.ts +89 -0
- package/dist/translations/languages/ta.d.ts.map +1 -0
- package/dist/translations/languages/ta.js +92 -0
- package/dist/translations/languages/ta.js.map +1 -0
- package/dist/translations/languages/th.d.ts +89 -0
- package/dist/translations/languages/th.d.ts.map +1 -0
- package/dist/translations/languages/th.js +92 -0
- package/dist/translations/languages/th.js.map +1 -0
- package/dist/translations/languages/tr.d.ts +89 -0
- package/dist/translations/languages/tr.d.ts.map +1 -0
- package/dist/translations/languages/tr.js +92 -0
- package/dist/translations/languages/tr.js.map +1 -0
- package/dist/translations/languages/uk.d.ts +89 -0
- package/dist/translations/languages/uk.d.ts.map +1 -0
- package/dist/translations/languages/uk.js +92 -0
- package/dist/translations/languages/uk.js.map +1 -0
- package/dist/translations/languages/vi.d.ts +89 -0
- package/dist/translations/languages/vi.d.ts.map +1 -0
- package/dist/translations/languages/vi.js +92 -0
- package/dist/translations/languages/vi.js.map +1 -0
- package/dist/translations/languages/zh.d.ts +89 -0
- package/dist/translations/languages/zh.d.ts.map +1 -0
- package/dist/translations/languages/zh.js +92 -0
- package/dist/translations/languages/zh.js.map +1 -0
- package/dist/translations/languages/zhTw.d.ts +89 -0
- package/dist/translations/languages/zhTw.d.ts.map +1 -0
- package/dist/translations/languages/zhTw.js +92 -0
- package/dist/translations/languages/zhTw.js.map +1 -0
- package/dist/translations/translation-schema.json +313 -5
- package/dist/translations/types.d.ts +89 -0
- package/dist/translations/types.d.ts.map +1 -0
- package/dist/translations/types.js +3 -0
- package/dist/translations/types.js.map +1 -0
- package/dist/types/index.d.ts +154 -14
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/utilities.d.ts +12 -2
- package/dist/types/utilities.d.ts.map +1 -1
- package/dist/types/utilities.js.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.js +6 -3
- package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
- package/package.json +16 -10
- package/dist/exports/translations.d.ts +0 -2
- package/dist/exports/translations.d.ts.map +0 -1
- package/dist/exports/translations.js +0 -3
- package/dist/exports/translations.js.map +0 -1
- package/dist/translations/en.d.ts +0 -3
- package/dist/translations/en.d.ts.map +0 -1
- package/dist/translations/en.js.map +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { removeItem } from '../operations/removeItem.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for removing items from a cart.
|
|
5
|
+
*
|
|
6
|
+
* Route: POST /api/{cartsSlug}/:id/remove-item
|
|
7
|
+
*
|
|
8
|
+
* Request body:
|
|
9
|
+
* - itemID: string (the cart item row ID to remove)
|
|
10
|
+
* - secret?: string (for guest cart access)
|
|
11
|
+
*/ export const removeItemEndpoint = ({ cartsSlug })=>({
|
|
12
|
+
handler: async (req)=>{
|
|
13
|
+
await addDataAndFileToRequest(req);
|
|
14
|
+
const cartID = req.routeParams?.id;
|
|
15
|
+
const data = req.data;
|
|
16
|
+
if (!cartID) {
|
|
17
|
+
return Response.json({
|
|
18
|
+
message: 'Cart ID is required',
|
|
19
|
+
success: false
|
|
20
|
+
}, {
|
|
21
|
+
status: 400
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (!data?.itemID) {
|
|
25
|
+
return Response.json({
|
|
26
|
+
message: 'Item ID is required',
|
|
27
|
+
success: false
|
|
28
|
+
}, {
|
|
29
|
+
status: 400
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const result = await removeItem({
|
|
33
|
+
cartID,
|
|
34
|
+
cartsSlug,
|
|
35
|
+
itemID: data.itemID,
|
|
36
|
+
payload: req.payload,
|
|
37
|
+
req,
|
|
38
|
+
secret: data.secret
|
|
39
|
+
});
|
|
40
|
+
if (!result.success) {
|
|
41
|
+
return Response.json(result, {
|
|
42
|
+
status: 404
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return Response.json(result);
|
|
46
|
+
},
|
|
47
|
+
method: 'post',
|
|
48
|
+
path: '/:id/remove-item'
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=removeItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/removeItem.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport { removeItem } from '../operations/removeItem.js'\n\ntype Args = {\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for removing items from a cart.\n *\n * Route: POST /api/{cartsSlug}/:id/remove-item\n *\n * Request body:\n * - itemID: string (the cart item row ID to remove)\n * - secret?: string (for guest cart access)\n */\nexport const removeItemEndpoint = ({ cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n itemID?: string\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n if (!data?.itemID) {\n return Response.json({ message: 'Item ID is required', success: false }, { status: 400 })\n }\n\n const result = await removeItem({\n cartID,\n cartsSlug,\n itemID: data.itemID,\n payload: req.payload,\n req,\n secret: data.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/remove-item',\n})\n"],"names":["addDataAndFileToRequest","removeItem","removeItemEndpoint","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","itemID","result","payload","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAEjD,SAASC,UAAU,QAAQ,8BAA6B;AAMxD;;;;;;;;CAQC,GACD,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACpEC,SAAS,OAAOC;YACd,MAAML,wBAAwBK;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAKrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAI,CAACL,MAAMM,QAAQ;gBACjB,OAAOL,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,MAAME,SAAS,MAAMf,WAAW;gBAC9BK;gBACAH;gBACAY,QAAQN,KAAKM,MAAM;gBACnBE,SAASZ,IAAIY,OAAO;gBACpBZ;gBACAa,QAAQT,KAAKS,MAAM;YACrB;YAEA,IAAI,CAACF,OAAOH,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACK,QAAQ;oBAAEF,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACK;QACvB;QACAG,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CollectionSlug, Endpoint } from 'payload';
|
|
2
|
+
type Args = {
|
|
3
|
+
cartsSlug: CollectionSlug;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Creates an endpoint handler for updating an item in a cart.
|
|
7
|
+
* Supports MongoDB-style operators for flexible updates.
|
|
8
|
+
*
|
|
9
|
+
* Route: POST /api/{cartsSlug}/:id/update-item
|
|
10
|
+
*
|
|
11
|
+
* Request body:
|
|
12
|
+
* - itemID: string (the cart item row ID to update)
|
|
13
|
+
* - quantity: number | { $inc: number } (set or increment/decrement)
|
|
14
|
+
* - removeOnZero?: boolean (defaults to true, removes item if quantity reaches 0)
|
|
15
|
+
* - secret?: string (for guest cart access)
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Set quantity to 5
|
|
20
|
+
* fetch('/api/carts/123/update-item', {
|
|
21
|
+
* method: 'POST',
|
|
22
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: 5 })
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* // Increment by 1
|
|
26
|
+
* fetch('/api/carts/123/update-item', {
|
|
27
|
+
* method: 'POST',
|
|
28
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: 1 } })
|
|
29
|
+
* })
|
|
30
|
+
*
|
|
31
|
+
* // Decrement by 1
|
|
32
|
+
* fetch('/api/carts/123/update-item', {
|
|
33
|
+
* method: 'POST',
|
|
34
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: -1 } })
|
|
35
|
+
* })
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const updateItemEndpoint: ({ cartsSlug }: Args) => Endpoint;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=updateItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/updateItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQvD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,kBAAkB,kBAAmB,IAAI,KAAG,QA6DvD,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { updateItem } from '../operations/updateItem.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for updating an item in a cart.
|
|
5
|
+
* Supports MongoDB-style operators for flexible updates.
|
|
6
|
+
*
|
|
7
|
+
* Route: POST /api/{cartsSlug}/:id/update-item
|
|
8
|
+
*
|
|
9
|
+
* Request body:
|
|
10
|
+
* - itemID: string (the cart item row ID to update)
|
|
11
|
+
* - quantity: number | { $inc: number } (set or increment/decrement)
|
|
12
|
+
* - removeOnZero?: boolean (defaults to true, removes item if quantity reaches 0)
|
|
13
|
+
* - secret?: string (for guest cart access)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* // Set quantity to 5
|
|
18
|
+
* fetch('/api/carts/123/update-item', {
|
|
19
|
+
* method: 'POST',
|
|
20
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: 5 })
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* // Increment by 1
|
|
24
|
+
* fetch('/api/carts/123/update-item', {
|
|
25
|
+
* method: 'POST',
|
|
26
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: 1 } })
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* // Decrement by 1
|
|
30
|
+
* fetch('/api/carts/123/update-item', {
|
|
31
|
+
* method: 'POST',
|
|
32
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: -1 } })
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/ export const updateItemEndpoint = ({ cartsSlug })=>({
|
|
36
|
+
handler: async (req)=>{
|
|
37
|
+
await addDataAndFileToRequest(req);
|
|
38
|
+
const cartID = req.routeParams?.id;
|
|
39
|
+
const data = req.data;
|
|
40
|
+
if (!cartID) {
|
|
41
|
+
return Response.json({
|
|
42
|
+
message: 'Cart ID is required',
|
|
43
|
+
success: false
|
|
44
|
+
}, {
|
|
45
|
+
status: 400
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!data?.itemID) {
|
|
49
|
+
return Response.json({
|
|
50
|
+
message: 'Item ID is required',
|
|
51
|
+
success: false
|
|
52
|
+
}, {
|
|
53
|
+
status: 400
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (data?.quantity === undefined) {
|
|
57
|
+
return Response.json({
|
|
58
|
+
message: 'Quantity is required',
|
|
59
|
+
success: false
|
|
60
|
+
}, {
|
|
61
|
+
status: 400
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Validate quantity format
|
|
65
|
+
const isValidQuantity = typeof data.quantity === 'number' || typeof data.quantity === 'object' && data.quantity !== null && '$inc' in data.quantity && typeof data.quantity.$inc === 'number';
|
|
66
|
+
if (!isValidQuantity) {
|
|
67
|
+
return Response.json({
|
|
68
|
+
message: 'Quantity must be a number or { $inc: number }',
|
|
69
|
+
success: false
|
|
70
|
+
}, {
|
|
71
|
+
status: 400
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const result = await updateItem({
|
|
75
|
+
cartID,
|
|
76
|
+
cartsSlug,
|
|
77
|
+
itemID: data.itemID,
|
|
78
|
+
payload: req.payload,
|
|
79
|
+
quantity: data.quantity,
|
|
80
|
+
removeOnZero: data.removeOnZero,
|
|
81
|
+
req,
|
|
82
|
+
secret: data.secret
|
|
83
|
+
});
|
|
84
|
+
if (!result.success) {
|
|
85
|
+
return Response.json(result, {
|
|
86
|
+
status: 404
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return Response.json(result);
|
|
90
|
+
},
|
|
91
|
+
method: 'post',
|
|
92
|
+
path: '/:id/update-item'
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=updateItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/updateItem.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { FieldWithOperator } from '../operations/types.js'\n\nimport { updateItem } from '../operations/updateItem.js'\n\ntype Args = {\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for updating an item in a cart.\n * Supports MongoDB-style operators for flexible updates.\n *\n * Route: POST /api/{cartsSlug}/:id/update-item\n *\n * Request body:\n * - itemID: string (the cart item row ID to update)\n * - quantity: number | { $inc: number } (set or increment/decrement)\n * - removeOnZero?: boolean (defaults to true, removes item if quantity reaches 0)\n * - secret?: string (for guest cart access)\n *\n * @example\n * ```ts\n * // Set quantity to 5\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: 5 })\n * })\n *\n * // Increment by 1\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: 1 } })\n * })\n *\n * // Decrement by 1\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: -1 } })\n * })\n * ```\n */\nexport const updateItemEndpoint = ({ cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n itemID?: string\n quantity?: FieldWithOperator<number>\n removeOnZero?: boolean\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n if (!data?.itemID) {\n return Response.json({ message: 'Item ID is required', success: false }, { status: 400 })\n }\n\n if (data?.quantity === undefined) {\n return Response.json({ message: 'Quantity is required', success: false }, { status: 400 })\n }\n\n // Validate quantity format\n const isValidQuantity =\n typeof data.quantity === 'number' ||\n (typeof data.quantity === 'object' &&\n data.quantity !== null &&\n '$inc' in data.quantity &&\n typeof data.quantity.$inc === 'number')\n\n if (!isValidQuantity) {\n return Response.json(\n {\n message: 'Quantity must be a number or { $inc: number }',\n success: false,\n },\n { status: 400 },\n )\n }\n\n const result = await updateItem({\n cartID,\n cartsSlug,\n itemID: data.itemID,\n payload: req.payload,\n quantity: data.quantity,\n removeOnZero: data.removeOnZero,\n req,\n secret: data.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/update-item',\n})\n"],"names":["addDataAndFileToRequest","updateItem","updateItemEndpoint","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","itemID","quantity","undefined","isValidQuantity","$inc","result","payload","removeOnZero","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAIjD,SAASC,UAAU,QAAQ,8BAA6B;AAMxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCC,GACD,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACpEC,SAAS,OAAOC;YACd,MAAML,wBAAwBK;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAOrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAI,CAACL,MAAMM,QAAQ;gBACjB,OAAOL,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAIL,MAAMO,aAAaC,WAAW;gBAChC,OAAOP,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAwBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YAC1F;YAEA,2BAA2B;YAC3B,MAAMI,kBACJ,OAAOT,KAAKO,QAAQ,KAAK,YACxB,OAAOP,KAAKO,QAAQ,KAAK,YACxBP,KAAKO,QAAQ,KAAK,QAClB,UAAUP,KAAKO,QAAQ,IACvB,OAAOP,KAAKO,QAAQ,CAACG,IAAI,KAAK;YAElC,IAAI,CAACD,iBAAiB;gBACpB,OAAOR,SAASC,IAAI,CAClB;oBACEC,SAAS;oBACTC,SAAS;gBACX,GACA;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,MAAMM,SAAS,MAAMnB,WAAW;gBAC9BK;gBACAH;gBACAY,QAAQN,KAAKM,MAAM;gBACnBM,SAAShB,IAAIgB,OAAO;gBACpBL,UAAUP,KAAKO,QAAQ;gBACvBM,cAAcb,KAAKa,YAAY;gBAC/BjB;gBACAkB,QAAQd,KAAKc,MAAM;YACrB;YAEA,IAAI,CAACH,OAAOP,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACS,QAAQ;oBAAEN,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACS;QACvB;QACAI,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Access } from 'payload';
|
|
2
2
|
/**
|
|
3
|
-
* Internal access function for guest cart access via secret
|
|
3
|
+
* Internal access function for guest cart access via secret in context or queries.
|
|
4
4
|
* Only active when allowGuestCarts is enabled.
|
|
5
5
|
*
|
|
6
6
|
* @param allowGuestCarts - Whether guest cart access is enabled
|
|
7
|
-
* @returns Access function that checks for valid cart secret in
|
|
7
|
+
* @returns Access function that checks for valid cart secret in context
|
|
8
8
|
*/
|
|
9
9
|
export declare const hasCartSecretAccess: (allowGuestCarts: boolean) => Access;
|
|
10
10
|
//# sourceMappingURL=hasCartSecretAccess.d.ts.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Internal access function for guest cart access via secret
|
|
2
|
+
* Internal access function for guest cart access via secret in context or queries.
|
|
3
3
|
* Only active when allowGuestCarts is enabled.
|
|
4
4
|
*
|
|
5
5
|
* @param allowGuestCarts - Whether guest cart access is enabled
|
|
6
|
-
* @returns Access function that checks for valid cart secret in
|
|
6
|
+
* @returns Access function that checks for valid cart secret in context
|
|
7
7
|
*/ export const hasCartSecretAccess = (allowGuestCarts)=>{
|
|
8
8
|
return ({ req })=>{
|
|
9
9
|
if (!allowGuestCarts) {
|
|
10
10
|
return false;
|
|
11
11
|
}
|
|
12
|
-
const cartSecret = req.query?.secret;
|
|
12
|
+
const cartSecret = req.context?.cartSecret ?? req.query?.secret;
|
|
13
13
|
if (!cartSecret || typeof cartSecret !== 'string') {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/carts/hasCartSecretAccess.ts"],"sourcesContent":["import type { Access } from 'payload'\n\n/**\n * Internal access function for guest cart access via secret
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/carts/hasCartSecretAccess.ts"],"sourcesContent":["import type { Access } from 'payload'\n\n/**\n * Internal access function for guest cart access via secret in context or queries.\n * Only active when allowGuestCarts is enabled.\n *\n * @param allowGuestCarts - Whether guest cart access is enabled\n * @returns Access function that checks for valid cart secret in context\n */\nexport const hasCartSecretAccess = (allowGuestCarts: boolean): Access => {\n return ({ req }) => {\n if (!allowGuestCarts) {\n return false\n }\n\n const cartSecret = req.context?.cartSecret ?? req.query?.secret\n\n if (!cartSecret || typeof cartSecret !== 'string') {\n return false\n }\n\n return {\n secret: {\n equals: cartSecret,\n },\n }\n }\n}\n"],"names":["hasCartSecretAccess","allowGuestCarts","req","cartSecret","context","query","secret","equals"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAAsB,CAACC;IAClC,OAAO,CAAC,EAAEC,GAAG,EAAE;QACb,IAAI,CAACD,iBAAiB;YACpB,OAAO;QACT;QAEA,MAAME,aAAaD,IAAIE,OAAO,EAAED,cAAcD,IAAIG,KAAK,EAAEC;QAEzD,IAAI,CAACH,cAAc,OAAOA,eAAe,UAAU;YACjD,OAAO;QACT;QAEA,OAAO;YACLG,QAAQ;gBACNC,QAAQJ;YACV;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AddItemArgs, CartOperationResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adds an item to a cart. If an item matching the same criteria already exists,
|
|
4
|
+
* its quantity is incremented instead of creating a duplicate entry.
|
|
5
|
+
*
|
|
6
|
+
* This handler is isolated and can be used from:
|
|
7
|
+
* - Custom endpoints
|
|
8
|
+
* - Local API operations
|
|
9
|
+
* - Hooks
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* // From an endpoint or hook
|
|
14
|
+
* const result = await addItem({
|
|
15
|
+
* payload,
|
|
16
|
+
* cartsSlug: 'carts',
|
|
17
|
+
* cartID: '123',
|
|
18
|
+
* item: { product: 'prod-1', variant: 'var-1' },
|
|
19
|
+
* quantity: 2,
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare const addItem: (args: AddItemArgs) => Promise<CartOperationResult>;
|
|
24
|
+
//# sourceMappingURL=addItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/addItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO,SAAgB,WAAW,KAAG,OAAO,CAAC,mBAAmB,CA8E5E,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createRequestWithSecret } from './createRequestWithSecret.js';
|
|
2
|
+
import { defaultCartItemMatcher } from './defaultCartItemMatcher.js';
|
|
3
|
+
/**
|
|
4
|
+
* Adds an item to a cart. If an item matching the same criteria already exists,
|
|
5
|
+
* its quantity is incremented instead of creating a duplicate entry.
|
|
6
|
+
*
|
|
7
|
+
* This handler is isolated and can be used from:
|
|
8
|
+
* - Custom endpoints
|
|
9
|
+
* - Local API operations
|
|
10
|
+
* - Hooks
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* // From an endpoint or hook
|
|
15
|
+
* const result = await addItem({
|
|
16
|
+
* payload,
|
|
17
|
+
* cartsSlug: 'carts',
|
|
18
|
+
* cartID: '123',
|
|
19
|
+
* item: { product: 'prod-1', variant: 'var-1' },
|
|
20
|
+
* quantity: 2,
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*/ export const addItem = async (args)=>{
|
|
24
|
+
const { cartID, cartItemMatcher = defaultCartItemMatcher, cartsSlug, item, payload, quantity = 1, req, secret } = args;
|
|
25
|
+
// Inject secret into request context for access control
|
|
26
|
+
const reqWithSecret = createRequestWithSecret(req, secret);
|
|
27
|
+
const cart = await payload.findByID({
|
|
28
|
+
id: cartID,
|
|
29
|
+
collection: cartsSlug,
|
|
30
|
+
depth: 0,
|
|
31
|
+
overrideAccess: false,
|
|
32
|
+
req: reqWithSecret
|
|
33
|
+
});
|
|
34
|
+
if (!cart) {
|
|
35
|
+
return {
|
|
36
|
+
cart: null,
|
|
37
|
+
message: `Cart with ID ${cartID} not found`,
|
|
38
|
+
success: false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const existingItems = cart.items || [];
|
|
42
|
+
// Find if item already exists using the matcher
|
|
43
|
+
const existingItemIndex = existingItems.findIndex((existingItem)=>cartItemMatcher({
|
|
44
|
+
existingItem,
|
|
45
|
+
newItem: item
|
|
46
|
+
}));
|
|
47
|
+
let updatedItems;
|
|
48
|
+
if (existingItemIndex !== -1) {
|
|
49
|
+
// Item exists - increment quantity
|
|
50
|
+
updatedItems = [
|
|
51
|
+
...existingItems
|
|
52
|
+
];
|
|
53
|
+
const existingItem = updatedItems[existingItemIndex];
|
|
54
|
+
updatedItems[existingItemIndex] = {
|
|
55
|
+
...existingItem,
|
|
56
|
+
quantity: existingItem.quantity + quantity
|
|
57
|
+
};
|
|
58
|
+
} else {
|
|
59
|
+
// Item doesn't exist - add new item
|
|
60
|
+
const newItem = {
|
|
61
|
+
product: item.product,
|
|
62
|
+
quantity,
|
|
63
|
+
...item.variant ? {
|
|
64
|
+
variant: item.variant
|
|
65
|
+
} : {},
|
|
66
|
+
// Spread any additional custom properties from the item
|
|
67
|
+
...Object.fromEntries(Object.entries(item).filter(([key])=>![
|
|
68
|
+
'product',
|
|
69
|
+
'quantity',
|
|
70
|
+
'variant'
|
|
71
|
+
].includes(key)))
|
|
72
|
+
};
|
|
73
|
+
updatedItems = [
|
|
74
|
+
...existingItems,
|
|
75
|
+
newItem
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
const updatedCart = await payload.update({
|
|
79
|
+
id: cartID,
|
|
80
|
+
collection: cartsSlug,
|
|
81
|
+
data: {
|
|
82
|
+
items: updatedItems
|
|
83
|
+
},
|
|
84
|
+
depth: 0,
|
|
85
|
+
overrideAccess: false,
|
|
86
|
+
req: reqWithSecret
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
cart: updatedCart,
|
|
90
|
+
message: existingItemIndex !== -1 ? 'Item quantity updated' : 'Item added to cart',
|
|
91
|
+
success: true
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=addItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/addItem.ts"],"sourcesContent":["import type { AddItemArgs, CartItemData, CartOperationResult } from './types.js'\n\nimport { createRequestWithSecret } from './createRequestWithSecret.js'\nimport { defaultCartItemMatcher } from './defaultCartItemMatcher.js'\n\n/**\n * Adds an item to a cart. If an item matching the same criteria already exists,\n * its quantity is incremented instead of creating a duplicate entry.\n *\n * This handler is isolated and can be used from:\n * - Custom endpoints\n * - Local API operations\n * - Hooks\n *\n * @example\n * ```ts\n * // From an endpoint or hook\n * const result = await addItem({\n * payload,\n * cartsSlug: 'carts',\n * cartID: '123',\n * item: { product: 'prod-1', variant: 'var-1' },\n * quantity: 2,\n * })\n * ```\n */\nexport const addItem = async (args: AddItemArgs): Promise<CartOperationResult> => {\n const {\n cartID,\n cartItemMatcher = defaultCartItemMatcher,\n cartsSlug,\n item,\n payload,\n quantity = 1,\n req,\n secret,\n } = args\n\n // Inject secret into request context for access control\n const reqWithSecret = createRequestWithSecret(req, secret)\n\n const cart = await payload.findByID({\n id: cartID,\n collection: cartsSlug,\n depth: 0,\n overrideAccess: false,\n req: reqWithSecret,\n })\n\n if (!cart) {\n return {\n cart: null,\n message: `Cart with ID ${cartID} not found`,\n success: false,\n }\n }\n\n const existingItems: CartItemData[] = (cart.items as CartItemData[]) || []\n\n // Find if item already exists using the matcher\n const existingItemIndex = existingItems.findIndex((existingItem) =>\n cartItemMatcher({ existingItem, newItem: item }),\n )\n\n let updatedItems: CartItemData[]\n\n if (existingItemIndex !== -1) {\n // Item exists - increment quantity\n updatedItems = [...existingItems]\n const existingItem = updatedItems[existingItemIndex]!\n updatedItems[existingItemIndex] = {\n ...existingItem,\n quantity: existingItem.quantity + quantity,\n }\n } else {\n // Item doesn't exist - add new item\n const newItem: CartItemData = {\n product: item.product,\n quantity,\n ...(item.variant ? { variant: item.variant } : {}),\n // Spread any additional custom properties from the item\n ...Object.fromEntries(\n Object.entries(item).filter(([key]) => !['product', 'quantity', 'variant'].includes(key)),\n ),\n }\n updatedItems = [...existingItems, newItem]\n }\n\n const updatedCart = await payload.update({\n id: cartID,\n collection: cartsSlug,\n data: {\n items: updatedItems,\n },\n depth: 0,\n overrideAccess: false,\n req: reqWithSecret,\n })\n\n return {\n cart: updatedCart,\n message: existingItemIndex !== -1 ? 'Item quantity updated' : 'Item added to cart',\n success: true,\n }\n}\n"],"names":["createRequestWithSecret","defaultCartItemMatcher","addItem","args","cartID","cartItemMatcher","cartsSlug","item","payload","quantity","req","secret","reqWithSecret","cart","findByID","id","collection","depth","overrideAccess","message","success","existingItems","items","existingItemIndex","findIndex","existingItem","newItem","updatedItems","product","variant","Object","fromEntries","entries","filter","key","includes","updatedCart","update","data"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,sBAAsB,QAAQ,8BAA6B;AAEpE;;;;;;;;;;;;;;;;;;;;CAoBC,GACD,OAAO,MAAMC,UAAU,OAAOC;IAC5B,MAAM,EACJC,MAAM,EACNC,kBAAkBJ,sBAAsB,EACxCK,SAAS,EACTC,IAAI,EACJC,OAAO,EACPC,WAAW,CAAC,EACZC,GAAG,EACHC,MAAM,EACP,GAAGR;IAEJ,wDAAwD;IACxD,MAAMS,gBAAgBZ,wBAAwBU,KAAKC;IAEnD,MAAME,OAAO,MAAML,QAAQM,QAAQ,CAAC;QAClCC,IAAIX;QACJY,YAAYV;QACZW,OAAO;QACPC,gBAAgB;QAChBR,KAAKE;IACP;IAEA,IAAI,CAACC,MAAM;QACT,OAAO;YACLA,MAAM;YACNM,SAAS,CAAC,aAAa,EAAEf,OAAO,UAAU,CAAC;YAC3CgB,SAAS;QACX;IACF;IAEA,MAAMC,gBAAgC,AAACR,KAAKS,KAAK,IAAuB,EAAE;IAE1E,gDAAgD;IAChD,MAAMC,oBAAoBF,cAAcG,SAAS,CAAC,CAACC,eACjDpB,gBAAgB;YAAEoB;YAAcC,SAASnB;QAAK;IAGhD,IAAIoB;IAEJ,IAAIJ,sBAAsB,CAAC,GAAG;QAC5B,mCAAmC;QACnCI,eAAe;eAAIN;SAAc;QACjC,MAAMI,eAAeE,YAAY,CAACJ,kBAAkB;QACpDI,YAAY,CAACJ,kBAAkB,GAAG;YAChC,GAAGE,YAAY;YACfhB,UAAUgB,aAAahB,QAAQ,GAAGA;QACpC;IACF,OAAO;QACL,oCAAoC;QACpC,MAAMiB,UAAwB;YAC5BE,SAASrB,KAAKqB,OAAO;YACrBnB;YACA,GAAIF,KAAKsB,OAAO,GAAG;gBAAEA,SAAStB,KAAKsB,OAAO;YAAC,IAAI,CAAC,CAAC;YACjD,wDAAwD;YACxD,GAAGC,OAAOC,WAAW,CACnBD,OAAOE,OAAO,CAACzB,MAAM0B,MAAM,CAAC,CAAC,CAACC,IAAI,GAAK,CAAC;oBAAC;oBAAW;oBAAY;iBAAU,CAACC,QAAQ,CAACD,MACrF;QACH;QACAP,eAAe;eAAIN;YAAeK;SAAQ;IAC5C;IAEA,MAAMU,cAAc,MAAM5B,QAAQ6B,MAAM,CAAC;QACvCtB,IAAIX;QACJY,YAAYV;QACZgC,MAAM;YACJhB,OAAOK;QACT;QACAV,OAAO;QACPC,gBAAgB;QAChBR,KAAKE;IACP;IAEA,OAAO;QACLC,MAAMuB;QACNjB,SAASI,sBAAsB,CAAC,IAAI,0BAA0B;QAC9DH,SAAS;IACX;AACF,EAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CartOperationResult, ClearCartArgs } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clears all items from a cart.
|
|
4
|
+
*
|
|
5
|
+
* This handler is isolated and can be used from:
|
|
6
|
+
* - Custom endpoints
|
|
7
|
+
* - Local API operations
|
|
8
|
+
* - Hooks
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const result = await clearCart({
|
|
13
|
+
* payload,
|
|
14
|
+
* cartsSlug: 'carts',
|
|
15
|
+
* cartID: '123',
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare const clearCart: (args: ClearCartArgs) => Promise<CartOperationResult>;
|
|
20
|
+
//# sourceMappingURL=clearCart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearCart.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/clearCart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAIpE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,SAAgB,aAAa,KAAG,OAAO,CAAC,mBAAmB,CAsChF,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createRequestWithSecret } from './createRequestWithSecret.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clears all items from a cart.
|
|
4
|
+
*
|
|
5
|
+
* This handler is isolated and can be used from:
|
|
6
|
+
* - Custom endpoints
|
|
7
|
+
* - Local API operations
|
|
8
|
+
* - Hooks
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const result = await clearCart({
|
|
13
|
+
* payload,
|
|
14
|
+
* cartsSlug: 'carts',
|
|
15
|
+
* cartID: '123',
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/ export const clearCart = async (args)=>{
|
|
19
|
+
const { cartID, cartsSlug, payload, req, secret } = args;
|
|
20
|
+
// Inject secret into request context for access control
|
|
21
|
+
const reqWithSecret = createRequestWithSecret(req, secret);
|
|
22
|
+
const cart = await payload.findByID({
|
|
23
|
+
id: cartID,
|
|
24
|
+
collection: cartsSlug,
|
|
25
|
+
depth: 0,
|
|
26
|
+
overrideAccess: false,
|
|
27
|
+
req: reqWithSecret
|
|
28
|
+
});
|
|
29
|
+
if (!cart) {
|
|
30
|
+
return {
|
|
31
|
+
cart: null,
|
|
32
|
+
message: `Cart with ID ${cartID} not found`,
|
|
33
|
+
success: false
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const updatedCart = await payload.update({
|
|
37
|
+
id: cartID,
|
|
38
|
+
collection: cartsSlug,
|
|
39
|
+
data: {
|
|
40
|
+
items: []
|
|
41
|
+
},
|
|
42
|
+
depth: 0,
|
|
43
|
+
overrideAccess: false,
|
|
44
|
+
req: reqWithSecret
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
cart: updatedCart,
|
|
48
|
+
message: 'Cart cleared',
|
|
49
|
+
success: true
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=clearCart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/clearCart.ts"],"sourcesContent":["import type { CartOperationResult, ClearCartArgs } from './types.js'\n\nimport { createRequestWithSecret } from './createRequestWithSecret.js'\n\n/**\n * Clears all items from a cart.\n *\n * This handler is isolated and can be used from:\n * - Custom endpoints\n * - Local API operations\n * - Hooks\n *\n * @example\n * ```ts\n * const result = await clearCart({\n * payload,\n * cartsSlug: 'carts',\n * cartID: '123',\n * })\n * ```\n */\nexport const clearCart = async (args: ClearCartArgs): Promise<CartOperationResult> => {\n const { cartID, cartsSlug, payload, req, secret } = args\n\n // Inject secret into request context for access control\n const reqWithSecret = createRequestWithSecret(req, secret)\n\n const cart = await payload.findByID({\n id: cartID,\n collection: cartsSlug,\n depth: 0,\n overrideAccess: false,\n req: reqWithSecret,\n })\n\n if (!cart) {\n return {\n cart: null,\n message: `Cart with ID ${cartID} not found`,\n success: false,\n }\n }\n\n const updatedCart = await payload.update({\n id: cartID,\n collection: cartsSlug,\n data: {\n items: [],\n },\n depth: 0,\n overrideAccess: false,\n req: reqWithSecret,\n })\n\n return {\n cart: updatedCart,\n message: 'Cart cleared',\n success: true,\n }\n}\n"],"names":["createRequestWithSecret","clearCart","args","cartID","cartsSlug","payload","req","secret","reqWithSecret","cart","findByID","id","collection","depth","overrideAccess","message","success","updatedCart","update","data","items"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,+BAA8B;AAEtE;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,MAAMC,YAAY,OAAOC;IAC9B,MAAM,EAAEC,MAAM,EAAEC,SAAS,EAAEC,OAAO,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGL;IAEpD,wDAAwD;IACxD,MAAMM,gBAAgBR,wBAAwBM,KAAKC;IAEnD,MAAME,OAAO,MAAMJ,QAAQK,QAAQ,CAAC;QAClCC,IAAIR;QACJS,YAAYR;QACZS,OAAO;QACPC,gBAAgB;QAChBR,KAAKE;IACP;IAEA,IAAI,CAACC,MAAM;QACT,OAAO;YACLA,MAAM;YACNM,SAAS,CAAC,aAAa,EAAEZ,OAAO,UAAU,CAAC;YAC3Ca,SAAS;QACX;IACF;IAEA,MAAMC,cAAc,MAAMZ,QAAQa,MAAM,CAAC;QACvCP,IAAIR;QACJS,YAAYR;QACZe,MAAM;YACJC,OAAO,EAAE;QACX;QACAP,OAAO;QACPC,gBAAgB;QAChBR,KAAKE;IACP;IAEA,OAAO;QACLC,MAAMQ;QACNF,SAAS;QACTC,SAAS;IACX;AACF,EAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PayloadRequest } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a modified request object with the cart secret injected into context.
|
|
4
|
+
* This allows the access control (hasCartSecretAccess) to properly verify guest cart access.
|
|
5
|
+
*
|
|
6
|
+
* @param req - The original PayloadRequest
|
|
7
|
+
* @param secret - The cart secret to inject
|
|
8
|
+
* @returns A new request object with the secret in context, or the original if no secret
|
|
9
|
+
*/
|
|
10
|
+
export declare const createRequestWithSecret: (req: PayloadRequest | undefined, secret: string | undefined) => PayloadRequest | undefined;
|
|
11
|
+
//# sourceMappingURL=createRequestWithSecret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRequestWithSecret.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/createRequestWithSecret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,QAC7B,cAAc,GAAG,SAAS,UACvB,MAAM,GAAG,SAAS,KACzB,cAAc,GAAG,SAYnB,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a modified request object with the cart secret injected into context.
|
|
3
|
+
* This allows the access control (hasCartSecretAccess) to properly verify guest cart access.
|
|
4
|
+
*
|
|
5
|
+
* @param req - The original PayloadRequest
|
|
6
|
+
* @param secret - The cart secret to inject
|
|
7
|
+
* @returns A new request object with the secret in context, or the original if no secret
|
|
8
|
+
*/ export const createRequestWithSecret = (req, secret)=>{
|
|
9
|
+
if (!secret || !req) {
|
|
10
|
+
return req;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
...req,
|
|
14
|
+
context: {
|
|
15
|
+
...req.context,
|
|
16
|
+
cartSecret: secret
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=createRequestWithSecret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/createRequestWithSecret.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\n/**\n * Creates a modified request object with the cart secret injected into context.\n * This allows the access control (hasCartSecretAccess) to properly verify guest cart access.\n *\n * @param req - The original PayloadRequest\n * @param secret - The cart secret to inject\n * @returns A new request object with the secret in context, or the original if no secret\n */\nexport const createRequestWithSecret = (\n req: PayloadRequest | undefined,\n secret: string | undefined,\n): PayloadRequest | undefined => {\n if (!secret || !req) {\n return req\n }\n\n return {\n ...req,\n context: {\n ...req.context,\n cartSecret: secret,\n },\n } as PayloadRequest\n}\n"],"names":["createRequestWithSecret","req","secret","context","cartSecret"],"mappings":"AAEA;;;;;;;CAOC,GACD,OAAO,MAAMA,0BAA0B,CACrCC,KACAC;IAEA,IAAI,CAACA,UAAU,CAACD,KAAK;QACnB,OAAOA;IACT;IAEA,OAAO;QACL,GAAGA,GAAG;QACNE,SAAS;YACP,GAAGF,IAAIE,OAAO;YACdC,YAAYF;QACd;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CartItemMatcher } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default cart item matcher that considers items identical if they have
|
|
4
|
+
* the same product ID and variant ID.
|
|
5
|
+
*
|
|
6
|
+
* Users can provide a custom matcher to add additional criteria such as
|
|
7
|
+
* delivery options, customizations, or other item-specific properties.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // Extend the default matcher to include a delivery option
|
|
12
|
+
* const customMatcher: CartItemMatcher = ({ existingItem, newItem }) => {
|
|
13
|
+
* const defaultMatch = defaultCartItemMatcher({ existingItem, newItem })
|
|
14
|
+
* return defaultMatch && existingItem.deliveryOption === newItem.deliveryOption
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare const defaultCartItemMatcher: CartItemMatcher;
|
|
19
|
+
//# sourceMappingURL=defaultCartItemMatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultCartItemMatcher.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/defaultCartItemMatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAiBpC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default cart item matcher that considers items identical if they have
|
|
3
|
+
* the same product ID and variant ID.
|
|
4
|
+
*
|
|
5
|
+
* Users can provide a custom matcher to add additional criteria such as
|
|
6
|
+
* delivery options, customizations, or other item-specific properties.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // Extend the default matcher to include a delivery option
|
|
11
|
+
* const customMatcher: CartItemMatcher = ({ existingItem, newItem }) => {
|
|
12
|
+
* const defaultMatch = defaultCartItemMatcher({ existingItem, newItem })
|
|
13
|
+
* return defaultMatch && existingItem.deliveryOption === newItem.deliveryOption
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/ export const defaultCartItemMatcher = ({ existingItem, newItem })=>{
|
|
17
|
+
const existingProductID = typeof existingItem.product === 'object' ? existingItem.product.id : existingItem.product;
|
|
18
|
+
const existingVariantID = existingItem.variant && typeof existingItem.variant === 'object' ? existingItem.variant.id : existingItem.variant;
|
|
19
|
+
const productMatches = existingProductID === newItem.product;
|
|
20
|
+
// Variant matching: both must have same variant or both must have no variant
|
|
21
|
+
const variantMatches = newItem.variant ? existingVariantID === newItem.variant : !existingVariantID;
|
|
22
|
+
return productMatches && variantMatches;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=defaultCartItemMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/defaultCartItemMatcher.ts"],"sourcesContent":["import type { CartItemMatcher } from './types.js'\n\n/**\n * Default cart item matcher that considers items identical if they have\n * the same product ID and variant ID.\n *\n * Users can provide a custom matcher to add additional criteria such as\n * delivery options, customizations, or other item-specific properties.\n *\n * @example\n * ```ts\n * // Extend the default matcher to include a delivery option\n * const customMatcher: CartItemMatcher = ({ existingItem, newItem }) => {\n * const defaultMatch = defaultCartItemMatcher({ existingItem, newItem })\n * return defaultMatch && existingItem.deliveryOption === newItem.deliveryOption\n * }\n * ```\n */\nexport const defaultCartItemMatcher: CartItemMatcher = ({ existingItem, newItem }) => {\n const existingProductID =\n typeof existingItem.product === 'object' ? existingItem.product.id : existingItem.product\n\n const existingVariantID =\n existingItem.variant && typeof existingItem.variant === 'object'\n ? existingItem.variant.id\n : existingItem.variant\n\n const productMatches = existingProductID === newItem.product\n\n // Variant matching: both must have same variant or both must have no variant\n const variantMatches = newItem.variant\n ? existingVariantID === newItem.variant\n : !existingVariantID\n\n return productMatches && variantMatches\n}\n"],"names":["defaultCartItemMatcher","existingItem","newItem","existingProductID","product","id","existingVariantID","variant","productMatches","variantMatches"],"mappings":"AAEA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMA,yBAA0C,CAAC,EAAEC,YAAY,EAAEC,OAAO,EAAE;IAC/E,MAAMC,oBACJ,OAAOF,aAAaG,OAAO,KAAK,WAAWH,aAAaG,OAAO,CAACC,EAAE,GAAGJ,aAAaG,OAAO;IAE3F,MAAME,oBACJL,aAAaM,OAAO,IAAI,OAAON,aAAaM,OAAO,KAAK,WACpDN,aAAaM,OAAO,CAACF,EAAE,GACvBJ,aAAaM,OAAO;IAE1B,MAAMC,iBAAiBL,sBAAsBD,QAAQE,OAAO;IAE5D,6EAA6E;IAC7E,MAAMK,iBAAiBP,QAAQK,OAAO,GAClCD,sBAAsBJ,QAAQK,OAAO,GACrC,CAACD;IAEL,OAAOE,kBAAkBC;AAC3B,EAAC"}
|