refactor(P6): standardize route variable naming to router
Some checks failed
CI / ruff (push) Successful in 9s
CI / pytest (push) Has been cancelled
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

All route files (admin.py, store.py) now export `router` instead of
`admin_router`/`store_router`. Consumer code (definition.py, __init__.py)
imports as `router as admin_router` where distinction is needed.
ModuleDefinition fields remain admin_router/store_router.

64 files changed across all modules. Architecture rules, docs, and
migration plan updated. Added noqa:API001 support to validator for
pre-existing raw dict endpoints now visible with standardized router name.
All 1114 tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 11:05:34 +01:00
parent 8c0967e215
commit 30c4593e0f
65 changed files with 376 additions and 355 deletions

View File

@@ -18,9 +18,9 @@ from app.modules.enums import FrontendType
def _get_admin_router():
"""Lazy import of admin router to avoid circular imports."""
from app.modules.loyalty.routes.api.admin import admin_router
from app.modules.loyalty.routes.api.admin import router
return admin_router
return router
def _get_merchant_router():
@@ -32,9 +32,9 @@ def _get_merchant_router():
def _get_store_router():
"""Lazy import of store router to avoid circular imports."""
from app.modules.loyalty.routes.api.store import store_router
from app.modules.loyalty.routes.api.store import router
return store_router
return router
def _get_platform_router():
@@ -270,9 +270,9 @@ def get_loyalty_module_with_routers() -> ModuleDefinition:
This function attaches the routers lazily to avoid circular imports
during module initialization.
"""
loyalty_module.admin_router = _get_admin_router()
loyalty_module.router = _get_router()
loyalty_module.merchant_router = _get_merchant_router()
loyalty_module.store_router = _get_store_router()
loyalty_module.router = _get_router()
loyalty_module.platform_router = _get_platform_router()
loyalty_module.storefront_router = _get_storefront_router()
return loyalty_module

View File

@@ -9,9 +9,9 @@ Provides REST API endpoints for:
- Storefront: Customer enrollment and wallet passes
"""
from app.modules.loyalty.routes.api.admin import admin_router
from app.modules.loyalty.routes.api.admin import router as admin_router
from app.modules.loyalty.routes.api.platform import platform_router
from app.modules.loyalty.routes.api.store import store_router
from app.modules.loyalty.routes.api.store import router as store_router
from app.modules.loyalty.routes.api.storefront import storefront_router
__all__ = ["admin_router", "store_router", "platform_router", "storefront_router"]

View File

@@ -32,7 +32,7 @@ from app.modules.tenancy.models import User # API-007
logger = logging.getLogger(__name__)
# Admin router with module access control
admin_router = APIRouter(
router = APIRouter(
prefix="/loyalty",
dependencies=[Depends(require_module_access("loyalty", FrontendType.ADMIN))],
)
@@ -43,7 +43,7 @@ admin_router = APIRouter(
# =============================================================================
@admin_router.get("/programs", response_model=ProgramListResponse)
@router.get("/programs", response_model=ProgramListResponse)
def list_programs(
skip: int = Query(0, ge=0),
limit: int = Query(50, ge=1, le=100),
@@ -81,7 +81,7 @@ def list_programs(
return ProgramListResponse(programs=program_responses, total=total)
@admin_router.get("/programs/{program_id}", response_model=ProgramResponse)
@router.get("/programs/{program_id}", response_model=ProgramResponse)
def get_program(
program_id: int,
current_user: User = Depends(get_current_admin_api),
@@ -98,7 +98,7 @@ def get_program(
return response
@admin_router.get("/programs/{program_id}/stats", response_model=ProgramStatsResponse)
@router.get("/programs/{program_id}/stats", response_model=ProgramStatsResponse)
def get_program_stats(
program_id: int,
current_user: User = Depends(get_current_admin_api),
@@ -109,7 +109,7 @@ def get_program_stats(
return ProgramStatsResponse(**stats)
@admin_router.post(
@router.post(
"/merchants/{merchant_id}/program", response_model=ProgramResponse, status_code=201
)
def create_program_for_merchant(
@@ -130,7 +130,7 @@ def create_program_for_merchant(
return response
@admin_router.patch("/programs/{program_id}", response_model=ProgramResponse)
@router.patch("/programs/{program_id}", response_model=ProgramResponse)
def update_program(
data: ProgramUpdate,
program_id: int = Path(..., gt=0),
@@ -149,7 +149,7 @@ def update_program(
return response
@admin_router.delete("/programs/{program_id}", status_code=204)
@router.delete("/programs/{program_id}", status_code=204)
def delete_program(
program_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_admin_api),
@@ -160,7 +160,7 @@ def delete_program(
logger.info(f"Admin deleted loyalty program {program_id}")
@admin_router.post("/programs/{program_id}/activate", response_model=ProgramResponse)
@router.post("/programs/{program_id}/activate", response_model=ProgramResponse)
def activate_program(
program_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_admin_api),
@@ -178,7 +178,7 @@ def activate_program(
return response
@admin_router.post("/programs/{program_id}/deactivate", response_model=ProgramResponse)
@router.post("/programs/{program_id}/deactivate", response_model=ProgramResponse)
def deactivate_program(
program_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_admin_api),
@@ -201,7 +201,7 @@ def deactivate_program(
# =============================================================================
@admin_router.get("/merchants/{merchant_id}/stats", response_model=MerchantStatsResponse)
@router.get("/merchants/{merchant_id}/stats", response_model=MerchantStatsResponse)
def get_merchant_stats(
merchant_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_admin_api),
@@ -213,7 +213,7 @@ def get_merchant_stats(
return MerchantStatsResponse(**stats)
@admin_router.get("/merchants/{merchant_id}/settings", response_model=MerchantSettingsResponse)
@router.get("/merchants/{merchant_id}/settings", response_model=MerchantSettingsResponse)
def get_merchant_settings(
merchant_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_admin_api),
@@ -224,7 +224,7 @@ def get_merchant_settings(
return MerchantSettingsResponse.model_validate(settings)
@admin_router.patch("/merchants/{merchant_id}/settings", response_model=MerchantSettingsResponse)
@router.patch("/merchants/{merchant_id}/settings", response_model=MerchantSettingsResponse)
def update_merchant_settings(
data: MerchantSettingsUpdate,
merchant_id: int = Path(..., gt=0),
@@ -252,7 +252,7 @@ def update_merchant_settings(
# =============================================================================
@admin_router.get("/stats")
@router.get("/stats")
def get_platform_stats(
current_user: User = Depends(get_current_admin_api),
db: Session = Depends(get_db),

View File

@@ -63,7 +63,7 @@ from app.modules.tenancy.models import User # API-007
logger = logging.getLogger(__name__)
# Store router with module access control
store_router = APIRouter(
router = APIRouter(
prefix="/loyalty",
dependencies=[Depends(require_module_access("loyalty", FrontendType.STORE))],
)
@@ -86,7 +86,7 @@ def get_store_merchant_id(db: Session, store_id: int) -> int:
# =============================================================================
@store_router.get("/program", response_model=ProgramResponse)
@router.get("/program", response_model=ProgramResponse)
def get_program(
current_user: User = Depends(get_current_store_api),
db: Session = Depends(get_db),
@@ -104,7 +104,7 @@ def get_program(
return response
@store_router.get("/stats", response_model=ProgramStatsResponse)
@router.get("/stats", response_model=ProgramStatsResponse)
def get_stats(
current_user: User = Depends(get_current_store_api),
db: Session = Depends(get_db),
@@ -118,7 +118,7 @@ def get_stats(
return ProgramStatsResponse(**stats)
@store_router.get("/stats/merchant", response_model=MerchantStatsResponse)
@router.get("/stats/merchant", response_model=MerchantStatsResponse)
def get_merchant_stats(
current_user: User = Depends(get_current_store_api),
db: Session = Depends(get_db),
@@ -137,7 +137,7 @@ def get_merchant_stats(
# =============================================================================
@store_router.get("/pins", response_model=PinListResponse)
@router.get("/pins", response_model=PinListResponse)
def list_pins(
current_user: User = Depends(get_current_store_api),
db: Session = Depends(get_db),
@@ -156,7 +156,7 @@ def list_pins(
)
@store_router.post("/pins", response_model=PinResponse, status_code=201)
@router.post("/pins", response_model=PinResponse, status_code=201)
def create_pin(
data: PinCreate,
current_user: User = Depends(get_current_store_api),
@@ -171,7 +171,7 @@ def create_pin(
return PinResponse.model_validate(pin)
@store_router.patch("/pins/{pin_id}", response_model=PinResponse)
@router.patch("/pins/{pin_id}", response_model=PinResponse)
def update_pin(
pin_id: int = Path(..., gt=0),
data: PinUpdate = None,
@@ -183,7 +183,7 @@ def update_pin(
return PinResponse.model_validate(pin)
@store_router.delete("/pins/{pin_id}", status_code=204)
@router.delete("/pins/{pin_id}", status_code=204)
def delete_pin(
pin_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_store_api),
@@ -193,7 +193,7 @@ def delete_pin(
pin_service.delete_pin(db, pin_id)
@store_router.post("/pins/{pin_id}/unlock", response_model=PinResponse)
@router.post("/pins/{pin_id}/unlock", response_model=PinResponse)
def unlock_pin(
pin_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_store_api),
@@ -209,7 +209,7 @@ def unlock_pin(
# =============================================================================
@store_router.get("/cards", response_model=CardListResponse)
@router.get("/cards", response_model=CardListResponse)
def list_cards(
skip: int = Query(0, ge=0),
limit: int = Query(50, ge=1, le=100),
@@ -316,7 +316,7 @@ def _build_card_lookup_response(card, db=None) -> CardLookupResponse:
)
@store_router.get("/cards/lookup", response_model=CardLookupResponse)
@router.get("/cards/lookup", response_model=CardLookupResponse)
def search_card(
request: Request,
q: str = Query(..., description="Search by email, card number, or name"),
@@ -340,7 +340,7 @@ def search_card(
return _build_card_lookup_response(card, db)
@store_router.post("/cards/lookup", response_model=CardLookupResponse)
@router.post("/cards/lookup", response_model=CardLookupResponse)
def lookup_card(
request: Request,
card_id: int | None = Query(None),
@@ -369,7 +369,7 @@ def lookup_card(
return _build_card_lookup_response(card, db)
@store_router.get("/cards/{card_id}", response_model=CardDetailResponse)
@router.get("/cards/{card_id}", response_model=CardDetailResponse)
def get_card_detail(
card_id: int = Path(..., gt=0),
current_user: User = Depends(get_current_store_api),
@@ -421,7 +421,7 @@ def get_card_detail(
)
@store_router.get("/transactions", response_model=TransactionListResponse)
@router.get("/transactions", response_model=TransactionListResponse)
def list_store_transactions(
skip: int = Query(0, ge=0),
limit: int = Query(10, ge=1, le=100),
@@ -446,7 +446,7 @@ def list_store_transactions(
return TransactionListResponse(transactions=tx_responses, total=total)
@store_router.post("/cards/enroll", response_model=CardResponse, status_code=201)
@router.post("/cards/enroll", response_model=CardResponse, status_code=201)
def enroll_customer(
data: CardEnrollRequest,
current_user: User = Depends(get_current_store_api),
@@ -491,7 +491,7 @@ def enroll_customer(
)
@store_router.get("/cards/{card_id}/transactions", response_model=TransactionListResponse)
@router.get("/cards/{card_id}/transactions", response_model=TransactionListResponse)
def get_card_transactions(
card_id: int = Path(..., gt=0),
skip: int = Query(0, ge=0),
@@ -520,7 +520,7 @@ def get_card_transactions(
# =============================================================================
@store_router.post("/stamp", response_model=StampResponse)
@router.post("/stamp", response_model=StampResponse)
def add_stamp(
request: Request,
data: StampRequest,
@@ -546,7 +546,7 @@ def add_stamp(
return StampResponse(**result)
@store_router.post("/stamp/redeem", response_model=StampRedeemResponse)
@router.post("/stamp/redeem", response_model=StampRedeemResponse)
def redeem_stamps(
request: Request,
data: StampRedeemRequest,
@@ -572,7 +572,7 @@ def redeem_stamps(
return StampRedeemResponse(**result)
@store_router.post("/stamp/void", response_model=StampVoidResponse)
@router.post("/stamp/void", response_model=StampVoidResponse)
def void_stamps(
request: Request,
data: StampVoidRequest,
@@ -605,7 +605,7 @@ def void_stamps(
# =============================================================================
@store_router.post("/points/earn", response_model=PointsEarnResponse)
@router.post("/points/earn", response_model=PointsEarnResponse)
def earn_points(
request: Request,
data: PointsEarnRequest,
@@ -633,7 +633,7 @@ def earn_points(
return PointsEarnResponse(**result)
@store_router.post("/points/redeem", response_model=PointsRedeemResponse)
@router.post("/points/redeem", response_model=PointsRedeemResponse)
def redeem_points(
request: Request,
data: PointsRedeemRequest,
@@ -660,7 +660,7 @@ def redeem_points(
return PointsRedeemResponse(**result)
@store_router.post("/points/void", response_model=PointsVoidResponse)
@router.post("/points/void", response_model=PointsVoidResponse)
def void_points(
request: Request,
data: PointsVoidRequest,
@@ -689,7 +689,7 @@ def void_points(
return PointsVoidResponse(**result)
@store_router.post("/cards/{card_id}/points/adjust", response_model=PointsAdjustResponse)
@router.post("/cards/{card_id}/points/adjust", response_model=PointsAdjustResponse)
def adjust_points(
request: Request,
data: PointsAdjustRequest,

View File

@@ -8,8 +8,8 @@ Provides Jinja2 template rendering for:
- Storefront pages: Customer loyalty dashboard, self-enrollment
"""
from app.modules.loyalty.routes.pages.admin import router as admin_router
from app.modules.loyalty.routes.pages.store import router as store_router
from app.modules.loyalty.routes.pages.admin import router as admin_page_router
from app.modules.loyalty.routes.pages.store import router as store_page_router
from app.modules.loyalty.routes.pages.storefront import router as storefront_router
__all__ = ["admin_router", "store_router", "storefront_router"]
__all__ = ["admin_page_router", "store_page_router", "storefront_router"]