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:
2026-02-28 23:39:42 +01:00
parent f8a2394da5
commit ef9ea29643
26 changed files with 2055 additions and 699 deletions

View File

@@ -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,
)