@rovela-ai/sdk 0.24.0 → 0.25.0
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/admin/api/index.d.ts +1 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +2 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/payment-providers.d.ts +69 -0
- package/dist/admin/api/payment-providers.d.ts.map +1 -0
- package/dist/admin/api/payment-providers.js +206 -0
- package/dist/admin/api/payment-providers.js.map +1 -0
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +4 -1
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +11 -2
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/PaymentProviderPanels.d.ts +3 -0
- package/dist/admin/components/PaymentProviderPanels.d.ts.map +1 -0
- package/dist/admin/components/PaymentProviderPanels.js +202 -0
- package/dist/admin/components/PaymentProviderPanels.js.map +1 -0
- package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
- package/dist/admin/components/PaymentSettings.js +2 -1
- package/dist/admin/components/PaymentSettings.js.map +1 -1
- package/dist/admin/components/index.d.ts +1 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +1 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/integrations/registry.d.ts.map +1 -1
- package/dist/admin/integrations/registry.js +5 -73
- package/dist/admin/integrations/registry.js.map +1 -1
- package/dist/checkout/api/index.d.ts +6 -0
- package/dist/checkout/api/index.d.ts.map +1 -1
- package/dist/checkout/api/index.js +6 -0
- package/dist/checkout/api/index.js.map +1 -1
- package/dist/checkout/api/manual.d.ts.map +1 -1
- package/dist/checkout/api/manual.js +5 -0
- package/dist/checkout/api/manual.js.map +1 -1
- package/dist/checkout/api/payment-methods.d.ts +22 -6
- package/dist/checkout/api/payment-methods.d.ts.map +1 -1
- package/dist/checkout/api/payment-methods.js +46 -6
- package/dist/checkout/api/payment-methods.js.map +1 -1
- package/dist/checkout/api/paypal-capture.d.ts +38 -0
- package/dist/checkout/api/paypal-capture.d.ts.map +1 -0
- package/dist/checkout/api/paypal-capture.js +126 -0
- package/dist/checkout/api/paypal-capture.js.map +1 -0
- package/dist/checkout/api/paypal-webhook.d.ts +24 -0
- package/dist/checkout/api/paypal-webhook.d.ts.map +1 -0
- package/dist/checkout/api/paypal-webhook.js +122 -0
- package/dist/checkout/api/paypal-webhook.js.map +1 -0
- package/dist/checkout/api/paypal.d.ts +30 -0
- package/dist/checkout/api/paypal.d.ts.map +1 -0
- package/dist/checkout/api/paypal.js +70 -0
- package/dist/checkout/api/paypal.js.map +1 -0
- package/dist/checkout/api/up2pay-ipn.d.ts +28 -0
- package/dist/checkout/api/up2pay-ipn.d.ts.map +1 -0
- package/dist/checkout/api/up2pay-ipn.js +88 -0
- package/dist/checkout/api/up2pay-ipn.js.map +1 -0
- package/dist/checkout/api/up2pay.d.ts +34 -0
- package/dist/checkout/api/up2pay.d.ts.map +1 -0
- package/dist/checkout/api/up2pay.js +82 -0
- package/dist/checkout/api/up2pay.js.map +1 -0
- package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
- package/dist/checkout/components/CheckoutFlow.js +38 -8
- package/dist/checkout/components/CheckoutFlow.js.map +1 -1
- package/dist/checkout/components/PayPalCheckoutButtons.d.ts +32 -0
- package/dist/checkout/components/PayPalCheckoutButtons.d.ts.map +1 -0
- package/dist/checkout/components/PayPalCheckoutButtons.js +116 -0
- package/dist/checkout/components/PayPalCheckoutButtons.js.map +1 -0
- package/dist/checkout/components/index.d.ts +2 -0
- package/dist/checkout/components/index.d.ts.map +1 -1
- package/dist/checkout/components/index.js +1 -0
- package/dist/checkout/components/index.js.map +1 -1
- package/dist/checkout/hooks/useCheckout.d.ts.map +1 -1
- package/dist/checkout/hooks/useCheckout.js +166 -0
- package/dist/checkout/hooks/useCheckout.js.map +1 -1
- package/dist/checkout/server/confirm-order.d.ts +54 -0
- package/dist/checkout/server/confirm-order.d.ts.map +1 -0
- package/dist/checkout/server/confirm-order.js +147 -0
- package/dist/checkout/server/confirm-order.js.map +1 -0
- package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
- package/dist/checkout/server/create-checkout-session.js +13 -0
- package/dist/checkout/server/create-checkout-session.js.map +1 -1
- package/dist/checkout/server/external-checkout.d.ts +68 -0
- package/dist/checkout/server/external-checkout.d.ts.map +1 -0
- package/dist/checkout/server/external-checkout.js +184 -0
- package/dist/checkout/server/external-checkout.js.map +1 -0
- package/dist/checkout/server/handle-webhook.js +6 -0
- package/dist/checkout/server/handle-webhook.js.map +1 -1
- package/dist/checkout/server/order-service.js +19 -0
- package/dist/checkout/server/order-service.js.map +1 -1
- package/dist/checkout/server/paypal.d.ts +127 -0
- package/dist/checkout/server/paypal.d.ts.map +1 -0
- package/dist/checkout/server/paypal.js +274 -0
- package/dist/checkout/server/paypal.js.map +1 -0
- package/dist/checkout/server/pricing.d.ts +2 -0
- package/dist/checkout/server/pricing.d.ts.map +1 -1
- package/dist/checkout/server/pricing.js +3 -0
- package/dist/checkout/server/pricing.js.map +1 -1
- package/dist/checkout/server/up2pay.d.ts +152 -0
- package/dist/checkout/server/up2pay.d.ts.map +1 -0
- package/dist/checkout/server/up2pay.js +287 -0
- package/dist/checkout/server/up2pay.js.map +1 -0
- package/dist/checkout/types.d.ts +28 -1
- package/dist/checkout/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +61 -32
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +96 -0
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +206 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +33 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/i18n/messages/en.d.ts.map +1 -1
- package/dist/core/i18n/messages/en.js +5 -0
- package/dist/core/i18n/messages/en.js.map +1 -1
- package/dist/core/i18n/messages/fr.d.ts.map +1 -1
- package/dist/core/i18n/messages/fr.js +5 -0
- package/dist/core/i18n/messages/fr.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/i18n.d.ts.map +1 -1
- package/dist/emails/i18n.js +4 -0
- package/dist/emails/i18n.js.map +1 -1
- package/dist/emails/send/orders.d.ts.map +1 -1
- package/dist/emails/send/orders.js +62 -0
- package/dist/emails/send/orders.js.map +1 -1
- package/dist/emails/sender.d.ts.map +1 -1
- package/dist/emails/sender.js +12 -0
- package/dist/emails/sender.js.map +1 -1
- package/dist/emails/templates/order-confirmation.d.ts.map +1 -1
- package/dist/emails/templates/order-confirmation.js +18 -0
- package/dist/emails/templates/order-confirmation.js.map +1 -1
- package/dist/emails/transport-smtp.d.ts +4 -0
- package/dist/emails/transport-smtp.d.ts.map +1 -1
- package/dist/emails/transport-smtp.js +9 -0
- package/dist/emails/transport-smtp.js.map +1 -1
- package/dist/emails/transport.d.ts +5 -0
- package/dist/emails/transport.d.ts.map +1 -1
- package/dist/emails/transport.js +3 -0
- package/dist/emails/transport.js.map +1 -1
- package/dist/emails/types.d.ts +21 -0
- package/dist/emails/types.d.ts.map +1 -1
- package/docs/changelog/epoch-11-order-extras.md +56 -0
- package/docs/changelog/epoch-12-payment-providers.md +105 -0
- package/package.json +25 -1
- package/templates/store-template/.claude/skills/build-feature/SKILL.md +2 -1
- package/templates/store-template/app/api/admin/payments/paypal/route.ts +10 -0
- package/templates/store-template/app/api/admin/payments/up2pay/route.ts +10 -0
- package/templates/store-template/app/api/checkout/paypal/capture/route.ts +8 -0
- package/templates/store-template/app/api/checkout/paypal/return/route.ts +9 -0
- package/templates/store-template/app/api/checkout/paypal/route.ts +9 -0
- package/templates/store-template/app/api/checkout/paypal/webhook/route.ts +9 -0
- package/templates/store-template/app/api/checkout/up2pay/ipn/route.ts +8 -0
- package/templates/store-template/app/api/checkout/up2pay/route.ts +9 -0
- package/templates/store-template/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../src/checkout/api/manual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAsCzD,SAAS,GAAG,CAAC,KAAa,EAAE,MAAM,GAAG,GAAG;IACtC,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,iBAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;AACnF,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA8B,CAAA;QAEhE,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QAErC,qEAAqE;QACrE,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,eAAe,GAAG,MAAM,uBAAuB,EAAE,CAAA;QAEvD,MAAM,kBAAkB,GAAG,QAAQ,EAAE,aAAa,IAAI,IAAI,CAAA;QAC1D,IAAI,CAAC,kBAAkB,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,OAAO,YAAY,CAAC,IAAI,CACtB;gBACE,KAAK,EAAE,yDAAyD;gBAChE,IAAI,EAAE,yBAAkC;aACzC,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACzC,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YACtE,OAAO,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,GAAG,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAA;QACzD,CAAC;QACD,yEAAyE;QACzE,sEAAsE;QACtE,wCAAwC;QACxC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YAChF,OAAO,GAAG,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAA;QACzD,CAAC;QAED,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,oDAAoD;QACpD,IAAI,KAAK,CAAA;QACT,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,UAAU,CACtB;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,WAAW,EAAE,qBAAqB;gBAClC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;gBACvC,UAAU,EAAE,eAAe,EAAE,EAAE,IAAI,IAAI;gBACvC,eAAe,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI;gBACjD,aAAa,EAAE,KAAK;aACrB,EACD,EAAE,QAAQ,EAAE,CACb,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EACtC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CACvB,CAAA;YACH,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;QAED,MAAM,aAAa,GAAuB,KAAK,CAAC,KAAK,CAAA;QACrD,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;QACzC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;QAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;QAEnC,4EAA4E;QAC5E,yEAAyE;QACzE,wDAAwD;QACxD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;QACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,MAAM,SAAS,GAAG,UAAU,OAAO,IAAI,UAAU,EAAE,EAAE,CAAA;QAErD,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,+BAA+B;QAC/B,MAAM,oBAAoB,GAAY,KAAK,CAAC,aAAa;YACvD,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,IAAI,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACxF,QAAQ,EACN,IAAI,CAAC,eAAe,EAAE,QAAQ;oBAC9B,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACpD,EAAE;gBACJ,GAAG,KAAK,CAAC,aAAa;aACvB;YACH,CAAC,CAAC,KAAK,CAAC,YAAY;gBAClB,CAAC,CAAC;oBACE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,IAAI,EAAE;oBAChD,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE;oBAC9C,GAAG,KAAK,CAAC,YAAY;oBACrB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK;iBACnC;gBACH,CAAC,CAAE,IAAI,CAAC,eAA2B,CAAA;QAEvC,sEAAsE;QACtE,yEAAyE;QACzE,MAAM,mBAAmB,GACvB,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAA;QAElF,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QAEvE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAuB,CAAC;YACvD,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,SAAS;YACpB,KAAK;YACL,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,aAAa;YACvB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,SAAS;YAC7C,cAAc,EAAE,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACzE,eAAe,EAAE,oBAAoB;YACrC,cAAc,EAAE,mBAAmB;YACnC,qBAAqB,EAAE,SAAS;YAChC,UAAU,EAAE,eAAe,EAAE,EAAE;YAC/B,cAAc,EAAE,KAAK,CAAC,kBAAkB;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,SAAS;YACrD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;YAC/B,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,QAAQ;YACzB,eAAe,EAAE,MAAM,CAAC,EAAE;YAC1B,kBAAkB,EAAE,MAAM,CAAC,IAAI;SAChC,CAAC,CAAA;QAEF,4EAA4E;QAC5E,uEAAuE;QACvE,6CAA6C;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,wBAAwB,CAAC;wBAC7B,UAAU,EAAE,OAAO,CAAC,EAAE;wBACtB,OAAO;wBACP,UAAU,EAAE,eAAe,EAAE,EAAE,IAAI,IAAI;wBACvC,KAAK;wBACL,WAAW,EAAE,OAAO,CAAC,WAAW;qBACjC,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,yEAAyE;QACzE,6BAA6B;QAC7B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;YAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAA;YACtD,uEAAuE;YACvE,uEAAuE;YACvE,yCAAyC;YACzC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/D,MAAM,UAAU,GAAqB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7D,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;gBAClD,QAAQ,EAAE,CAAC,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../src/checkout/api/manual.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
* Instructions are included so the confirmation UI can show them (they are
|
|
7
7
|
* merchant-authored customer-facing copy, not secrets).
|
|
8
8
|
*
|
|
9
|
+
* External payment PROVIDERS (SDK 0.25.0 — PayPal, Up2pay e-Transactions)
|
|
10
|
+
* surface here as SYNTHETIC entries (kind='external'), the way native
|
|
11
|
+
* Stripe is implicit: presence = configured + enabled in Admin → Payments,
|
|
12
|
+
* no payment_methods row to keep in sync with the enable toggle. The only
|
|
13
|
+
* config that crosses this public surface is PayPal's client id +
|
|
14
|
+
* environment — public by design (they parameterize the buttons script);
|
|
15
|
+
* secrets never leave the server.
|
|
16
|
+
*
|
|
9
17
|
* Usage:
|
|
10
18
|
* ```typescript
|
|
11
19
|
* // app/api/checkout/payment-methods/route.ts
|
|
@@ -13,13 +21,21 @@
|
|
|
13
21
|
* ```
|
|
14
22
|
*/
|
|
15
23
|
import { NextResponse } from 'next/server';
|
|
24
|
+
export interface PublicPaymentMethod {
|
|
25
|
+
id: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
name: string;
|
|
28
|
+
instructions: string | null;
|
|
29
|
+
/** 'paypal' | 'up2pay' on synthetic provider entries; absent on registry rows. */
|
|
30
|
+
provider?: 'paypal' | 'up2pay';
|
|
31
|
+
/** PayPal buttons parameters (public by design). */
|
|
32
|
+
paypal?: {
|
|
33
|
+
clientId: string;
|
|
34
|
+
environment: 'sandbox' | 'production';
|
|
35
|
+
};
|
|
36
|
+
}
|
|
16
37
|
export declare function GET(): Promise<NextResponse<{
|
|
17
38
|
success: boolean;
|
|
18
|
-
methods:
|
|
19
|
-
id: string;
|
|
20
|
-
kind: string;
|
|
21
|
-
name: string;
|
|
22
|
-
instructions: string | null;
|
|
23
|
-
}[];
|
|
39
|
+
methods: PublicPaymentMethod[];
|
|
24
40
|
}>>;
|
|
25
41
|
//# sourceMappingURL=payment-methods.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-methods.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/payment-methods.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"payment-methods.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/payment-methods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,oDAAoD;IACpD,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,SAAS,GAAG,YAAY,CAAA;KAAE,CAAA;CACrE;AAED,wBAAsB,GAAG;;;IAqDxB"}
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
* Instructions are included so the confirmation UI can show them (they are
|
|
7
7
|
* merchant-authored customer-facing copy, not secrets).
|
|
8
8
|
*
|
|
9
|
+
* External payment PROVIDERS (SDK 0.25.0 — PayPal, Up2pay e-Transactions)
|
|
10
|
+
* surface here as SYNTHETIC entries (kind='external'), the way native
|
|
11
|
+
* Stripe is implicit: presence = configured + enabled in Admin → Payments,
|
|
12
|
+
* no payment_methods row to keep in sync with the enable toggle. The only
|
|
13
|
+
* config that crosses this public surface is PayPal's client id +
|
|
14
|
+
* environment — public by design (they parameterize the buttons script);
|
|
15
|
+
* secrets never leave the server.
|
|
16
|
+
*
|
|
9
17
|
* Usage:
|
|
10
18
|
* ```typescript
|
|
11
19
|
* // app/api/checkout/payment-methods/route.ts
|
|
@@ -13,23 +21,55 @@
|
|
|
13
21
|
* ```
|
|
14
22
|
*/
|
|
15
23
|
import { NextResponse } from 'next/server';
|
|
16
|
-
import { findEnabledPaymentMethods } from '../../core/db/queries';
|
|
24
|
+
import { findEnabledPaymentMethods, findSettings } from '../../core/db/queries';
|
|
17
25
|
import { resolveCheckoutCustomer } from '../server/checkout-customer';
|
|
26
|
+
import { resolvePaypalCredentials } from '../server/paypal';
|
|
27
|
+
import { resolveUp2payCredentials } from '../server/up2pay';
|
|
18
28
|
export async function GET() {
|
|
19
29
|
try {
|
|
20
30
|
// Group-gated methods are hidden from guests and non-members — the group
|
|
21
31
|
// comes from the SESSION (resolveCheckoutCustomer), never from the client.
|
|
22
32
|
const customer = await resolveCheckoutCustomer();
|
|
23
33
|
const methods = await findEnabledPaymentMethods(customer?.groupId ?? null);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
const out = [];
|
|
35
|
+
// External providers render FIRST (card-adjacent), then manual methods.
|
|
36
|
+
// Each is guarded so a provider hiccup can never hide the others.
|
|
37
|
+
try {
|
|
38
|
+
const settings = await findSettings();
|
|
39
|
+
const paypal = resolvePaypalCredentials(settings);
|
|
40
|
+
if (paypal) {
|
|
41
|
+
out.push({
|
|
42
|
+
id: 'paypal',
|
|
43
|
+
kind: 'external',
|
|
44
|
+
provider: 'paypal',
|
|
45
|
+
name: 'PayPal',
|
|
46
|
+
instructions: null,
|
|
47
|
+
paypal: { clientId: paypal.clientId, environment: paypal.environment },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const up2pay = resolveUp2payCredentials(settings);
|
|
51
|
+
if (up2pay) {
|
|
52
|
+
out.push({
|
|
53
|
+
id: 'up2pay',
|
|
54
|
+
kind: 'external',
|
|
55
|
+
provider: 'up2pay',
|
|
56
|
+
name: 'Carte bancaire (Crédit Agricole)',
|
|
57
|
+
instructions: null,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.error('[Checkout Payment Methods API] provider resolution failed:', err);
|
|
63
|
+
}
|
|
64
|
+
for (const m of methods) {
|
|
65
|
+
out.push({
|
|
27
66
|
id: m.id,
|
|
28
67
|
kind: m.kind,
|
|
29
68
|
name: m.name,
|
|
30
69
|
instructions: m.instructions ?? null,
|
|
31
|
-
})
|
|
32
|
-
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return NextResponse.json({ success: true, methods: out });
|
|
33
73
|
}
|
|
34
74
|
catch (error) {
|
|
35
75
|
console.error('[Checkout Payment Methods API] list error:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-methods.js","sourceRoot":"","sources":["../../../src/checkout/api/payment-methods.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"payment-methods.js","sourceRoot":"","sources":["../../../src/checkout/api/payment-methods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAa3D,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,IAAI,CAAC;QACH,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,MAAM,uBAAuB,EAAE,CAAA;QAChD,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI,CAAC,CAAA;QAE1E,MAAM,GAAG,GAA0B,EAAE,CAAA;QAErC,wEAAwE;QACxE,kEAAkE;QAClE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;YACrC,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,IAAI;oBAClB,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;iBACvE,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,IAAI,EAAE,kCAAkC;oBACxC,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,GAAG,CAAC,CAAA;QAClF,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;aACrC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAA;QAClE,wEAAwE;QACxE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal-capture
|
|
3
|
+
*
|
|
4
|
+
* The PayPal proof-of-payment legs:
|
|
5
|
+
* - POST /api/checkout/paypal/capture — Smart Buttons onApprove leg.
|
|
6
|
+
* - GET /api/checkout/paypal/return — redirect-fallback return leg
|
|
7
|
+
* (PayPal appends ?token={paypalOrderId}), exported as ReturnGET.
|
|
8
|
+
*
|
|
9
|
+
* Both capture server-side then flip the pending order through the shared
|
|
10
|
+
* confirm helper (atomic claim — the two legs racing each other, or a
|
|
11
|
+
* webhook racing either, produce exactly one confirmation). The client
|
|
12
|
+
* never reports amounts; the capture's own amount is checked against the
|
|
13
|
+
* DB order.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // app/api/checkout/paypal/capture/route.ts
|
|
18
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal-capture'
|
|
19
|
+
* // app/api/checkout/paypal/return/route.ts
|
|
20
|
+
* export { ReturnGET as GET } from '@rovela-ai/sdk/checkout/api/paypal-capture'
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
24
|
+
import type { CheckoutApiError } from '../types';
|
|
25
|
+
interface PaypalCaptureResponse {
|
|
26
|
+
success: true;
|
|
27
|
+
orderId: string;
|
|
28
|
+
}
|
|
29
|
+
/** Smart Buttons onApprove leg. */
|
|
30
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<PaypalCaptureResponse | CheckoutApiError>>;
|
|
31
|
+
/**
|
|
32
|
+
* Redirect-fallback return leg. Always ends in a browser redirect: success →
|
|
33
|
+
* the success page (which clears the cart), anything else → back to checkout
|
|
34
|
+
* with the cart intact.
|
|
35
|
+
*/
|
|
36
|
+
export declare function ReturnGET(request: NextRequest): Promise<NextResponse>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=paypal-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal-capture.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/paypal-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAuDD,mCAAmC;AACnC,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC,CAgDjE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAsB3E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal-capture
|
|
3
|
+
*
|
|
4
|
+
* The PayPal proof-of-payment legs:
|
|
5
|
+
* - POST /api/checkout/paypal/capture — Smart Buttons onApprove leg.
|
|
6
|
+
* - GET /api/checkout/paypal/return — redirect-fallback return leg
|
|
7
|
+
* (PayPal appends ?token={paypalOrderId}), exported as ReturnGET.
|
|
8
|
+
*
|
|
9
|
+
* Both capture server-side then flip the pending order through the shared
|
|
10
|
+
* confirm helper (atomic claim — the two legs racing each other, or a
|
|
11
|
+
* webhook racing either, produce exactly one confirmation). The client
|
|
12
|
+
* never reports amounts; the capture's own amount is checked against the
|
|
13
|
+
* DB order.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // app/api/checkout/paypal/capture/route.ts
|
|
18
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal-capture'
|
|
19
|
+
* // app/api/checkout/paypal/return/route.ts
|
|
20
|
+
* export { ReturnGET as GET } from '@rovela-ai/sdk/checkout/api/paypal-capture'
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { NextResponse } from 'next/server';
|
|
24
|
+
import { findSettings } from '../../core/db/queries';
|
|
25
|
+
import { resolveStoreBaseUrl } from '../server/external-checkout';
|
|
26
|
+
import { resolvePaypalCredentials, capturePaypalOrder, PaypalApiError } from '../server/paypal';
|
|
27
|
+
import { confirmExternalOrderPaid } from '../server/confirm-order';
|
|
28
|
+
async function captureAndConfirm(paypalOrderId) {
|
|
29
|
+
const settings = await findSettings();
|
|
30
|
+
const credentials = resolvePaypalCredentials(settings);
|
|
31
|
+
if (!credentials)
|
|
32
|
+
return { kind: 'unavailable' };
|
|
33
|
+
const capture = await capturePaypalOrder(credentials, paypalOrderId);
|
|
34
|
+
if (capture.status !== 'COMPLETED') {
|
|
35
|
+
// Not captured (declined, or a pending review state). The order stays
|
|
36
|
+
// pending; PAYMENT.CAPTURE.COMPLETED via webhook confirms late captures.
|
|
37
|
+
console.warn(`[PayPal Capture] order ${paypalOrderId} status=${capture.status} — not confirming`);
|
|
38
|
+
return { kind: 'not_completed', status: capture.status };
|
|
39
|
+
}
|
|
40
|
+
if (!capture.invoiceId) {
|
|
41
|
+
console.error(`[PayPal Capture] COMPLETED capture without invoice_id for ${paypalOrderId}`);
|
|
42
|
+
return { kind: 'not_found' };
|
|
43
|
+
}
|
|
44
|
+
const result = await confirmExternalOrderPaid({
|
|
45
|
+
reference: capture.invoiceId,
|
|
46
|
+
expectedProvider: 'paypal',
|
|
47
|
+
providerLabel: 'PayPal',
|
|
48
|
+
paidAmountCents: capture.amountCents,
|
|
49
|
+
paidCurrency: capture.currency,
|
|
50
|
+
transaction: [
|
|
51
|
+
{ key: 'paypal_order_id', label: 'PayPal order', value: paypalOrderId },
|
|
52
|
+
...(capture.captureId
|
|
53
|
+
? [{ key: 'paypal_capture_id', label: 'PayPal capture', value: capture.captureId }]
|
|
54
|
+
: []),
|
|
55
|
+
...(capture.payerEmail
|
|
56
|
+
? [{ key: 'paypal_payer', label: 'PayPal payer', value: capture.payerEmail }]
|
|
57
|
+
: []),
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
switch (result.status) {
|
|
61
|
+
case 'confirmed':
|
|
62
|
+
case 'already_processed':
|
|
63
|
+
return { kind: 'paid', orderId: result.orderId };
|
|
64
|
+
case 'amount_mismatch':
|
|
65
|
+
return { kind: 'mismatch' };
|
|
66
|
+
default:
|
|
67
|
+
return { kind: 'not_found' };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Smart Buttons onApprove leg. */
|
|
71
|
+
export async function POST(request) {
|
|
72
|
+
try {
|
|
73
|
+
const body = (await request.json().catch(() => null));
|
|
74
|
+
const paypalOrderId = body?.paypalOrderId?.trim();
|
|
75
|
+
if (!paypalOrderId || paypalOrderId.length > 64) {
|
|
76
|
+
return NextResponse.json({ error: 'paypalOrderId is required', code: 'INVALID_REQUEST' }, { status: 400 });
|
|
77
|
+
}
|
|
78
|
+
const outcome = await captureAndConfirm(paypalOrderId);
|
|
79
|
+
switch (outcome.kind) {
|
|
80
|
+
case 'paid':
|
|
81
|
+
return NextResponse.json({ success: true, orderId: outcome.orderId });
|
|
82
|
+
case 'not_completed':
|
|
83
|
+
return NextResponse.json({
|
|
84
|
+
error: 'The payment was not completed. Please try again.',
|
|
85
|
+
code: 'PAYMENT_NOT_COMPLETED',
|
|
86
|
+
}, { status: 402 });
|
|
87
|
+
case 'unavailable':
|
|
88
|
+
return NextResponse.json({ error: 'This payment method is not available', code: 'INVALID_REQUEST' }, { status: 400 });
|
|
89
|
+
default:
|
|
90
|
+
return NextResponse.json({ error: 'This payment could not be confirmed.', code: 'CHECKOUT_ERROR' }, { status: 409 });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error instanceof PaypalApiError) {
|
|
95
|
+
console.error('[PayPal Capture API] PayPal error:', error.status, error.issue, error.body);
|
|
96
|
+
return NextResponse.json({ error: 'PayPal could not complete this payment.', code: 'CHECKOUT_ERROR' }, { status: 502 });
|
|
97
|
+
}
|
|
98
|
+
console.error('[PayPal Capture API] error:', error);
|
|
99
|
+
return NextResponse.json({ error: 'Failed to confirm the payment.', code: 'CHECKOUT_ERROR' }, { status: 500 });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Redirect-fallback return leg. Always ends in a browser redirect: success →
|
|
104
|
+
* the success page (which clears the cart), anything else → back to checkout
|
|
105
|
+
* with the cart intact.
|
|
106
|
+
*/
|
|
107
|
+
export async function ReturnGET(request) {
|
|
108
|
+
const base = resolveStoreBaseUrl(request.nextUrl.origin);
|
|
109
|
+
const paypalOrderId = request.nextUrl.searchParams.get('token')?.trim();
|
|
110
|
+
if (!paypalOrderId || paypalOrderId.length > 64) {
|
|
111
|
+
return NextResponse.redirect(`${base}/checkout?payment=failed`, 307);
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const outcome = await captureAndConfirm(paypalOrderId);
|
|
115
|
+
if (outcome.kind === 'paid') {
|
|
116
|
+
return NextResponse.redirect(`${base}/checkout/success?orderId=${encodeURIComponent(outcome.orderId)}`, 307);
|
|
117
|
+
}
|
|
118
|
+
console.warn(`[PayPal Return] capture outcome ${outcome.kind} for ${paypalOrderId}`);
|
|
119
|
+
return NextResponse.redirect(`${base}/checkout?payment=failed`, 307);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('[PayPal Return] error:', error);
|
|
123
|
+
return NextResponse.redirect(`${base}/checkout?payment=failed`, 307);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=paypal-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal-capture.js","sourceRoot":"","sources":["../../../src/checkout/api/paypal-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal-webhook
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal/webhook — the async BACKSTOP, never the primary
|
|
5
|
+
* payment path (the capture legs are). Confirms captures the client never
|
|
6
|
+
* reported (buyer closed the tab between approval and capture) and records
|
|
7
|
+
* PayPal-side refunds. Every event is verified through PayPal's
|
|
8
|
+
* verify-webhook-signature endpoint — which requires the merchant's
|
|
9
|
+
* webhook id (Admin → Payments → PayPal); without it events are
|
|
10
|
+
* acknowledged but IGNORED.
|
|
11
|
+
*
|
|
12
|
+
* Idempotent by construction: confirmation goes through the same atomic
|
|
13
|
+
* claim as the capture legs, and PayPal retries non-2xx up to 25 times
|
|
14
|
+
* over 3 days — so processed events always 200.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // app/api/checkout/paypal/webhook/route.ts
|
|
19
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal-webhook'
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
23
|
+
export declare function POST(request: NextRequest): Promise<NextResponse>;
|
|
24
|
+
//# sourceMappingURL=paypal-webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal-webhook.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/paypal-webhook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAsBvD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA4GtE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal-webhook
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal/webhook — the async BACKSTOP, never the primary
|
|
5
|
+
* payment path (the capture legs are). Confirms captures the client never
|
|
6
|
+
* reported (buyer closed the tab between approval and capture) and records
|
|
7
|
+
* PayPal-side refunds. Every event is verified through PayPal's
|
|
8
|
+
* verify-webhook-signature endpoint — which requires the merchant's
|
|
9
|
+
* webhook id (Admin → Payments → PayPal); without it events are
|
|
10
|
+
* acknowledged but IGNORED.
|
|
11
|
+
*
|
|
12
|
+
* Idempotent by construction: confirmation goes through the same atomic
|
|
13
|
+
* claim as the capture legs, and PayPal retries non-2xx up to 25 times
|
|
14
|
+
* over 3 days — so processed events always 200.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // app/api/checkout/paypal/webhook/route.ts
|
|
19
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal-webhook'
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { NextResponse } from 'next/server';
|
|
23
|
+
import { findSettings, findOrderByPaymentIntent, updateOrderStatus, updateOrderRefundAmount } from '../../core/db/queries';
|
|
24
|
+
import { resolvePaypalCredentials, verifyPaypalWebhook, readPaypalWebhookHeaders, } from '../server/paypal';
|
|
25
|
+
import { confirmExternalOrderPaid } from '../server/confirm-order';
|
|
26
|
+
export async function POST(request) {
|
|
27
|
+
try {
|
|
28
|
+
const rawBody = await request.text();
|
|
29
|
+
let event;
|
|
30
|
+
try {
|
|
31
|
+
event = JSON.parse(rawBody);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 });
|
|
35
|
+
}
|
|
36
|
+
const settings = await findSettings();
|
|
37
|
+
const credentials = resolvePaypalCredentials(settings);
|
|
38
|
+
if (!credentials) {
|
|
39
|
+
// Provider disabled/unconfigured but a webhook is still registered at
|
|
40
|
+
// PayPal — acknowledge so PayPal stops retrying, process nothing.
|
|
41
|
+
console.warn('[PayPal Webhook] event received while provider not configured — ignored');
|
|
42
|
+
return NextResponse.json({ received: true, ignored: true });
|
|
43
|
+
}
|
|
44
|
+
if (!credentials.webhookId) {
|
|
45
|
+
console.warn('[PayPal Webhook] no webhook id configured — event NOT verified, ignored. Set it in Admin → Payments → PayPal.');
|
|
46
|
+
return NextResponse.json({ received: true, ignored: true });
|
|
47
|
+
}
|
|
48
|
+
const verified = await verifyPaypalWebhook(credentials, credentials.webhookId, readPaypalWebhookHeaders(request.headers), event);
|
|
49
|
+
if (!verified) {
|
|
50
|
+
console.error('[PayPal Webhook] signature verification FAILED — nothing processed');
|
|
51
|
+
return NextResponse.json({ error: 'Verification failed' }, { status: 400 });
|
|
52
|
+
}
|
|
53
|
+
const resource = event.resource ?? {};
|
|
54
|
+
const reference = resource.invoice_id ?? resource.custom_id ?? null;
|
|
55
|
+
switch (event.event_type) {
|
|
56
|
+
case 'PAYMENT.CAPTURE.COMPLETED': {
|
|
57
|
+
if (!reference || !reference.startsWith('paypal_')) {
|
|
58
|
+
console.warn(`[PayPal Webhook] capture completed without a usable reference (${reference})`);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
const amountValue = resource.amount?.value;
|
|
62
|
+
const result = await confirmExternalOrderPaid({
|
|
63
|
+
reference,
|
|
64
|
+
expectedProvider: 'paypal',
|
|
65
|
+
providerLabel: 'PayPal',
|
|
66
|
+
paidAmountCents: amountValue != null ? Math.round(parseFloat(amountValue) * 100) : null,
|
|
67
|
+
paidCurrency: resource.amount?.currency_code ?? null,
|
|
68
|
+
transaction: [
|
|
69
|
+
...(resource.id
|
|
70
|
+
? [{ key: 'paypal_capture_id', label: 'PayPal capture', value: resource.id }]
|
|
71
|
+
: []),
|
|
72
|
+
...(resource.supplementary_data?.related_ids?.order_id
|
|
73
|
+
? [
|
|
74
|
+
{
|
|
75
|
+
key: 'paypal_order_id',
|
|
76
|
+
label: 'PayPal order',
|
|
77
|
+
value: resource.supplementary_data.related_ids.order_id,
|
|
78
|
+
},
|
|
79
|
+
]
|
|
80
|
+
: []),
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
console.log(`[PayPal Webhook] capture completed ref=${reference} → ${result.status}`);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'PAYMENT.CAPTURE.REFUNDED':
|
|
87
|
+
case 'PAYMENT.CAPTURE.REVERSED': {
|
|
88
|
+
if (!reference || !reference.startsWith('paypal_'))
|
|
89
|
+
break;
|
|
90
|
+
const order = await findOrderByPaymentIntent(reference);
|
|
91
|
+
if (!order || order.paymentProvider !== 'paypal')
|
|
92
|
+
break;
|
|
93
|
+
const refundValue = resource.amount?.value;
|
|
94
|
+
const refundCents = refundValue != null ? Math.round(parseFloat(refundValue) * 100) : null;
|
|
95
|
+
if (refundCents != null && refundCents > 0) {
|
|
96
|
+
await updateOrderRefundAmount(order.id, refundCents);
|
|
97
|
+
const totalCents = Math.round(parseFloat(order.total) * 100);
|
|
98
|
+
const priorRefundCents = order.refundAmount
|
|
99
|
+
? Math.round(parseFloat(order.refundAmount) * 100)
|
|
100
|
+
: 0;
|
|
101
|
+
if (priorRefundCents + refundCents >= totalCents && order.status !== 'refunded') {
|
|
102
|
+
await updateOrderStatus(order.id, 'refunded');
|
|
103
|
+
}
|
|
104
|
+
console.log(`[PayPal Webhook] refund recorded ref=${reference} amount=${refundCents} (prior ${priorRefundCents})`);
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case 'PAYMENT.CAPTURE.DENIED':
|
|
109
|
+
console.warn(`[PayPal Webhook] capture DENIED ref=${reference ?? 'unknown'} — order stays pending`);
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
// Unsubscribed/uninteresting event types are acknowledged silently.
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
return NextResponse.json({ received: true, event: event.event_type ?? null });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error('[PayPal Webhook] error:', error);
|
|
119
|
+
return NextResponse.json({ error: 'Webhook processing failed' }, { status: 500 });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=paypal-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal-webhook.js","sourceRoot":"","sources":["../../../src/checkout/api/paypal-webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal — start a PayPal payment. Creates the order
|
|
5
|
+
* 'pending' (server-priced, §55) and a matching PayPal order (Orders v2,
|
|
6
|
+
* invoice_id = our reference). The client either renders the Smart Buttons
|
|
7
|
+
* popup (paypalOrderId) or redirects to approveUrl (fallback). Payment
|
|
8
|
+
* truth arrives via the capture leg (checkout/api/paypal-capture) with the
|
|
9
|
+
* webhook as async backstop — never via this route.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // app/api/checkout/paypal/route.ts
|
|
14
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal'
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
18
|
+
import type { CheckoutApiError } from '../types';
|
|
19
|
+
export declare const PAYPAL_METHOD_LABEL = "PayPal";
|
|
20
|
+
interface PaypalCheckoutResponse {
|
|
21
|
+
success: true;
|
|
22
|
+
orderId: string;
|
|
23
|
+
reference: string;
|
|
24
|
+
paypalOrderId: string;
|
|
25
|
+
/** Hosted approval link — the no-JS redirect fallback. */
|
|
26
|
+
approveUrl: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<PaypalCheckoutResponse | CheckoutApiError>>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=paypal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/paypal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAOvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,eAAO,MAAM,mBAAmB,WAAW,CAAA;AAE3C,UAAU,sBAAsB;IAC9B,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,CAAC,CA6DlE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/api/paypal
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal — start a PayPal payment. Creates the order
|
|
5
|
+
* 'pending' (server-priced, §55) and a matching PayPal order (Orders v2,
|
|
6
|
+
* invoice_id = our reference). The client either renders the Smart Buttons
|
|
7
|
+
* popup (paypalOrderId) or redirects to approveUrl (fallback). Payment
|
|
8
|
+
* truth arrives via the capture leg (checkout/api/paypal-capture) with the
|
|
9
|
+
* webhook as async backstop — never via this route.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // app/api/checkout/paypal/route.ts
|
|
14
|
+
* export { POST } from '@rovela-ai/sdk/checkout/api/paypal'
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import { NextResponse } from 'next/server';
|
|
18
|
+
import { preparePendingExternalOrder, resolveStoreBaseUrl, } from '../server/external-checkout';
|
|
19
|
+
import { resolvePaypalCredentials, createPaypalOrder, PaypalApiError } from '../server/paypal';
|
|
20
|
+
export const PAYPAL_METHOD_LABEL = 'PayPal';
|
|
21
|
+
export async function POST(request) {
|
|
22
|
+
try {
|
|
23
|
+
const body = (await request.json());
|
|
24
|
+
const prepared = await preparePendingExternalOrder({
|
|
25
|
+
body,
|
|
26
|
+
provider: 'paypal',
|
|
27
|
+
providerLabel: PAYPAL_METHOD_LABEL,
|
|
28
|
+
});
|
|
29
|
+
if (!prepared.ok)
|
|
30
|
+
return prepared.response;
|
|
31
|
+
const credentials = resolvePaypalCredentials(prepared.settings);
|
|
32
|
+
if (!credentials) {
|
|
33
|
+
return NextResponse.json({ error: 'This payment method is not available', code: 'INVALID_REQUEST' }, { status: 400 });
|
|
34
|
+
}
|
|
35
|
+
const base = resolveStoreBaseUrl(request.nextUrl.origin);
|
|
36
|
+
// Pickup/relay orders snapshot a merchant/relay address — PayPal must not
|
|
37
|
+
// see it as the buyer's shipping address, so only DELIVERY addresses are
|
|
38
|
+
// forwarded (SET_PROVIDED_ADDRESS); everything else is NO_SHIPPING.
|
|
39
|
+
const deliveryAddress = !prepared.quote.pickupLocationId && !prepared.quote.relay
|
|
40
|
+
? prepared.orderShippingAddress
|
|
41
|
+
: null;
|
|
42
|
+
const paypalOrder = await createPaypalOrder({
|
|
43
|
+
credentials,
|
|
44
|
+
reference: prepared.reference,
|
|
45
|
+
totalCents: prepared.quote.totalCents,
|
|
46
|
+
currency: prepared.quote.currency,
|
|
47
|
+
storeName: prepared.settings?.storeName || 'Store',
|
|
48
|
+
returnUrl: `${base}/api/checkout/paypal/return`,
|
|
49
|
+
cancelUrl: `${base}/checkout?payment=cancelled`,
|
|
50
|
+
shippingAddress: deliveryAddress,
|
|
51
|
+
locale: prepared.orderLocale,
|
|
52
|
+
});
|
|
53
|
+
return NextResponse.json({
|
|
54
|
+
success: true,
|
|
55
|
+
orderId: prepared.orderId,
|
|
56
|
+
reference: prepared.reference,
|
|
57
|
+
paypalOrderId: paypalOrder.paypalOrderId,
|
|
58
|
+
approveUrl: paypalOrder.approveUrl,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof PaypalApiError) {
|
|
63
|
+
console.error('[PayPal Checkout API] PayPal error:', error.status, error.issue, error.body);
|
|
64
|
+
return NextResponse.json({ error: 'PayPal could not start this payment. Please try again.', code: 'CHECKOUT_ERROR' }, { status: 502 });
|
|
65
|
+
}
|
|
66
|
+
console.error('[PayPal Checkout API] error:', error);
|
|
67
|
+
return NextResponse.json({ error: 'Failed to start the payment. Please try again.', code: 'CHECKOUT_ERROR' }, { status: 500 });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=paypal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal.js","sourceRoot":"","sources":["../../../src/checkout/api/paypal.ts"],"names":[],"mappings":"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"}
|