feat: module-driven onboarding system + simplified 3-step signup
Add OnboardingProviderProtocol so modules declare their own post-signup onboarding steps. The core OnboardingAggregator discovers enabled providers and exposes a dashboard API (GET /dashboard/onboarding). A session-scoped banner on the store dashboard shows a checklist that guides merchants through setup without blocking signup. Signup is simplified from 4 steps to 3 (Plan → Account → Payment): store creation is merged into account creation, store language is captured from the user's browsing language, and platform-specific template branching is removed. Includes 47 unit and integration tests covering all new providers, the aggregator, the API endpoint, and the signup service changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -40,6 +40,7 @@ class SignupStartRequest(BaseModel):
|
||||
tier_code: str
|
||||
is_annual: bool = False
|
||||
platform_code: str
|
||||
language: str = "fr"
|
||||
|
||||
|
||||
class SignupStartResponse(BaseModel):
|
||||
@@ -64,12 +65,14 @@ class CreateAccountRequest(BaseModel):
|
||||
|
||||
|
||||
class CreateAccountResponse(BaseModel):
|
||||
"""Response from account creation."""
|
||||
"""Response from account creation (includes auto-created store)."""
|
||||
|
||||
session_id: str
|
||||
user_id: int
|
||||
merchant_id: int
|
||||
stripe_customer_id: str
|
||||
store_id: int
|
||||
store_code: str
|
||||
|
||||
|
||||
class CreateStoreRequest(BaseModel):
|
||||
@@ -137,6 +140,7 @@ async def start_signup(request: SignupStartRequest) -> SignupStartResponse:
|
||||
tier_code=request.tier_code,
|
||||
is_annual=request.is_annual,
|
||||
platform_code=request.platform_code,
|
||||
language=request.language,
|
||||
)
|
||||
|
||||
return SignupStartResponse(
|
||||
@@ -175,6 +179,8 @@ async def create_account(
|
||||
user_id=result.user_id,
|
||||
merchant_id=result.merchant_id,
|
||||
stripe_customer_id=result.stripe_customer_id,
|
||||
store_id=result.store_id,
|
||||
store_code=result.store_code,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user