export type RedeemErrorCode = | "invalid_code" | "expired_code" | "already_redeemed" | "account_not_eligible" | "rate_limited" | "system_error"; export type RedeemErrorResponse = { status: number; message: string; code: RedeemErrorCode; }; /** * Maps a redeem_code RPC error_code to a stable API error contract. * revoked_code is normalized to invalid_code (the stable code set has no * revoked variant). Unknown or system-side error codes collapse to * system_error. account_not_eligible is kept as a mapping only: there is no * account-eligibility restriction model, so no check is fabricated. */ export function redeemErrorResponse(errorCode: string): RedeemErrorResponse { switch (errorCode) { case "expired_code": return { status: 410, message: "兑换码已过期", code: "expired_code" }; case "already_redeemed": return { status: 409, message: "兑换码已被使用", code: "already_redeemed" }; case "account_not_eligible": return { status: 403, message: "该兑换码不适用于当前账户", code: "account_not_eligible" }; case "rate_limited": return { status: 429, message: "请求过于频繁", code: "rate_limited" }; case "revoked_code": return { status: 404, message: "兑换码已撤销", code: "invalid_code" }; case "invalid_code": return { status: 404, message: "兑换码不存在", code: "invalid_code" }; case "profile_missing": return { status: 500, message: "系统异常,请稍后重试", code: "system_error" }; default: return { status: 500, message: "系统异常,请稍后重试", code: "system_error" }; } } export function redeemInputErrorResponse(): RedeemErrorResponse { return { status: 400, message: "请输入有效兑换码", code: "invalid_code" }; }