Validation: Stripe Connect payout + admin result
Verdict: PARTIAL
Ticket
Issue #12 — Stripe Connect Express payout flow + admin game result endpoint. Board item #798.
Environment
Code review of repo at
~/twitch-2k-wager/. Runtime blocked — STRIPE_SECRET_KEY, ADMIN_SECRET not configured.Checks
| # | Criterion | How Verified | Result | Evidence |
|---|---|---|---|---|
| 1 | POST /api/admin/result endpoint exists | File read | PASS | src/routes/api/admin/result/+server.ts — 223 lines. Accepts {game_id, winner} body. ADMIN_SECRET Bearer auth. Validates game is in active status (paid/queued/playing). |
| 2 | Challenger win flow: Connect account creation | Code review | PASS | handleChallengerWin(): First win creates Connect Express account via createConnectAccount(email), updates challenger connect status to 'pending', creates payout (status: onboarding), returns onboarding URL. |
| 3 | Challenger win flow: Already onboarded | Code review | PASS | If connect_onboarding_status === 'complete' and account exists, creates transfer immediately via createTransfer(). Payout status: initiated. |
| 4 | Marcus win flow: Revenue split | Code review | PASS | handleMarcusWin(): Game -> 'lost'. 50/50 revenue split recorded via recordRevenueSplit(). MARCUS_CUT_PCT = 50. |
| 5 | Connect helpers in stripe.ts | File read | PASS | createConnectAccount() — Express type, transfers capability, manual payout schedule. getOnboardingLink() — account_onboarding type with return/refresh URLs. createTransfer() — amount in cents, USD, game_id metadata. |
| 6 | Admin auth guard | Code review | PASS | requireAdmin() checks ADMIN_SECRET env var, validates Authorization Bearer header. Returns 401/403/500 on failures. |
| 7 | Webhook handles account.updated for onboarding completion | Code review | PASS | handleAccountUpdated() checks charges_enabled + details_submitted, finds challenger by connect account ID, marks onboarding complete, processes pending payouts. |
| 8 | Test file exists | Filesystem check | PASS | src/routes/api/admin/result/__tests__/result.test.ts present |
| 9 | Runtime admin endpoint | N/A | BLOCKED | Cannot test — STRIPE_SECRET_KEY, ADMIN_SECRET, DATABASE_URL not configured in dev overlay. |
Regression Check
Admin endpoint is isolated — does not affect landing page or other routes. No regression on existing functionality.
Discovered Issues
No code bugs. Full Connect payout flow requires: (1) Stripe Connect enabled on account, (2) STRIPE_SECRET_KEY, ADMIN_SECRET, DATABASE_URL configured. Tracked by issue #21.