47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
|
|
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" };
|
|
}
|