paypal #93

Merged
russellballestrini merged 21 commits from feature/Paypal_checkout into master 2025-12-22 17:29:52 -05:00
russellballestrini commented 2025-12-22 14:32:37 -05:00 (Migrated from git2.unturf.com)

Summary by CodeRabbit

  • New Features

    • PayPal and Adyen added as checkout options (saved PayPal methods, disconnect flow, per-shop settings).
    • Per-shop masonry toggle for CSS Grid Lanes.
    • Play-button overlay on unlocked video thumbnails.
    • Enhanced meta tags (Twitter cards) and longer meta descriptions for better link unfurling.
  • Documentation

    • New PayPal and Adyen docs and a project CHANGELOG.
  • Tests

    • Extensive PayPal/Adyen test coverage and sandbox tests added.
  • Chores

    • Database migrations and dependency additions for PayPal/Adyen.

✏️ Tip: You can customize this high-level summary in your review settings.

<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * PayPal and Adyen added as checkout options (saved PayPal methods, disconnect flow, per-shop settings). * Per-shop masonry toggle for CSS Grid Lanes. * Play-button overlay on unlocked video thumbnails. * Enhanced meta tags (Twitter cards) and longer meta descriptions for better link unfurling. * **Documentation** * New PayPal and Adyen docs and a project CHANGELOG. * **Tests** * Extensive PayPal/Adyen test coverage and sandbox tests added. * **Chores** * Database migrations and dependency additions for PayPal/Adyen. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
russellballestrini commented 2025-12-22 14:32:37 -05:00 (Migrated from git2.unturf.com)

requested review from @russellballestrini

requested review from @russellballestrini
russellballestrini commented 2025-12-22 14:32:37 -05:00 (Migrated from git2.unturf.com)

assigned to @russellballestrini

assigned to @russellballestrini
coderabbitai commented 2025-12-22 14:32:46 -05:00 (Migrated from git2.unturf.com)

Walkthrough

Adds PayPal and Adyen payment integrations: new PayPalUserShop model, Shop and Invoice fields, PayPal checkout and management UI, webhook handlers for PayPal and Stripe, request flags, migrations, SDK dependency, templates, extensive tests, and docs.

Changes

Cohort / File(s) Change Summary
Documentation
CHANGELOG.rst, README.rst, docs/PAYPAL.md, docs/ADYEN.md
Adds CHANGELOG entry (2025-12-22) describing PayPal integration, grid/thumbnail/meta updates; updates README payment methods; adds detailed PayPal and Adyen docs.
Configuration
development.ini, test.ini
Adds PayPal config keys (app.paypal.sandbox_mode, app.paypal.webhook_id, app.payments.paypal.enabled) and enables PayPal sandbox in tests.
Models & Meta
make_post_sell/models/__init__.py, make_post_sell/models/meta.py, make_post_sell/models/paypal_user_shop.py, make_post_sell/models/shop.py, make_post_sell/models/invoice.py
New PayPalUserShop model and export; CLASS_TO_TABLE mapping updated. Shop gains PayPal and Adyen credential fields, enabled flags, readiness properties, SDK accessors, and paypal_user_shop(user). Invoice gains PayPal/Stripe/Adyen tracking columns, payment_method resolution, and lookup helpers.
Request Methods
make_post_sell/request_methods.py
Adds reified request methods: paypal_enabled, paypal_globally_enabled, adyen_enabled, adyen_globally_enabled.
Routes
make_post_sell/routes.py
Registers new routes: /billing/disconnect-paypal, /paypal/create-order/{cart_id}, /paypal/complete-checkout/{cart_id}, /adyen/create-session/{cart_id}, /adyen/complete-checkout/{cart_id}, and webhook endpoints for PayPal/Stripe/Adyen.
Templates
make_post_sell/templates/billing.j2, make_post_sell/templates/cart_checkout.j2, make_post_sell/templates/shop_settings.j2
Adds PayPal saved-method UI and disconnect form to billing; integrates PayPal SDK/button, vaulting, multi-shop order handling and CSRF-safe submit in cart checkout; adds PayPal and Adyen settings blocks (with JS toggles) to shop settings.
Views
make_post_sell/views/billing.py, make_post_sell/views/cart.py, make_post_sell/views/webhooks.py, make_post_sell/views/shop.py
Billing view exposes paypal_user_shop and implements disconnect_paypal. Cart view adds paypal_create_order and paypal_complete_checkout flows. New webhooks.py implements PayPal and Stripe webhook handlers with verification, idempotency, invoice updates, unlocks, and email dispatch. Shop view handles Adyen settings form.
Database Migrations
make_post_sell/scripts/alembic/versions/418933067d81_add_paypal_credentials_to_shop.py, .../3734955e7379_add_adyen_payment_columns_to_shop_and_.py, .../63d935094f97_add_stripe_payment_tracking_columns_to_.py
Migrations add/remove PayPal columns on mps_shop and mps_invoice, add Adyen columns on mps_shop and mps_invoice, and add Stripe tracking columns on mps_invoice.
Dependencies
requirements.py3.txt
Adds paypalrestsdk dependency.
Tests
make_post_sell/tests/test_functional.py, make_post_sell/tests/test_integration.py, make_post_sell/tests/test_models.py
Adds numerous PayPal-focused unit, functional, and integration tests (credential persistence, endpoints, sandbox API flows, PayPalUserShop constraints, invoice linkage). Some duplicated tests found in integration suite; updates existing checkout expectations.
UI Notes
CHANGELOG.rst
Documents CSS Grid Lanes toggle, video thumbnail overlay styling, and extended meta description length.

Sequence Diagram(s)

sequenceDiagram
    participant Client as Client / Browser
    participant Server as App Server
    participant PayPal as PayPal API
    participant DB as Database

    Client->>Server: POST /paypal/create-order/{cart_id}
    activate Server
    Server->>DB: Fetch cart & shop items
    Server->>PayPal: Create order(s) per-shop via SDK
    PayPal-->>Server: Respond with order ID(s)
    Server-->>Client: JSON {order_id, order_ids}
    deactivate Server

    Client->>PayPal: User approves payment (PayPal UI)
    PayPal-->>Client: Approval token/response

    Client->>Server: POST /paypal/complete-checkout/{cart_id} (order IDs)
    activate Server
    Server->>PayPal: Capture order(s)
    PayPal-->>Server: Capture responses
    Server->>DB: Create/update Invoice(s), set paypal_order_id/paypal_capture_id, handle vaulting
    Server-->>Client: Redirect (success/failure)
    deactivate Server
sequenceDiagram
    participant PayPal as PayPal (Event Source)
    participant Server as Webhook Handler
    participant DB as Database
    participant Email as Email Service

    PayPal->>Server: POST /webhooks/paypal (event)
    activate Server
    Server->>Server: Verify signature
    Server->>DB: Lookup Invoice by paypal_order_id
    alt Invoice found and not processed
        Server->>DB: Update invoice (set capture id, mark paid)
        Server->>DB: Unlock user products
        Server->>Email: Send purchase/sale emails
        Server-->>PayPal: 200 OK
    else Invoice missing or already processed
        Server-->>PayPal: 200 OK (no retry)
    end
    deactivate Server

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes


📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Free

📥 Commits

Reviewing files that changed from the base of the PR and between a2e2092a31 and 4210bc1421.

📒 Files selected for processing (13)
  • docs/ADYEN.md
  • make_post_sell/models/invoice.py
  • make_post_sell/models/shop.py
  • make_post_sell/request_methods.py
  • make_post_sell/routes.py
  • make_post_sell/scripts/alembic/versions/3734955e7379_add_adyen_payment_columns_to_shop_and_.py
  • make_post_sell/templates/shop_settings.j2
  • make_post_sell/tests/test_functional.py
  • make_post_sell/tests/test_integration.py
  • make_post_sell/tests/test_models.py
  • make_post_sell/views/cart.py
  • make_post_sell/views/shop.py
  • make_post_sell/views/webhooks.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • make_post_sell/models/invoice.py

📝 NOTE

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough Adds PayPal and Adyen payment integrations: new PayPalUserShop model, Shop and Invoice fields, PayPal checkout and management UI, webhook handlers for PayPal and Stripe, request flags, migrations, SDK dependency, templates, extensive tests, and docs. ## Changes | Cohort / File(s) | Change Summary | |---|---| | **Documentation** <br> `CHANGELOG.rst`, `README.rst`, `docs/PAYPAL.md`, `docs/ADYEN.md` | Adds CHANGELOG entry (2025-12-22) describing PayPal integration, grid/thumbnail/meta updates; updates README payment methods; adds detailed PayPal and Adyen docs. | | **Configuration** <br> `development.ini`, `test.ini` | Adds PayPal config keys (`app.paypal.sandbox_mode`, `app.paypal.webhook_id`, `app.payments.paypal.enabled`) and enables PayPal sandbox in tests. | | **Models & Meta** <br> `make_post_sell/models/__init__.py`, `make_post_sell/models/meta.py`, `make_post_sell/models/paypal_user_shop.py`, `make_post_sell/models/shop.py`, `make_post_sell/models/invoice.py` | New `PayPalUserShop` model and export; CLASS_TO_TABLE mapping updated. `Shop` gains PayPal and Adyen credential fields, enabled flags, readiness properties, SDK accessors, and `paypal_user_shop(user)`. `Invoice` gains PayPal/Stripe/Adyen tracking columns, payment_method resolution, and lookup helpers. | | **Request Methods** <br> `make_post_sell/request_methods.py` | Adds reified request methods: `paypal_enabled`, `paypal_globally_enabled`, `adyen_enabled`, `adyen_globally_enabled`. | | **Routes** <br> `make_post_sell/routes.py` | Registers new routes: `/billing/disconnect-paypal`, `/paypal/create-order/{cart_id}`, `/paypal/complete-checkout/{cart_id}`, `/adyen/create-session/{cart_id}`, `/adyen/complete-checkout/{cart_id}`, and webhook endpoints for PayPal/Stripe/Adyen. | | **Templates** <br> `make_post_sell/templates/billing.j2`, `make_post_sell/templates/cart_checkout.j2`, `make_post_sell/templates/shop_settings.j2` | Adds PayPal saved-method UI and disconnect form to billing; integrates PayPal SDK/button, vaulting, multi-shop order handling and CSRF-safe submit in cart checkout; adds PayPal and Adyen settings blocks (with JS toggles) to shop settings. | | **Views** <br> `make_post_sell/views/billing.py`, `make_post_sell/views/cart.py`, `make_post_sell/views/webhooks.py`, `make_post_sell/views/shop.py` | Billing view exposes `paypal_user_shop` and implements `disconnect_paypal`. Cart view adds `paypal_create_order` and `paypal_complete_checkout` flows. New `webhooks.py` implements PayPal and Stripe webhook handlers with verification, idempotency, invoice updates, unlocks, and email dispatch. Shop view handles Adyen settings form. | | **Database Migrations** <br> `make_post_sell/scripts/alembic/versions/418933067d81_add_paypal_credentials_to_shop.py`, `.../3734955e7379_add_adyen_payment_columns_to_shop_and_.py`, `.../63d935094f97_add_stripe_payment_tracking_columns_to_.py` | Migrations add/remove PayPal columns on `mps_shop` and `mps_invoice`, add Adyen columns on `mps_shop` and `mps_invoice`, and add Stripe tracking columns on `mps_invoice`. | | **Dependencies** <br> `requirements.py3.txt` | Adds `paypalrestsdk` dependency. | | **Tests** <br> `make_post_sell/tests/test_functional.py`, `make_post_sell/tests/test_integration.py`, `make_post_sell/tests/test_models.py` | Adds numerous PayPal-focused unit, functional, and integration tests (credential persistence, endpoints, sandbox API flows, PayPalUserShop constraints, invoice linkage). Some duplicated tests found in integration suite; updates existing checkout expectations. | | **UI Notes** <br> `CHANGELOG.rst` | Documents CSS Grid Lanes toggle, video thumbnail overlay styling, and extended meta description length. | ## Sequence Diagram(s) ```mermaid sequenceDiagram participant Client as Client / Browser participant Server as App Server participant PayPal as PayPal API participant DB as Database Client->>Server: POST /paypal/create-order/{cart_id} activate Server Server->>DB: Fetch cart & shop items Server->>PayPal: Create order(s) per-shop via SDK PayPal-->>Server: Respond with order ID(s) Server-->>Client: JSON {order_id, order_ids} deactivate Server Client->>PayPal: User approves payment (PayPal UI) PayPal-->>Client: Approval token/response Client->>Server: POST /paypal/complete-checkout/{cart_id} (order IDs) activate Server Server->>PayPal: Capture order(s) PayPal-->>Server: Capture responses Server->>DB: Create/update Invoice(s), set paypal_order_id/paypal_capture_id, handle vaulting Server-->>Client: Redirect (success/failure) deactivate Server ``` ```mermaid sequenceDiagram participant PayPal as PayPal (Event Source) participant Server as Webhook Handler participant DB as Database participant Email as Email Service PayPal->>Server: POST /webhooks/paypal (event) activate Server Server->>Server: Verify signature Server->>DB: Lookup Invoice by paypal_order_id alt Invoice found and not processed Server->>DB: Update invoice (set capture id, mark paid) Server->>DB: Unlock user products Server->>Email: Send purchase/sale emails Server-->>PayPal: 200 OK else Invoice missing or already processed Server-->>PayPal: 200 OK (no retry) end deactivate Server ``` ## Estimated code review effort 🎯 4 (Complex) | ⏱️ ~60 minutes <!-- walkthrough_end --> --- <details> <summary>📜 Recent review details</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Free <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between a2e2092a31f905f362d8bfbac2fc76c83153f500 and 4210bc1421471fd994c65505f69949b3f11db225. </details> <details> <summary>📒 Files selected for processing (13)</summary> * `docs/ADYEN.md` * `make_post_sell/models/invoice.py` * `make_post_sell/models/shop.py` * `make_post_sell/request_methods.py` * `make_post_sell/routes.py` * `make_post_sell/scripts/alembic/versions/3734955e7379_add_adyen_payment_columns_to_shop_and_.py` * `make_post_sell/templates/shop_settings.j2` * `make_post_sell/tests/test_functional.py` * `make_post_sell/tests/test_integration.py` * `make_post_sell/tests/test_models.py` * `make_post_sell/views/cart.py` * `make_post_sell/views/shop.py` * `make_post_sell/views/webhooks.py` </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary> * make_post_sell/models/invoice.py </details> </details> <!-- tips_start --> --- > 📝 **NOTE** > <details> > <summary>🎁 Summarized by CodeRabbit Free</summary> > > Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting <https://app.coderabbit.ai/login>. > > </details> <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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 --> <!-- internal state end -->
coderabbitai commented 2025-12-22 14:33:30 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 15:21:49 -05:00 (Migrated from git2.unturf.com)

added 1 commit

  • 31592b69 - Add PayPal unit, integration, and sandbox functional tests

Compare with previous version

added 1 commit <ul><li>31592b69 - Add PayPal unit, integration, and sandbox functional tests</li></ul> [Compare with previous version](/engineering/make-post-sell/make_post_sell/-/merge_requests/57/diffs?diff_id=912&start_sha=979c5117df7ff4f351511921b2f8f7f4592a67aa)
coderabbitai commented 2025-12-22 15:22:44 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 15:33:06 -05:00 (Migrated from git2.unturf.com)

added 1 commit

  • 0b89ab2b - Fix test_cart_checkout_for_shop to match current checkout flow

Compare with previous version

added 1 commit <ul><li>0b89ab2b - Fix test_cart_checkout_for_shop to match current checkout flow</li></ul> [Compare with previous version](/engineering/make-post-sell/make_post_sell/-/merge_requests/57/diffs?diff_id=914&start_sha=31592b69239d8adf2b6636ba3f9399ba8c3f14f5)
coderabbitai commented 2025-12-22 15:33:45 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 16:03:48 -05:00 (Migrated from git2.unturf.com)

added 1 commit

  • ac2f5864 - Add Stripe payment tracking and webhook resilience

Compare with previous version

added 1 commit <ul><li>ac2f5864 - Add Stripe payment tracking and webhook resilience</li></ul> [Compare with previous version](/engineering/make-post-sell/make_post_sell/-/merge_requests/57/diffs?diff_id=916&start_sha=0b89ab2bb3833ef67309bcace4751aca816a5fe8)
coderabbitai commented 2025-12-22 16:04:42 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 16:12:06 -05:00 (Migrated from git2.unturf.com)

added 1 commit

  • a2e2092a - Add privacy warnings to PayPal docs, create Adyen integration doc

Compare with previous version

added 1 commit <ul><li>a2e2092a - Add privacy warnings to PayPal docs, create Adyen integration doc</li></ul> [Compare with previous version](/engineering/make-post-sell/make_post_sell/-/merge_requests/57/diffs?diff_id=918&start_sha=ac2f58645366a6e3511513e5b18dc7a39ad116e1)
coderabbitai commented 2025-12-22 16:12:46 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 17:17:04 -05:00 (Migrated from git2.unturf.com)

added 1 commit

  • 4210bc14 - Add Adyen payment integration

Compare with previous version

added 1 commit <ul><li>4210bc14 - Add Adyen payment integration</li></ul> [Compare with previous version](/engineering/make-post-sell/make_post_sell/-/merge_requests/57/diffs?diff_id=920&start_sha=a2e2092a31f905f362d8bfbac2fc76c83153f500)
coderabbitai commented 2025-12-22 17:17:50 -05:00 (Migrated from git2.unturf.com)

changed the description

changed the description
russellballestrini commented 2025-12-22 17:29:52 -05:00 (Migrated from git2.unturf.com)

mentioned in commit fe0482ac8a

mentioned in commit fe0482ac8a276e8f2590e462dd9705f62c03a429
russellballestrini (Migrated from git2.unturf.com) merged commit fe0482ac8a into master 2025-12-22 17:29:52 -05:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: engineering/make_post_sell#93
No description provided.