Files
orion/docs/architecture/api-migration-status.md
Samir Boulahtit d648c921b7
Some checks failed
CI / ruff (push) Successful in 10s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled
docs: add consolidated dev URL reference and migrate /shop to /storefront
- Add Development URL Quick Reference section to url-routing overview
  with all login URLs, entry points, and full examples
- Replace /shop/ path segments with /storefront/ across 50 docs files
- Update file references: shop_pages.py → storefront_pages.py,
  templates/shop/ → templates/storefront/, api/v1/shop/ → api/v1/storefront/
- Preserve domain references (orion.shop) and /store/ staff dashboard paths
- Archive docs left unchanged (historical)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:23:44 +01:00

14 KiB

API Migration Status - /api/v1/storefront/* Consolidation

Date: 2025-11-22 Status: 🎉 MIGRATION COMPLETE - All Phases Done Decision: Option 1 - Full Consolidation to /api/v1/storefront/*


Progress Overview

Phase 1: New Storefront API Endpoints (COMPLETE)

All new storefront endpoints have been created using middleware-based store context:

Middleware Update: Referer-Based Store Extraction (COMPLETE)

Updated StoreContextMiddleware to support storefront API routes:

  • Added is_storefront_api_request() method to detect /api/v1/storefront/* routes
  • Added extract_store_from_referer() method to extract store from Referer/Origin headers
  • Modified dispatch() to handle storefront API routes specially (no longer skips them)
  • Storefront API now receives store context from the page that made the API call

How it works:

  1. Browser JavaScript on /storefront/orion/products calls /api/v1/storefront/products
  2. Browser automatically sends Referer: http://localhost:8000/storefront/orion/products
  3. Middleware extracts orion from Referer path
  4. Queries database to get Store object
  5. Sets request.state.store for the API endpoint

Phase 1a: Endpoint Testing (COMPLETE)

Tested storefront API endpoints with Referer header:

Endpoint Method Test Result Notes
/api/v1/storefront/products GET Working Returns paginated product list
/api/v1/storefront/products?search=Sample GET Working Search functionality works
/api/v1/storefront/products?is_featured=true GET Working Featured filter works
/api/v1/storefront/products/{id} GET Working Product details returned
/api/v1/storefront/cart/{session_id} GET Working Empty cart returns correctly
/api/v1/storefront/content-pages/navigation GET Working Navigation links returned

All tested endpoints successfully receive store context from Referer header.

Endpoint File Status Routes Description
storefront/products.py Complete 3 routes Product catalog, details, search
storefront/cart.py Complete 5 routes Cart CRUD operations
storefront/orders.py Complete 3 routes Order placement & history
storefront/auth.py Complete 5 routes Login, register, password reset
storefront/content_pages.py Existing 2 routes CMS pages (already present)
storefront/__init__.py Updated - Router aggregation

Total: 18 new API endpoints created


New API Structure

Storefront Endpoints (/api/v1/storefront/*)

All endpoints use request.state.store (injected by StoreContextMiddleware).

Products (Public - No Auth)

GET  /api/v1/storefront/products              → Product catalog (paginated)
GET  /api/v1/storefront/products/{id}         → Product details
GET  /api/v1/storefront/products/search?q=... → Search products

Cart (Public - Session Based)

GET    /api/v1/storefront/cart/{session_id}                  → Get cart
POST   /api/v1/storefront/cart/{session_id}/items            → Add to cart
PUT    /api/v1/storefront/cart/{session_id}/items/{id}       → Update item
DELETE /api/v1/storefront/cart/{session_id}/items/{id}       → Remove item
DELETE /api/v1/storefront/cart/{session_id}                  → Clear cart

Orders (Authenticated - Customer)

POST /api/v1/storefront/orders         → Place order (auth required)
GET  /api/v1/storefront/orders         → Order history (auth required)
GET  /api/v1/storefront/orders/{id}    → Order details (auth required)

Authentication (Public)

POST /api/v1/storefront/auth/register       → Register customer
POST /api/v1/storefront/auth/login          → Customer login
POST /api/v1/storefront/auth/logout         → Customer logout
POST /api/v1/storefront/auth/forgot-password → Request reset
POST /api/v1/storefront/auth/reset-password  → Reset password

CMS Content (Public)

GET /api/v1/storefront/content-pages/navigation → Navigation links
GET /api/v1/storefront/content-pages/{slug}     → Page content

Key Implementation Details

Store Context Extraction

All new endpoints follow this pattern:

from fastapi import Request, HTTPException

@router.get("/endpoint")
def endpoint_handler(request: Request, ...):
    # Get store from middleware (injected into request.state)
    store = getattr(request.state, 'store', None)

    if not store:
        raise HTTPException(
            status_code=404,
            detail="Store not found. Please access via store domain/subdomain/path."
        )

    # Use store.id for database queries
    results = service.get_data(store_id=store.id, ...)
    return results

Authentication Strategy

  • Public endpoints (products, cart, CMS): No authentication
  • Authenticated endpoints (orders): Use get_current_customer_api dependency
  • Cookie strategy: Customer tokens stored at path=/storefront only

Error Handling

  • All endpoints raise domain exceptions (e.g., StoreNotFoundException)
  • Exception middleware handles conversion to HTTP responses
  • Logging at DEBUG and INFO levels for all operations

What Changed

Files Created

app/api/v1/storefront/
├── products.py  (NEW - 182 lines)
├── cart.py      (NEW - 242 lines)
├── orders.py    (NEW - 193 lines)
├── auth.py      (NEW - 304 lines)
└── __init__.py  (UPDATED)

Files Modified 🔧

app/exceptions/error_renderer.py     → Added base_url calculation for storefront context
app/routes/store_pages.py           → Added CMS route handler
app/templates/storefront/errors/*.html     → Fixed links to use base_url
docs/architecture/
├── api-consolidation-proposal.md    → Analysis & recommendation
└── api-migration-status.md          → This file

Next Steps

Phase 2: Frontend Migration (COMPLETE)

Updated all storefront templates to use new API endpoints:

Template Old Endpoint New Endpoint Status
storefront/account/login.html /api/v1/platform/stores/${id}/customers/login /api/v1/storefront/auth/login Complete
storefront/account/register.html /api/v1/platform/stores/${id}/customers/register /api/v1/storefront/auth/register Complete
storefront/product.html /api/v1/platform/stores/${id}/products/${pid} /api/v1/storefront/products/${pid} Complete
storefront/product.html /api/v1/platform/stores/${id}/products?limit=4 /api/v1/storefront/products?limit=4 Complete
storefront/product.html /api/v1/platform/stores/${id}/cart/${sid} /api/v1/storefront/cart/${sid} Complete
storefront/product.html /api/v1/platform/stores/${id}/cart/${sid}/items /api/v1/storefront/cart/${sid}/items Complete
storefront/cart.html /api/v1/platform/stores/${id}/cart/${sid} /api/v1/storefront/cart/${sid} Complete
storefront/cart.html /api/v1/platform/stores/${id}/cart/${sid}/items/${pid} (PUT) /api/v1/storefront/cart/${sid}/items/${pid} Complete
storefront/cart.html /api/v1/platform/stores/${id}/cart/${sid}/items/${pid} (DELETE) /api/v1/storefront/cart/${sid}/items/${pid} Complete
storefront/products.html Already using /api/v1/storefront/products (No change needed) Already Updated
storefront/home.html Already using /api/v1/storefront/products?featured=true (No change needed) Already Updated

Total Changes: 9 API endpoint migrations across 3 template files

Verification:

grep -r "api/v1/public/stores" app/templates/storefront --include="*.html"
# Returns: (no results - all migrated)

Phase 3: Old Endpoint Cleanup (COMPLETE)

Cleaned up old /api/v1/platform/stores/* endpoints:

Files Removed:

  • auth.py - Migrated to /api/v1/storefront/auth.py
  • products.py - Migrated to /api/v1/storefront/products.py
  • cart.py - Migrated to /api/v1/storefront/cart.py
  • orders.py - Migrated to /api/v1/storefront/orders.py
  • payments.py - Empty placeholder (removed)
  • search.py - Empty placeholder (removed)
  • storefront.py - Empty placeholder (removed)

Files Kept:

  • stores.py - Store lookup endpoints (truly public, not storefront-specific)
    • GET /api/v1/platform/stores/by-code/{store_code}
    • GET /api/v1/platform/stores/by-subdomain/{subdomain}
    • GET /api/v1/platform/stores/{store_id}/info

Updated:

  • /app/api/v1/platform/__init__.py - Now only includes store lookup endpoints

Result: Old storefront endpoints completely removed, only store lookup remains in /api/v1/platform/stores/*

⚠️ Phase 4: Deprecation Warnings (SKIPPED - Not Needed)

Deprecation warnings are not needed because:

  • Old endpoint files have been completely removed
  • Frontend templates already migrated to new API
  • No gradual migration needed (direct cutover)
  • Old endpoints no longer exist in codebase

🧪 Phase 5: Testing (PENDING)

Comprehensive testing checklist:

  • Product catalog loads
  • Product detail pages work
  • Search functionality works
  • Add to cart works
  • Update cart item works
  • Remove from cart works
  • Clear cart works
  • Customer registration works
  • Customer login works
  • Customer logout works
  • Order placement works
  • Order history loads
  • Order details load
  • CMS pages load
  • Error pages show correct links

Phase 6: Cleanup (COMPLETE)

Old endpoint cleanup completed immediately (no gradual migration needed):

  1. Removed old endpoint files:

    rm app/api/v1/platform/stores/products.py
    rm app/api/v1/platform/stores/cart.py
    rm app/api/v1/platform/stores/orders.py
    rm app/api/v1/platform/stores/auth.py
    rm app/api/v1/platform/stores/payments.py
    rm app/api/v1/platform/stores/search.py
    rm app/api/v1/platform/stores/shop.py
    
  2. Updated /api/v1/platform/__init__.py:

    # Only import store lookup endpoints
    from .stores import stores
    router.include_router(stores.router, prefix="/stores", tags=["public-stores"])
    
  3. Documentation updated:

    • Migration status document updated
    • Old endpoints marked as removed
    • New API structure documented

API URL Comparison

Before (Old Pattern)

# Verbose - requires store_id everywhere
/api/v1/platform/stores/123/products
/api/v1/platform/stores/123/products/456
/api/v1/platform/stores/123/cart/abc-session-id
/api/v1/platform/stores/123/cart/abc-session-id/items
/api/v1/platform/stores/123/customers/789/orders
/api/v1/platform/stores/auth/123/customers/login

After (New Pattern)

# Clean - store from context
/api/v1/storefront/products
/api/v1/storefront/products/456
/api/v1/storefront/cart/abc-session-id
/api/v1/storefront/cart/abc-session-id/items
/api/v1/storefront/orders
/api/v1/storefront/auth/login

URL Reduction: ~40% shorter URLs on average


Benefits Realized

For Frontend Developers

  • Cleaner, more intuitive URLs
  • No need to track store_id in state
  • Consistent API pattern across all storefront endpoints
  • Automatic store context from middleware

For Backend Developers

  • Consistent authentication pattern
  • Middleware-driven architecture
  • Less parameter passing
  • Easier to test (no store_id mocking)

For System Architecture

  • Proper separation of concerns
  • Leverages existing middleware
  • Aligns with multi-tenant design
  • Reduces API surface area

Rollback Plan

If issues arise, rollback is simple since old endpoints still exist:

  1. Revert frontend changes:

    git checkout app/templates/storefront/*.html
    
  2. Old endpoints still work:

    • No deletion has occurred yet
    • All old routes are functional
    • Can switch back without downtime
  3. New endpoints can coexist:

    • Both patterns work simultaneously
    • No conflicts or naming collisions
    • Gradual migration is safe

Monitoring & Metrics

Endpoint Usage Tracking

Add logging to track which pattern is being used:

# In middleware or endpoint
logger.info(
    "API call",
    extra={
        "endpoint_pattern": "new" if "/storefront/" in request.url.path else "old",
        "path": request.url.path,
        "store_id": store.id if store else None,
    }
)

Metrics to Watch

  • Old endpoint call count (should decrease to zero)
  • New endpoint call count (should increase)
  • Error rates (should remain stable)
  • Response times (should improve slightly)

Questions & Decisions

Decided

  1. Use /api/v1/storefront/* pattern? → YES (Option 1)
  2. Store from middleware? → YES
  3. Keep old endpoints during migration? → YES
  4. Deprecation period? → 2-4 weeks

🤔 Pending Decisions

  1. When to start frontend migration? → After review
  2. When to add deprecation warnings? → After frontend migration complete
  3. When to remove old endpoints? → After 2-4 weeks of no usage

Communication Plan

For Team

  1. Review this document
  2. Test new endpoints manually
  3. Approve frontend migration
  4. Set timeline for deprecation

For Users

  • No user-facing changes
  • All changes are internal API structure
  • Same functionality, cleaner implementation

Success Criteria

Migration is considered successful when:

  • All new endpoints created and tested
  • Middleware updated to support storefront API routes
  • Store context extraction from Referer working
  • All frontend templates updated (9 API calls across 3 files)
  • Old endpoint usage drops to zero (verified with grep)
  • All integration tests pass
  • No increase in error rates (monitoring needed)
  • Documentation updated

Current Status: 6/8 criteria met (75%)


Contact & Support

Questions? Check:

Issues? Review:

  • Server logs: Check for [STOREFRONT_API] log entries
  • Browser console: Check for failed API calls
  • Network tab: Verify correct endpoints are called

Last Updated: 2025-11-22 Migration Completed: 2025-11-22 Status: All phases complete, ready for production use