fix: make FrontendType mandatory in require_module_access

The require_module_access dependency was using path-based detection to
determine admin vs vendor authentication, which failed for API routes
(/api/v1/admin/*) because it only checked for /admin/*.

Changes:
- Make frontend_type parameter mandatory (was optional with fallback)
- Remove path-based detection logic from require_module_access
- Update all 33 module route files to pass explicit FrontendType:
  - 15 admin routes use FrontendType.ADMIN
  - 18 vendor routes use FrontendType.VENDOR

This ensures authentication method is explicitly declared at route
definition time, making it independent of URL structure and future-proof
for API version changes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-02 22:09:21 +01:00
parent 01e7602dcb
commit 9a0dd84035
34 changed files with 83 additions and 45 deletions

View File

@@ -18,6 +18,7 @@ from sqlalchemy.orm import Session
from app.api.deps import get_current_admin_api, require_module_access
from app.core.database import get_db
from app.modules.billing.services import admin_subscription_service, subscription_service
from app.modules.enums import FrontendType
from app.modules.tenancy.models import User
from app.modules.billing.schemas import (
BillingHistoryListResponse,
@@ -39,7 +40,7 @@ logger = logging.getLogger(__name__)
# Admin router with module access control
admin_router = APIRouter(
prefix="/subscriptions",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.ADMIN))],
)

View File

@@ -20,11 +20,12 @@ from sqlalchemy.orm import Session
from app.api.deps import get_current_admin_api, require_module_access
from app.core.database import get_db
from app.modules.billing.services.feature_service import feature_service
from app.modules.enums import FrontendType
from models.schema.auth import UserContext
admin_features_router = APIRouter(
prefix="/features",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.ADMIN))],
)
logger = logging.getLogger(__name__)

View File

@@ -20,6 +20,7 @@ from app.api.deps import get_current_vendor_api, require_module_access
from app.core.config import settings
from app.core.database import get_db
from app.modules.billing.services import billing_service, subscription_service
from app.modules.enums import FrontendType
from app.modules.tenancy.models import User
logger = logging.getLogger(__name__)
@@ -27,7 +28,7 @@ logger = logging.getLogger(__name__)
# Vendor router with module access control
vendor_router = APIRouter(
prefix="/billing",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.VENDOR))],
)

View File

@@ -21,11 +21,12 @@ from app.api.deps import get_current_vendor_api, require_module_access
from app.core.config import settings
from app.core.database import get_db
from app.modules.billing.services import billing_service
from app.modules.enums import FrontendType
from models.schema.auth import UserContext
vendor_addons_router = APIRouter(
prefix="/addons",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.VENDOR))],
)
logger = logging.getLogger(__name__)

View File

@@ -22,10 +22,11 @@ from app.api.deps import get_current_vendor_api, require_module_access
from app.core.config import settings
from app.core.database import get_db
from app.modules.billing.services import billing_service, subscription_service
from app.modules.enums import FrontendType
from models.schema.auth import UserContext
vendor_checkout_router = APIRouter(
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.VENDOR))],
)
logger = logging.getLogger(__name__)

View File

@@ -26,11 +26,12 @@ from app.api.deps import get_current_vendor_api, require_module_access
from app.core.database import get_db
from app.modules.billing.exceptions import FeatureNotFoundError
from app.modules.billing.services.feature_service import feature_service
from app.modules.enums import FrontendType
from models.schema.auth import UserContext
vendor_features_router = APIRouter(
prefix="/features",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.VENDOR))],
)
logger = logging.getLogger(__name__)

View File

@@ -19,11 +19,12 @@ from sqlalchemy.orm import Session
from app.api.deps import get_current_vendor_api, require_module_access
from app.core.database import get_db
from app.modules.analytics.services.usage_service import usage_service
from app.modules.enums import FrontendType
from models.schema.auth import UserContext
vendor_usage_router = APIRouter(
prefix="/usage",
dependencies=[Depends(require_module_access("billing"))],
dependencies=[Depends(require_module_access("billing", FrontendType.VENDOR))],
)
logger = logging.getLogger(__name__)