Reverts the noqa: removal — the architecture validators (SVC-006, SEC-034, MOD-004, API-007) use these to skip known-safe violations. Added ruff lint.external config so ruff treats them as valid codes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
# app/modules/tenancy/routes/api/store.py
|
|
"""
|
|
Tenancy module store API routes.
|
|
|
|
Aggregates all store tenancy routes:
|
|
- /info/{store_code} - Public store info lookup
|
|
- /auth/* - Store authentication (login, logout, /me)
|
|
- /profile/* - Store profile management
|
|
- /team/* - Team member management, roles, permissions
|
|
|
|
The tenancy module owns identity and organizational hierarchy.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends, Path
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.database import get_db
|
|
from app.modules.tenancy.schemas.store import StoreDetailResponse
|
|
from app.modules.tenancy.services.store_service import store_service # noqa: mod-004
|
|
|
|
store_router = APIRouter()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@store_router.get("/info/{store_code}", response_model=StoreDetailResponse)
|
|
def get_store_info(
|
|
store_code: str = Path(..., description="Store code"),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""
|
|
Get public store information by store code.
|
|
|
|
This endpoint is used by the store login page to display store info.
|
|
No authentication required - this is public information.
|
|
|
|
**Use Case:**
|
|
- Store login page loads store info to display branding
|
|
- Shows store name, description, logo, etc.
|
|
|
|
**Returns only active stores** to prevent access to disabled accounts.
|
|
|
|
Args:
|
|
store_code: The store's unique code (e.g., 'WIZAMART')
|
|
db: Database session
|
|
|
|
Returns:
|
|
StoreResponse: Public store information
|
|
|
|
Raises:
|
|
StoreNotFoundException (404): Store not found or inactive
|
|
"""
|
|
logger.info(f"Public store info request: {store_code}")
|
|
|
|
store = store_service.get_active_store_by_code(db, store_code)
|
|
|
|
logger.info(f"Store info retrieved: {store.name} ({store.store_code})")
|
|
|
|
return StoreDetailResponse(
|
|
# Store fields
|
|
id=store.id,
|
|
store_code=store.store_code,
|
|
subdomain=store.subdomain,
|
|
name=store.name,
|
|
description=store.description,
|
|
merchant_id=store.merchant_id,
|
|
letzshop_csv_url_fr=store.letzshop_csv_url_fr,
|
|
letzshop_csv_url_en=store.letzshop_csv_url_en,
|
|
letzshop_csv_url_de=store.letzshop_csv_url_de,
|
|
is_active=store.is_active,
|
|
is_verified=store.is_verified,
|
|
created_at=store.created_at,
|
|
updated_at=store.updated_at,
|
|
# Merchant info
|
|
merchant_name=store.merchant.name,
|
|
merchant_contact_email=store.merchant.contact_email,
|
|
merchant_contact_phone=store.merchant.contact_phone,
|
|
merchant_website=store.merchant.website,
|
|
# Owner details (from merchant)
|
|
owner_email=store.merchant.owner.email,
|
|
owner_username=store.merchant.owner.username,
|
|
)
|
|
|
|
|
|
# ============================================================================
|
|
# Aggregate Sub-Routers
|
|
# ============================================================================
|
|
# Include all tenancy store routes (auth, profile, team)
|
|
|
|
from .store_auth import store_auth_router
|
|
from .store_profile import store_profile_router
|
|
from .store_team import store_team_router
|
|
|
|
store_router.include_router(store_auth_router, tags=["store-auth"])
|
|
store_router.include_router(store_profile_router, tags=["store-profile"])
|
|
store_router.include_router(store_team_router, tags=["store-team"])
|