# Implementation Plan: Storefront Module Restructure

## Overview

Restructure the platform to properly separate **core platform concerns** (customer auth/identity) from **e-commerce concerns** (cart, checkout, catalog), and rename "shop" to "storefront" throughout.

## Current Issues

1. **API routes import database models directly** - violates layered architecture
2. **No architecture rule enforces this** - validator doesn't catch it
3. **"shop" naming is misleading** - not all platforms sell items
4. **Customer auth is bundled with e-commerce** - should be core/platform concern

---

## Phase 1: Add Missing Architecture Rule

### Task 1.1: Add API-007 rule to prevent direct model imports

**File:** `.architecture-rules/api.yaml`

Add new rule:
```yaml
- id: "API-007"
  name: "API endpoints must NOT import database models directly"
  severity: "error"
  description: |
    API endpoints should import from services, not directly from database models.
    This enforces the layered architecture: Routes → Services → Models.

    The only exception is for type hints in FastAPI dependency injection,
    which should use schemas or services that return the appropriate types.

    WRONG:
      from models.database.customer import Customer
      from models.database.order import Order

    RIGHT:
      from app.modules.customers.services import customer_service
      from models.schema.customer import CustomerResponse
  pattern:
    file_pattern: "app/api/**/*.py"
    anti_patterns:
      - "from models\\.database\\."
      - "from app\\.modules\\..*\\.models\\."
```

### Task 1.2: Update validator to check this rule

**File:** `scripts/validate/validate_architecture.py`

Add validation for API-007.

---

## Phase 2: Rename "shop" to "storefront"

### Task 2.1: Rename API directory
```
app/api/v1/shop/  →  app/api/v1/storefront/
```

### Task 2.2: Update all imports referencing shop
- Update router registrations in `app/api/v1/__init__.py`
- Update any references in middleware
- Update documentation

### Task 2.3: Rename routes/pages if applicable
```
app/routes/shop_pages.py  →  app/routes/storefront_pages.py
```

---

## Phase 3: Create New E-commerce Modules

### Task 3.1: Create `cart` module
```
app/modules/cart/
├── __init__.py
├── definition.py
├── config.py
├── exceptions.py
├── models/
│   ├── __init__.py
│   └── cart.py              # Cart, CartItem models (if persistent)
├── schemas/
│   ├── __init__.py
│   └── cart.py              # Move from models/schema/cart.py
├── services/
│   ├── __init__.py
│   └── cart_service.py      # Move from app/services/cart_service.py
└── routes/
    └── api/
        ├── __init__.py
        └── storefront.py    # Cart endpoints for customers
```

### Task 3.2: Create `checkout` module
```
app/modules/checkout/
├── __init__.py
├── definition.py
├── config.py
├── exceptions.py
├── schemas/
│   ├── __init__.py
│   └── checkout.py          # CheckoutRequest, CheckoutResponse
├── services/
│   ├── __init__.py
│   └── checkout_service.py  # Orchestrates cart → order conversion
└── routes/
    └── api/
        ├── __init__.py
        └── storefront.py    # Place order endpoint
```

### Task 3.3: Create `catalog` module
```
app/modules/catalog/
├── __init__.py
├── definition.py
├── config.py
├── schemas/
│   ├── __init__.py
│   └── catalog.py           # ProductListResponse, ProductDetailResponse
├── services/
│   ├── __init__.py
│   └── catalog_service.py   # Customer-facing product queries
└── routes/
    └── api/
        ├── __init__.py
        └── storefront.py    # Product browsing endpoints
```

---

## Phase 4: Move Storefront Routes to Modules

### Task 4.1: Move customer auth routes to `customers` module

**From:** `app/api/v1/storefront/auth.py`
**To:** `app/modules/customers/routes/api/storefront.py`

Endpoints:
- `POST /auth/register` - Customer registration
- `POST /auth/login` - Customer login
- `POST /auth/logout` - Customer logout
- `POST /auth/password-reset/request` - Request password reset
- `POST /auth/password-reset/confirm` - Confirm password reset

### Task 4.2: Move customer profile routes to `customers` module

**From:** `app/api/v1/storefront/profile.py`
**To:** `app/modules/customers/routes/api/storefront.py` (append)

Endpoints:
- `GET /profile` - Get customer profile
- `PUT /profile` - Update customer profile

### Task 4.3: Move customer address routes to `customers` module

**From:** `app/api/v1/storefront/addresses.py`
**To:** `app/modules/customers/routes/api/storefront.py` (append)

Endpoints:
- `GET /addresses` - List customer addresses
- `POST /addresses` - Create address
- `PUT /addresses/{id}` - Update address
- `DELETE /addresses/{id}` - Delete address

### Task 4.4: Move cart routes to `cart` module

**From:** `app/api/v1/storefront/carts.py`
**To:** `app/modules/cart/routes/api/storefront.py`

### Task 4.5: Move order placement to `checkout` module

**From:** `app/api/v1/storefront/orders.py` (POST /orders only)
**To:** `app/modules/checkout/routes/api/storefront.py`

### Task 4.6: Move order viewing to `orders` module

**From:** `app/api/v1/storefront/orders.py` (GET endpoints)
**To:** `app/modules/orders/routes/api/storefront.py`

### Task 4.7: Move product browsing to `catalog` module

**From:** `app/api/v1/storefront/products.py`
**To:** `app/modules/catalog/routes/api/storefront.py`

### Task 4.8: Move messaging routes to `messaging` module

**From:** `app/api/v1/storefront/messages.py`
**To:** `app/modules/messaging/routes/api/storefront.py`

---

## Phase 5: Fix Direct Model Imports

### Task 5.1: Update dependency injection pattern

**Current pattern (violates layered architecture):**
```python
from models.database.customer import Customer

@router.get("/orders")
def get_orders(customer: Customer = Depends(get_current_customer_api)):
    ...
```

**New pattern (proper layered architecture):**
```python
from app.modules.customers.schemas import CustomerContext

@router.get("/orders")
def get_orders(customer: CustomerContext = Depends(get_current_customer_api)):
    ...
```

### Task 5.2: Create `CustomerContext` schema

**File:** `app/modules/customers/schemas/context.py`
```python
class CustomerContext(BaseModel):
    """Customer context for dependency injection in storefront routes."""
    id: int
    store_id: int
    email: str
    first_name: str | None
    last_name: str | None

    model_config = ConfigDict(from_attributes=True)
```

### Task 5.3: Update `get_current_customer_api` dependency

**File:** `app/api/deps.py`

Change return type from `Customer` (database model) to `CustomerContext` (schema).

### Task 5.4: Update all storefront routes

Replace all `Customer` type hints with `CustomerContext`.

---

## Phase 6: Delete Legacy Files

### Task 6.1: Delete `models/database/customer.py`

After all imports are updated to use `app.modules.customers.models.customer`.

### Task 6.2: Delete `app/api/v1/storefront/` directory

After all routes are moved to their respective modules.

### Task 6.3: Delete `app/services/cart_service.py`

After migrated to `app/modules/cart/services/cart_service.py`.

---

## Phase 7: Update Documentation

### Task 7.1: Update API documentation
- Rename all "shop" references to "storefront"
- Update endpoint paths

### Task 7.2: Update architecture documentation
- Document the layered architecture rule
- Document module structure

---

## Module Dependency Graph (Final State)

```
                    ┌─────────────┐
                    │    core     │
                    │  (tenancy)  │
                    └──────┬──────┘
                           │
              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
       ┌──────────┐  ┌──────────┐  ┌──────────┐
       │customers │  │ payments │  │messaging │
       │  (auth)  │  │          │  │          │
       └────┬─────┘  └────┬─────┘  └──────────┘
            │             │
            │    ┌────────┴────────┐
            │    │                 │
            ▼    ▼                 ▼
       ┌──────────┐          ┌──────────┐
       │   cart   │          │  orders  │
       │          │          │          │
       └────┬─────┘          └────┬─────┘
            │                     │
            └──────────┬──────────┘
                       │
                       ▼
                 ┌──────────┐
                 │ checkout │
                 │          │
                 └──────────┘
```

---

## Execution Order

1. **Phase 1** - Add architecture rule (enables detection) ✅ COMPLETE
2. **Phase 2** - Rename shop → storefront (terminology) ✅ COMPLETE
3. **Phase 3** - Create new modules (cart, checkout, catalog) ✅ COMPLETE
4. **Phase 4** - Move routes to modules ✅ COMPLETE
5. **Phase 5** - Fix direct model imports ✅ COMPLETE
6. **Phase 6** - Delete legacy files ✅ COMPLETE
7. **Phase 7** - Update documentation ✅ COMPLETE

---

## Files Modified Summary

### New Files
- `.architecture-rules/api.yaml` (modified - add API-007)
- `app/modules/cart/**` (new module)
- `app/modules/checkout/**` (new module)
- `app/modules/catalog/**` (new module)
- `app/modules/customers/routes/api/storefront.py`
- `app/modules/customers/schemas/context.py`
- `app/modules/orders/routes/api/storefront.py`
- `app/modules/messaging/routes/api/storefront.py`

### Deleted Files
- `app/api/v1/shop/` (entire directory)
- `app/routes/shop_pages.py`
- `models/database/customer.py`
- `app/services/cart_service.py`

### Modified Files
- `app/api/deps.py` (CustomerContext return type)
- `scripts/validate/validate_architecture.py` (add API-007 check)
- All files currently importing from legacy locations
