feat(tenancy): show merchant & store details on merchant user detail page

Add clickable card grids for owned merchants and store memberships,
replacing static count-only banners with linked summaries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 22:29:33 +01:00
parent d57f6a8ee6
commit cea8ac56f8
3 changed files with 110 additions and 22 deletions

View File

@@ -18,6 +18,8 @@ from app.modules.core.services.stats_aggregator import stats_aggregator
from app.modules.tenancy.services.admin_service import admin_service
from models.schema.auth import UserContext
from models.schema.auth import (
OwnedMerchantSummary,
StoreMembershipSummary,
UserCreate,
UserDeleteResponse,
UserDetailResponse,
@@ -76,6 +78,25 @@ def get_all_users(
is_email_verified=user.is_email_verified,
owned_merchants_count=len(user.owned_merchants) if user.owned_merchants else 0,
store_memberships_count=len(user.store_memberships) if user.store_memberships else 0,
owned_merchants=[
OwnedMerchantSummary(
id=m.id,
name=m.name,
is_active=m.is_active,
store_count=len(m.stores) if m.stores else 0,
)
for m in (user.owned_merchants or [])
],
store_memberships=[
StoreMembershipSummary(
store_id=su.store_id,
store_code=su.store.store_code,
store_name=su.store.name,
user_type=su.user_type,
is_active=su.is_active,
)
for su in (user.store_memberships or [])
],
)
for user in users
]
@@ -264,6 +285,25 @@ def get_user_details(
store_memberships_count=len(user.store_memberships)
if user.store_memberships
else 0,
owned_merchants=[
OwnedMerchantSummary(
id=m.id,
name=m.name,
is_active=m.is_active,
store_count=len(m.stores) if m.stores else 0,
)
for m in (user.owned_merchants or [])
],
store_memberships=[
StoreMembershipSummary(
store_id=su.store_id,
store_code=su.store.store_code,
store_name=su.store.name,
user_type=su.user_type,
is_active=su.is_active,
)
for su in (user.store_memberships or [])
],
)