fix(lint): auto-fix ruff violations and tune lint rules
- Auto-fixed 4,496 lint issues (import sorting, modern syntax, etc.) - Added ignore rules for patterns intentional in this codebase: E402 (late imports), E712 (SQLAlchemy filters), B904 (raise from), SIM108/SIM105/SIM117 (readability preferences) - Added per-file ignores for tests and scripts - Excluded broken scripts/rename_terminology.py (has curly quotes) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -19,15 +19,15 @@ The tenancy module owns identity and organizational hierarchy.
|
||||
from fastapi import APIRouter
|
||||
|
||||
from .admin_auth import admin_auth_router
|
||||
from .admin_users import admin_users_router
|
||||
from .admin_platform_users import admin_platform_users_router
|
||||
from .admin_merchants import admin_merchants_router
|
||||
from .admin_platforms import admin_platforms_router
|
||||
from .admin_stores import admin_stores_router
|
||||
from .admin_store_domains import admin_store_domains_router
|
||||
from .admin_merchant_domains import admin_merchant_domains_router
|
||||
from .admin_modules import router as admin_modules_router
|
||||
from .admin_merchants import admin_merchants_router
|
||||
from .admin_module_config import router as admin_module_config_router
|
||||
from .admin_modules import router as admin_modules_router
|
||||
from .admin_platform_users import admin_platform_users_router
|
||||
from .admin_platforms import admin_platforms_router
|
||||
from .admin_store_domains import admin_store_domains_router
|
||||
from .admin_stores import admin_stores_router
|
||||
from .admin_users import admin_users_router
|
||||
|
||||
admin_router = APIRouter()
|
||||
|
||||
|
||||
@@ -17,13 +17,20 @@ from sqlalchemy.orm import Session
|
||||
from app.api.deps import get_current_admin_api, get_current_admin_from_cookie_or_header
|
||||
from app.core.database import get_db
|
||||
from app.core.environment import should_use_secure_cookies
|
||||
from app.modules.tenancy.exceptions import InsufficientPermissionsException, InvalidCredentialsException
|
||||
from app.modules.tenancy.services.admin_platform_service import admin_platform_service
|
||||
from app.modules.core.services.auth_service import auth_service
|
||||
from app.modules.tenancy.exceptions import (
|
||||
InvalidCredentialsException,
|
||||
)
|
||||
from app.modules.tenancy.services.admin_platform_service import admin_platform_service
|
||||
from middleware.auth import AuthManager
|
||||
from app.modules.tenancy.models import Platform # noqa: API-007 - Admin needs to query platforms
|
||||
from models.schema.auth import UserContext
|
||||
from models.schema.auth import LoginResponse, LogoutResponse, PlatformSelectResponse, UserLogin, UserResponse
|
||||
from models.schema.auth import (
|
||||
LoginResponse,
|
||||
LogoutResponse,
|
||||
PlatformSelectResponse,
|
||||
UserContext,
|
||||
UserLogin,
|
||||
UserResponse,
|
||||
)
|
||||
|
||||
admin_auth_router = APIRouter(prefix="/auth")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -16,10 +16,6 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_admin_api
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.services.merchant_domain_service import (
|
||||
merchant_domain_service,
|
||||
)
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.schemas.merchant_domain import (
|
||||
MerchantDomainCreate,
|
||||
MerchantDomainDeletionResponse,
|
||||
@@ -31,6 +27,10 @@ from app.modules.tenancy.schemas.store_domain import (
|
||||
DomainVerificationInstructions,
|
||||
DomainVerificationResponse,
|
||||
)
|
||||
from app.modules.tenancy.services.merchant_domain_service import (
|
||||
merchant_domain_service,
|
||||
)
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
admin_merchant_domains_router = APIRouter(prefix="/merchants")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -11,9 +11,10 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_admin_api
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.exceptions import MerchantHasStoresException, ConfirmationRequiredException
|
||||
from app.modules.tenancy.services.merchant_service import merchant_service
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.exceptions import (
|
||||
ConfirmationRequiredException,
|
||||
MerchantHasStoresException,
|
||||
)
|
||||
from app.modules.tenancy.schemas.merchant import (
|
||||
MerchantCreate,
|
||||
MerchantCreateResponse,
|
||||
@@ -24,6 +25,8 @@ from app.modules.tenancy.schemas.merchant import (
|
||||
MerchantTransferOwnershipResponse,
|
||||
MerchantUpdate,
|
||||
)
|
||||
from app.modules.tenancy.services.merchant_service import merchant_service
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
admin_merchants_router = APIRouter(prefix="/merchants")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -136,7 +136,7 @@ async def list_all_modules(
|
||||
Super admin only.
|
||||
"""
|
||||
modules = []
|
||||
for code in MODULES.keys():
|
||||
for code in MODULES:
|
||||
# All modules shown as enabled in the global list
|
||||
modules.append(_build_module_response(code, is_enabled=True))
|
||||
|
||||
@@ -172,7 +172,7 @@ async def get_platform_modules(
|
||||
enabled_codes = module_service.get_enabled_module_codes(db, platform_id)
|
||||
|
||||
modules = []
|
||||
for code in MODULES.keys():
|
||||
for code in MODULES:
|
||||
is_enabled = code in enabled_codes
|
||||
modules.append(_build_module_response(code, is_enabled))
|
||||
|
||||
@@ -222,7 +222,7 @@ async def update_platform_modules(
|
||||
enabled_codes = module_service.get_enabled_module_codes(db, platform_id)
|
||||
|
||||
modules = []
|
||||
for code in MODULES.keys():
|
||||
for code in MODULES:
|
||||
is_enabled = code in enabled_codes
|
||||
modules.append(_build_module_response(code, is_enabled))
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@ from app.api.deps import get_current_admin_api
|
||||
from app.core.database import get_db
|
||||
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,
|
||||
UserContext,
|
||||
UserCreate,
|
||||
UserDeleteResponse,
|
||||
UserDetailResponse,
|
||||
|
||||
@@ -16,9 +16,6 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_admin_api
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.services.store_domain_service import store_domain_service
|
||||
from app.modules.tenancy.services.store_service import store_service
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.schemas.store_domain import (
|
||||
DomainDeletionResponse,
|
||||
DomainVerificationInstructions,
|
||||
@@ -28,6 +25,9 @@ from app.modules.tenancy.schemas.store_domain import (
|
||||
StoreDomainResponse,
|
||||
StoreDomainUpdate,
|
||||
)
|
||||
from app.modules.tenancy.services.store_domain_service import store_domain_service
|
||||
from app.modules.tenancy.services.store_service import store_service
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
admin_store_domains_router = APIRouter(prefix="/stores")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -16,9 +16,6 @@ from sqlalchemy.orm import Session
|
||||
from app.api.deps import get_current_admin_api
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.exceptions import ConfirmationRequiredException
|
||||
from app.modules.tenancy.services.admin_service import admin_service
|
||||
from app.modules.tenancy.services.store_service import store_service
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.schemas.store import (
|
||||
StoreCreate,
|
||||
StoreCreateResponse,
|
||||
@@ -27,6 +24,9 @@ from app.modules.tenancy.schemas.store import (
|
||||
StoreStatsResponse,
|
||||
StoreUpdate,
|
||||
)
|
||||
from app.modules.tenancy.services.admin_service import admin_service
|
||||
from app.modules.tenancy.services.store_service import store_service
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
admin_stores_router = APIRouter(prefix="/stores")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -13,7 +13,6 @@ This module provides endpoints for:
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Body, Depends, Path, Query
|
||||
from pydantic import BaseModel, EmailStr
|
||||
@@ -22,8 +21,10 @@ from sqlalchemy.orm import Session
|
||||
from app.api.deps import get_current_super_admin, get_current_super_admin_api
|
||||
from app.core.database import get_db
|
||||
from app.exceptions import ValidationException
|
||||
from app.modules.tenancy.models import (
|
||||
User, # noqa: API-007 - Internal helper uses User model
|
||||
)
|
||||
from app.modules.tenancy.services.admin_platform_service import admin_platform_service
|
||||
from app.modules.tenancy.models import User # noqa: API-007 - Internal helper uses User model
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
admin_users_router = APIRouter(prefix="/admin-users")
|
||||
@@ -53,14 +54,14 @@ class AdminUserResponse(BaseModel):
|
||||
id: int
|
||||
email: str
|
||||
username: str
|
||||
first_name: Optional[str] = None
|
||||
last_name: Optional[str] = None
|
||||
first_name: str | None = None
|
||||
last_name: str | None = None
|
||||
is_active: bool
|
||||
is_super_admin: bool
|
||||
platform_assignments: list[PlatformAssignmentResponse] = []
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
last_login: Optional[datetime] = None
|
||||
last_login: datetime | None = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
@@ -79,8 +80,8 @@ class CreateAdminUserRequest(BaseModel):
|
||||
email: EmailStr
|
||||
username: str
|
||||
password: str
|
||||
first_name: Optional[str] = None
|
||||
last_name: Optional[str] = None
|
||||
first_name: str | None = None
|
||||
last_name: str | None = None
|
||||
is_super_admin: bool = False
|
||||
platform_ids: list[int] = []
|
||||
|
||||
@@ -204,22 +205,21 @@ def create_admin_user(
|
||||
is_super_admin=user.is_super_admin,
|
||||
platform_assignments=[],
|
||||
)
|
||||
else:
|
||||
# Create platform admin with assignments using service
|
||||
user, assignments = admin_platform_service.create_platform_admin(
|
||||
db=db,
|
||||
email=request.email,
|
||||
username=request.username,
|
||||
password=request.password,
|
||||
platform_ids=request.platform_ids,
|
||||
created_by_user_id=current_admin.id,
|
||||
first_name=request.first_name,
|
||||
last_name=request.last_name,
|
||||
)
|
||||
db.commit()
|
||||
db.refresh(user)
|
||||
# Create platform admin with assignments using service
|
||||
user, assignments = admin_platform_service.create_platform_admin(
|
||||
db=db,
|
||||
email=request.email,
|
||||
username=request.username,
|
||||
password=request.password,
|
||||
platform_ids=request.platform_ids,
|
||||
created_by_user_id=current_admin.id,
|
||||
first_name=request.first_name,
|
||||
last_name=request.last_name,
|
||||
)
|
||||
db.commit()
|
||||
db.refresh(user)
|
||||
|
||||
return _build_admin_response(user)
|
||||
return _build_admin_response(user)
|
||||
|
||||
|
||||
@admin_users_router.get("/{user_id}", response_model=AdminUserResponse)
|
||||
|
||||
@@ -10,15 +10,18 @@ Auto-discovered by the route system (merchant.py in routes/api/).
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from pydantic import BaseModel, EmailStr
|
||||
from fastapi import APIRouter, Depends, Query, Request
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_merchant_from_cookie_or_header
|
||||
from app.api.deps import get_current_merchant_api, get_merchant_for_current_user
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.models import Merchant
|
||||
from app.modules.tenancy.schemas import (
|
||||
MerchantPortalProfileResponse,
|
||||
MerchantPortalProfileUpdate,
|
||||
MerchantPortalStoreListResponse,
|
||||
)
|
||||
from app.modules.tenancy.services.merchant_service import merchant_service
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
from .merchant_auth import merchant_auth_router
|
||||
@@ -34,95 +37,40 @@ router.include_router(merchant_auth_router, tags=["merchant-auth"])
|
||||
_account_router = APIRouter(prefix="/account")
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# SCHEMAS
|
||||
# ============================================================================
|
||||
|
||||
|
||||
class MerchantProfileUpdate(BaseModel):
|
||||
"""Schema for updating merchant profile information."""
|
||||
|
||||
name: str | None = None
|
||||
contact_email: EmailStr | None = None
|
||||
contact_phone: str | None = None
|
||||
website: str | None = None
|
||||
business_address: str | None = None
|
||||
tax_number: str | None = None
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# HELPERS
|
||||
# ============================================================================
|
||||
|
||||
|
||||
def _get_user_merchant(db: Session, user_context: UserContext) -> Merchant:
|
||||
"""
|
||||
Get the first active merchant owned by the authenticated user.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
user_context: Authenticated user context
|
||||
|
||||
Returns:
|
||||
Merchant: The user's active merchant
|
||||
|
||||
Raises:
|
||||
HTTPException: 404 if user does not own any active merchant
|
||||
"""
|
||||
merchant = (
|
||||
db.query(Merchant)
|
||||
.filter(
|
||||
Merchant.owner_user_id == user_context.id,
|
||||
Merchant.is_active == True, # noqa: E712
|
||||
)
|
||||
.first()
|
||||
)
|
||||
|
||||
if not merchant:
|
||||
raise HTTPException(status_code=404, detail="Merchant not found")
|
||||
|
||||
return merchant
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# ACCOUNT ENDPOINTS
|
||||
# ============================================================================
|
||||
|
||||
|
||||
@_account_router.get("/stores")
|
||||
@_account_router.get("/stores", response_model=MerchantPortalStoreListResponse)
|
||||
async def merchant_stores(
|
||||
request: Request,
|
||||
current_user: UserContext = Depends(get_current_merchant_from_cookie_or_header),
|
||||
skip: int = Query(0, ge=0, description="Number of records to skip"),
|
||||
limit: int = Query(100, ge=1, le=200, description="Max records to return"),
|
||||
merchant=Depends(get_merchant_for_current_user),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""
|
||||
List all stores belonging to the merchant.
|
||||
|
||||
Returns a list of store summary dicts with basic info for each store
|
||||
owned by the authenticated merchant.
|
||||
Returns a paginated list of store summaries for the authenticated merchant.
|
||||
"""
|
||||
merchant = _get_user_merchant(db, current_user)
|
||||
stores, total = merchant_service.get_merchant_stores(
|
||||
db, merchant.id, skip=skip, limit=limit
|
||||
)
|
||||
|
||||
stores = []
|
||||
for store in merchant.stores:
|
||||
stores.append(
|
||||
{
|
||||
"id": store.id,
|
||||
"name": store.name,
|
||||
"store_code": store.store_code,
|
||||
"is_active": store.is_active,
|
||||
"created_at": store.created_at.isoformat() if store.created_at else None,
|
||||
}
|
||||
)
|
||||
|
||||
return {"stores": stores}
|
||||
return MerchantPortalStoreListResponse(
|
||||
stores=stores,
|
||||
total=total,
|
||||
skip=skip,
|
||||
limit=limit,
|
||||
)
|
||||
|
||||
|
||||
@_account_router.get("/profile")
|
||||
@_account_router.get("/profile", response_model=MerchantPortalProfileResponse)
|
||||
async def merchant_profile(
|
||||
request: Request,
|
||||
current_user: UserContext = Depends(get_current_merchant_from_cookie_or_header),
|
||||
db: Session = Depends(get_db),
|
||||
merchant=Depends(get_merchant_for_current_user),
|
||||
):
|
||||
"""
|
||||
Get the authenticated merchant's profile information.
|
||||
@@ -130,25 +78,15 @@ async def merchant_profile(
|
||||
Returns merchant details including contact info, business details,
|
||||
and verification status.
|
||||
"""
|
||||
merchant = _get_user_merchant(db, current_user)
|
||||
|
||||
return {
|
||||
"id": merchant.id,
|
||||
"name": merchant.name,
|
||||
"contact_email": merchant.contact_email,
|
||||
"contact_phone": merchant.contact_phone,
|
||||
"website": merchant.website,
|
||||
"business_address": merchant.business_address,
|
||||
"tax_number": merchant.tax_number,
|
||||
"is_verified": merchant.is_verified,
|
||||
}
|
||||
return merchant
|
||||
|
||||
|
||||
@_account_router.put("/profile")
|
||||
@_account_router.put("/profile", response_model=MerchantPortalProfileResponse)
|
||||
async def update_merchant_profile(
|
||||
request: Request,
|
||||
profile_data: MerchantProfileUpdate,
|
||||
current_user: UserContext = Depends(get_current_merchant_from_cookie_or_header),
|
||||
profile_data: MerchantPortalProfileUpdate,
|
||||
current_user: UserContext = Depends(get_current_merchant_api),
|
||||
merchant=Depends(get_merchant_for_current_user),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""
|
||||
@@ -156,8 +94,6 @@ async def update_merchant_profile(
|
||||
|
||||
Accepts partial updates - only provided fields are changed.
|
||||
"""
|
||||
merchant = _get_user_merchant(db, current_user)
|
||||
|
||||
# Apply only the fields that were explicitly provided
|
||||
update_data = profile_data.model_dump(exclude_unset=True)
|
||||
for field_name, value in update_data.items():
|
||||
@@ -171,16 +107,7 @@ async def update_merchant_profile(
|
||||
f"user={current_user.username}, fields={list(update_data.keys())}"
|
||||
)
|
||||
|
||||
return {
|
||||
"id": merchant.id,
|
||||
"name": merchant.name,
|
||||
"contact_email": merchant.contact_email,
|
||||
"contact_phone": merchant.contact_phone,
|
||||
"website": merchant.website,
|
||||
"business_address": merchant.business_address,
|
||||
"tax_number": merchant.tax_number,
|
||||
"is_verified": merchant.is_verified,
|
||||
}
|
||||
return merchant
|
||||
|
||||
|
||||
# Include account routes in main router
|
||||
|
||||
@@ -18,7 +18,13 @@ from app.api.deps import get_current_merchant_from_cookie_or_header
|
||||
from app.core.database import get_db
|
||||
from app.core.environment import should_use_secure_cookies
|
||||
from app.modules.core.services.auth_service import auth_service
|
||||
from models.schema.auth import LoginResponse, LogoutResponse, UserLogin, UserResponse, UserContext
|
||||
from models.schema.auth import (
|
||||
LoginResponse,
|
||||
LogoutResponse,
|
||||
UserContext,
|
||||
UserLogin,
|
||||
UserResponse,
|
||||
)
|
||||
|
||||
merchant_auth_router = APIRouter(prefix="/auth")
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -106,12 +112,6 @@ def merchant_logout(response: Response):
|
||||
path="/merchants",
|
||||
)
|
||||
|
||||
# Also clear legacy cookie with path=/ (from before path isolation was added)
|
||||
response.delete_cookie(
|
||||
key="merchant_token",
|
||||
path="/",
|
||||
)
|
||||
|
||||
logger.debug("Deleted merchant_token cookies (both /merchants and / paths)")
|
||||
logger.debug("Deleted merchant_token cookie (path=/merchants)")
|
||||
|
||||
return LogoutResponse(message="Logged out successfully")
|
||||
|
||||
@@ -17,8 +17,8 @@ from fastapi import APIRouter, Depends, Path
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.services.store_service import store_service # noqa: mod-004
|
||||
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__)
|
||||
|
||||
@@ -21,11 +21,10 @@ from sqlalchemy.orm import Session
|
||||
from app.api.deps import get_current_store_api
|
||||
from app.core.database import get_db
|
||||
from app.core.environment import should_use_secure_cookies
|
||||
from app.modules.tenancy.exceptions import InvalidCredentialsException
|
||||
from app.modules.core.services.auth_service import auth_service
|
||||
from app.modules.tenancy.exceptions import InvalidCredentialsException
|
||||
from middleware.store_context import get_current_store
|
||||
from models.schema.auth import UserContext
|
||||
from models.schema.auth import LogoutResponse, UserLogin, StoreUserResponse
|
||||
from models.schema.auth import LogoutResponse, StoreUserResponse, UserContext, UserLogin
|
||||
|
||||
store_auth_router = APIRouter(prefix="/auth")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -13,9 +13,9 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_store_api
|
||||
from app.core.database import get_db
|
||||
from app.modules.tenancy.schemas.store import StoreResponse, StoreUpdate
|
||||
from app.modules.tenancy.services.store_service import store_service
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.schemas.store import StoreResponse, StoreUpdate
|
||||
|
||||
store_profile_router = APIRouter(prefix="/profile")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -22,10 +22,6 @@ from app.api.deps import (
|
||||
require_store_permission,
|
||||
)
|
||||
from app.core.database import get_db
|
||||
# Permission IDs are now defined in module definition.py files
|
||||
# and discovered by PermissionDiscoveryService
|
||||
from app.modules.tenancy.services.store_team_service import store_team_service
|
||||
from models.schema.auth import UserContext
|
||||
from app.modules.tenancy.schemas.team import (
|
||||
BulkRemoveRequest,
|
||||
BulkRemoveResponse,
|
||||
@@ -41,6 +37,11 @@ from app.modules.tenancy.schemas.team import (
|
||||
UserPermissionsResponse,
|
||||
)
|
||||
|
||||
# Permission IDs are now defined in module definition.py files
|
||||
# and discovered by PermissionDiscoveryService
|
||||
from app.modules.tenancy.services.store_team_service import store_team_service
|
||||
from models.schema.auth import UserContext
|
||||
|
||||
store_team_router = APIRouter(prefix="/team")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -268,7 +269,7 @@ def update_team_member(
|
||||
"""
|
||||
store = request.state.store
|
||||
|
||||
store_user = store_team_service.update_member_role(
|
||||
store_team_service.update_member_role(
|
||||
db=db,
|
||||
store=store,
|
||||
user_id=user_id,
|
||||
|
||||
Reference in New Issue
Block a user