* The backend wraps responses in `{code, message, data: {...}}` for some * endpoints and returns raw fields directly for others. Handle both.
(payload: unknown)
| 196 | * endpoints and returns raw fields directly for others. Handle both. |
| 197 | */ |
| 198 | function extractUserInfo(payload: unknown): UserInfo { |
| 199 | if (!payload || typeof payload !== "object" || Array.isArray(payload)) return {}; |
| 200 | const obj = payload as Record<string, unknown>; |
| 201 | const wrapped = obj["data"]; |
| 202 | const data = |
| 203 | wrapped && typeof wrapped === "object" && !Array.isArray(wrapped) |
| 204 | ? (wrapped as Record<string, unknown>) |
| 205 | : obj; |
| 206 | return { |
| 207 | username: pickString(data, "username"), |
| 208 | email: pickString(data, "email"), |
| 209 | first_name: pickString(data, "first_name"), |
| 210 | last_name: pickString(data, "last_name"), |
| 211 | billing_type: pickString(data, "billing_type"), |
| 212 | wallet: pickObject(data, "wallet") as WalletInfo | undefined, |
| 213 | subscription: pickObject(data, "subscription") as SubscriptionInfo | undefined, |
| 214 | usage_based: pickObject(data, "usage_based") as UsageBasedInfo | undefined, |
| 215 | }; |
| 216 | } |
| 217 | |
| 218 | function pickString(obj: Record<string, unknown>, key: string): string | undefined { |
| 219 | const v = obj[key]; |
no test coverage detected