Files
goodbuddy/src/shared/weixin-channel-contracts.ts
T

50 lines
1.2 KiB
TypeScript

import { z } from 'zod'
export const weixinBindingStatusSchema = z.enum([
'stopped',
'starting',
'pending',
'scanned',
'verification_required',
'connected',
'expired',
'failed'
])
export type WeixinBindingStatus = z.infer<
typeof weixinBindingStatusSchema
>
export const weixinBindingSnapshotSchema = z
.object({
status: weixinBindingStatusSchema,
qrPayload: z.string().min(1).max(4_096).optional(),
qrExpiresAt: z.string().datetime({ offset: true }).optional(),
accountDisplay: z.string().trim().min(1).max(64).optional(),
detail: z.string().trim().min(1).max(512).optional()
})
.strict()
export type WeixinBindingSnapshot = z.infer<
typeof weixinBindingSnapshotSchema
>
export const weixinVerificationInputSchema = z
.object({
code: z
.string()
.trim()
.min(1)
.max(32)
.regex(/^[0-9]+$/u, '验证码只能包含数字')
})
.strict()
export type WeixinVerificationInput = z.infer<
typeof weixinVerificationInputSchema
>
export function weixinAccountDisplay(value: string): string | undefined {
const normalized = value.trim()
return normalized
? `微信用户 ****${normalized.slice(-4)}`
: undefined
}