feat: extract inventory, orders, and marketplace modules (Phase 4)

Extract three additional modules following the billing module pattern:

Inventory Module (app/modules/inventory/):
- Stock management and tracking
- Inventory locations
- Low stock alerts
- Admin and vendor routes with module access control

Orders Module (app/modules/orders/):
- Order management and fulfillment
- Order item exceptions
- Bulk operations and export
- Admin and vendor routes with module access control

Marketplace Module (app/modules/marketplace/):
- Letzshop integration
- Product sync
- Marketplace import
- Depends on inventory module
- Admin and vendor routes with module access control

Admin router updated:
- Uses module routers with require_module_access dependency
- Legacy router includes commented out
- Routes verified: 15 inventory, 16 orders, 42 marketplace

All 31 module tests passing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-25 22:02:24 +01:00
parent c614b7d74c
commit 9d0dc51de0
17 changed files with 559 additions and 83 deletions

View File

@@ -0,0 +1,23 @@
# app/modules/inventory/__init__.py
"""
Inventory Module - Stock and product management.
This module provides:
- Inventory tracking across locations
- Stock level management
- Low stock alerts
- Inventory transactions and history
- Product catalog management
Routes:
- Admin: /api/v1/admin/inventory/*
- Vendor: /api/v1/vendor/inventory/*
Menu Items:
- Admin: inventory, vendor-products
- Vendor: products, inventory
"""
from app.modules.inventory.definition import inventory_module
__all__ = ["inventory_module"]

View File

@@ -0,0 +1,70 @@
# app/modules/inventory/definition.py
"""
Inventory module definition.
Defines the inventory module including its features, menu items,
and route configurations.
"""
from app.modules.base import ModuleDefinition
from models.database.admin_menu_config import FrontendType
def _get_admin_router():
"""Lazy import of admin router to avoid circular imports."""
from app.modules.inventory.routes.admin import admin_router
return admin_router
def _get_vendor_router():
"""Lazy import of vendor router to avoid circular imports."""
from app.modules.inventory.routes.vendor import vendor_router
return vendor_router
# Inventory module definition
inventory_module = ModuleDefinition(
code="inventory",
name="Inventory Management",
description=(
"Stock level tracking, inventory locations, low stock alerts, "
"and product catalog management."
),
features=[
"inventory_basic", # Basic stock tracking
"inventory_locations", # Multiple warehouse locations
"low_stock_alerts", # Automated low stock notifications
"inventory_purchase_orders", # Purchase order management
"product_management", # Product catalog CRUD
"inventory_transactions", # Stock movement history
"inventory_import", # Bulk inventory import
],
menu_items={
FrontendType.ADMIN: [
"inventory", # Platform-wide inventory view
"vendor-products", # Product catalog management
],
FrontendType.VENDOR: [
"products", # Vendor product catalog
"inventory", # Vendor inventory management
],
},
is_core=False,
)
def get_inventory_module_with_routers() -> ModuleDefinition:
"""
Get inventory module with routers attached.
This function attaches the routers lazily to avoid circular imports
during module initialization.
"""
inventory_module.admin_router = _get_admin_router()
inventory_module.vendor_router = _get_vendor_router()
return inventory_module
__all__ = ["inventory_module", "get_inventory_module_with_routers"]

View File

@@ -0,0 +1,12 @@
# app/modules/inventory/routes/__init__.py
"""
Inventory module route registration.
This module provides functions to register inventory routes
with module-based access control.
"""
from app.modules.inventory.routes.admin import admin_router
from app.modules.inventory.routes.vendor import vendor_router
__all__ = ["admin_router", "vendor_router"]

View File

@@ -0,0 +1,26 @@
# app/modules/inventory/routes/admin.py
"""
Inventory module admin routes.
This module wraps the existing admin inventory routes and adds
module-based access control. Routes are re-exported from the
original location with the module access dependency.
"""
from fastapi import APIRouter, Depends
from app.api.deps import require_module_access
# Import original router
from app.api.v1.admin import inventory as inventory_routes
# Create module-aware router
admin_router = APIRouter(
prefix="/inventory",
dependencies=[Depends(require_module_access("inventory"))],
)
# Re-export all routes from the original module with module access control
# The routes are copied to maintain the same API structure
for route in inventory_routes.router.routes:
admin_router.routes.append(route)

View File

@@ -0,0 +1,25 @@
# app/modules/inventory/routes/vendor.py
"""
Inventory module vendor routes.
This module wraps the existing vendor inventory routes and adds
module-based access control. Routes are re-exported from the
original location with the module access dependency.
"""
from fastapi import APIRouter, Depends
from app.api.deps import require_module_access
# Import original router
from app.api.v1.vendor import inventory as inventory_routes
# Create module-aware router
vendor_router = APIRouter(
prefix="/inventory",
dependencies=[Depends(require_module_access("inventory"))],
)
# Re-export all routes from the original module with module access control
for route in inventory_routes.router.routes:
vendor_router.routes.append(route)