fix(loyalty): replace broad exception handlers with specific types and rename onboarding service
- Replace `except Exception` with specific exception types in google_wallet_service.py (requests.RequestException, ValueError, etc.) and apple_wallet_service.py (httpx.HTTPError, OSError, ssl.SSLError) - Rename loyalty_onboarding.py -> loyalty_onboarding_service.py to match NAM-002 naming convention (+ test file + imports) - Add PasswordChangeResponse Pydantic model to user_account API, removing raw dict return and noqa suppression Resolves 12 EXC-003 + 1 NAM-002 architecture warnings in loyalty module. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
61
app/modules/loyalty/services/loyalty_onboarding_service.py
Normal file
61
app/modules/loyalty/services/loyalty_onboarding_service.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# app/modules/loyalty/services/loyalty_onboarding_service.py
|
||||
"""
|
||||
Onboarding provider for the loyalty module.
|
||||
|
||||
Provides the "Create your first loyalty program" step.
|
||||
Completed when at least 1 LoyaltyProgram exists for the store's merchant.
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.modules.contracts.onboarding import OnboardingStepDefinition
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LoyaltyOnboardingProvider:
|
||||
"""Onboarding provider for loyalty module."""
|
||||
|
||||
@property
|
||||
def onboarding_category(self) -> str:
|
||||
return "loyalty"
|
||||
|
||||
def get_onboarding_steps(self) -> list[OnboardingStepDefinition]:
|
||||
return [
|
||||
OnboardingStepDefinition(
|
||||
key="loyalty.create_program",
|
||||
title_key="loyalty.onboarding.create_program.title",
|
||||
description_key="loyalty.onboarding.create_program.description",
|
||||
icon="gift",
|
||||
route_template="/store/{store_code}/loyalty/settings",
|
||||
order=300,
|
||||
category="loyalty",
|
||||
),
|
||||
]
|
||||
|
||||
def is_step_completed(
|
||||
self, db: Session, store_id: int, step_key: str
|
||||
) -> bool:
|
||||
if step_key != "loyalty.create_program":
|
||||
return False
|
||||
|
||||
from app.modules.loyalty.models.loyalty_program import LoyaltyProgram
|
||||
from app.modules.tenancy.models.store import Store
|
||||
|
||||
# Programs belong to merchant, not store — join through store
|
||||
store = db.query(Store).filter(Store.id == store_id).first()
|
||||
if not store:
|
||||
return False
|
||||
|
||||
exists = (
|
||||
db.query(LoyaltyProgram)
|
||||
.filter(LoyaltyProgram.merchant_id == store.merchant_id)
|
||||
.first()
|
||||
is not None
|
||||
)
|
||||
return exists
|
||||
|
||||
|
||||
loyalty_onboarding_provider = LoyaltyOnboardingProvider()
|
||||
Reference in New Issue
Block a user