- 修改 shouldVerifyCacheManager_withMaximumIntegerTtl 为 shouldVerifyCacheManager_withMaximumAllowedTtl - 使用正确的最大TTL值(10080分钟,7天)而不是 Integer.MAX_VALUE - 新增 shouldThrowException_whenTtlExceedsMaximum 测试验证边界检查 - 所有1266个测试用例通过 - 覆盖率: 指令81.89%, 行88.48%, 分支51.55% docs: 添加项目状态报告 - 生成 PROJECT_STATUS_REPORT.md 详细记录项目当前状态 - 包含质量指标、已完成功能、待办事项和技术债务
42 lines
1.0 KiB
TypeScript
42 lines
1.0 KiB
TypeScript
export const parseUserId = (value: unknown): number | null => {
|
|
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
return value
|
|
}
|
|
if (typeof value === 'string' && value.trim() !== '') {
|
|
const parsed = Number(value)
|
|
return Number.isFinite(parsed) ? parsed : null
|
|
}
|
|
return null
|
|
}
|
|
|
|
export const getUserIdFromToken = (token?: string | null): number | null => {
|
|
if (!token) {
|
|
return null
|
|
}
|
|
|
|
const parts = token.split('.')
|
|
if (parts.length < 2) {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
const payload = JSON.parse(decodeBase64Url(parts[1]))
|
|
return parseUserId(payload?.userId)
|
|
} catch {
|
|
return null
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
const decodeBase64Url = (input: string): string => {
|
|
const normalized = input.replace(/-/g, '+').replace(/_/g, '/')
|
|
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')
|
|
const binary = atob(padded)
|
|
let result = ''
|
|
for (let i = 0; i < binary.length; i += 1) {
|
|
result += String.fromCharCode(binary.charCodeAt(i))
|
|
}
|
|
return decodeURIComponent(escape(result))
|
|
}
|