sa2kit 1.6.64 → 1.6.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/auth/legacy/core/index.js +24 -12
  2. package/dist/auth/legacy/core/index.js.map +1 -1
  3. package/dist/auth/legacy/core/index.mjs +24 -12
  4. package/dist/auth/legacy/core/index.mjs.map +1 -1
  5. package/dist/auth/legacy/index.js +30 -12
  6. package/dist/auth/legacy/index.js.map +1 -1
  7. package/dist/auth/legacy/index.mjs +30 -12
  8. package/dist/auth/legacy/index.mjs.map +1 -1
  9. package/dist/auth/legacy/logic/index.js +24 -12
  10. package/dist/auth/legacy/logic/index.js.map +1 -1
  11. package/dist/auth/legacy/logic/index.mjs +24 -12
  12. package/dist/auth/legacy/logic/index.mjs.map +1 -1
  13. package/dist/auth/legacy/miniapp/index.js +24 -12
  14. package/dist/auth/legacy/miniapp/index.js.map +1 -1
  15. package/dist/auth/legacy/miniapp/index.mjs +24 -12
  16. package/dist/auth/legacy/miniapp/index.mjs.map +1 -1
  17. package/dist/auth/legacy/routes/index.d.mts +3 -0
  18. package/dist/auth/legacy/routes/index.d.ts +3 -0
  19. package/dist/auth/legacy/routes/index.js +8 -1
  20. package/dist/auth/legacy/routes/index.js.map +1 -1
  21. package/dist/auth/legacy/routes/index.mjs +8 -1
  22. package/dist/auth/legacy/routes/index.mjs.map +1 -1
  23. package/dist/auth/legacy/server/index.js +8 -1
  24. package/dist/auth/legacy/server/index.js.map +1 -1
  25. package/dist/auth/legacy/server/index.mjs +8 -1
  26. package/dist/auth/legacy/server/index.mjs.map +1 -1
  27. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -1
  28. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -1
  29. package/dist/auth/legacy/ui/web/index.js +6 -0
  30. package/dist/auth/legacy/ui/web/index.js.map +1 -1
  31. package/dist/auth/legacy/ui/web/index.mjs +6 -0
  32. package/dist/auth/legacy/ui/web/index.mjs.map +1 -1
  33. package/dist/auth/legacy/web/index.js +30 -12
  34. package/dist/auth/legacy/web/index.js.map +1 -1
  35. package/dist/auth/legacy/web/index.mjs +30 -12
  36. package/dist/auth/legacy/web/index.mjs.map +1 -1
  37. package/dist/festivalCard/index.d.mts +10 -0
  38. package/dist/festivalCard/index.d.ts +10 -0
  39. package/dist/festivalCard/index.js +206 -0
  40. package/dist/festivalCard/index.js.map +1 -0
  41. package/dist/festivalCard/index.mjs +181 -0
  42. package/dist/festivalCard/index.mjs.map +1 -0
  43. package/dist/index.d.mts +2 -1
  44. package/dist/index.d.ts +2 -1
  45. package/dist/index.js +210 -18
  46. package/dist/index.js.map +1 -1
  47. package/dist/index.mjs +208 -18
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/screenReceiver/core/index.d.mts +10 -2
  50. package/dist/screenReceiver/core/index.d.ts +10 -2
  51. package/dist/screenReceiver/core/index.js +15 -0
  52. package/dist/screenReceiver/core/index.js.map +1 -1
  53. package/dist/screenReceiver/core/index.mjs +15 -1
  54. package/dist/screenReceiver/core/index.mjs.map +1 -1
  55. package/dist/screenReceiver/index.d.mts +1 -1
  56. package/dist/screenReceiver/index.d.ts +1 -1
  57. package/dist/screenReceiver/index.js +21 -3
  58. package/dist/screenReceiver/index.js.map +1 -1
  59. package/dist/screenReceiver/index.mjs +21 -4
  60. package/dist/screenReceiver/index.mjs.map +1 -1
  61. package/dist/screenReceiver/server/index.js +1 -1
  62. package/dist/screenReceiver/server/index.js.map +1 -1
  63. package/dist/screenReceiver/server/index.mjs +1 -1
  64. package/dist/screenReceiver/server/index.mjs.map +1 -1
  65. package/dist/screenReceiver/server/next.d.mts +9 -0
  66. package/dist/screenReceiver/server/next.d.ts +9 -0
  67. package/dist/screenReceiver/server/next.js +178 -0
  68. package/dist/screenReceiver/server/next.js.map +1 -0
  69. package/dist/screenReceiver/server/next.mjs +176 -0
  70. package/dist/screenReceiver/server/next.mjs.map +1 -0
  71. package/dist/screenReceiver/web/index.d.mts +1 -1
  72. package/dist/screenReceiver/web/index.d.ts +1 -1
  73. package/dist/screenReceiver/web/index.js +21 -3
  74. package/dist/screenReceiver/web/index.js.map +1 -1
  75. package/dist/screenReceiver/web/index.mjs +21 -4
  76. package/dist/screenReceiver/web/index.mjs.map +1 -1
  77. package/dist/showmasterpiece/index.js +30 -12
  78. package/dist/showmasterpiece/index.js.map +1 -1
  79. package/dist/showmasterpiece/index.mjs +30 -12
  80. package/dist/showmasterpiece/index.mjs.map +1 -1
  81. package/dist/showmasterpiece/ui/web/index.js +30 -12
  82. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  83. package/dist/showmasterpiece/ui/web/index.mjs +30 -12
  84. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  85. package/dist/showmasterpiece/web/index.js +30 -12
  86. package/dist/showmasterpiece/web/index.js.map +1 -1
  87. package/dist/showmasterpiece/web/index.mjs +30 -12
  88. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  89. package/package.json +11 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts"],"names":["NextResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, data: { valid: false } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts"],"names":["NextResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, valid: false, user: null, data: { valid: false, user: null } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n valid: validation.valid,\n user: validation.user,\n message: validation.valid ? '会话有效' : '会话无效',\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n"]}
@@ -302,6 +302,8 @@ function createLegacyLoginHandler(config) {
302
302
  const response = server.NextResponse.json({
303
303
  success: true,
304
304
  message: "\u767B\u5F55\u6210\u529F",
305
+ user,
306
+ sessionToken: session.sessionToken,
305
307
  data: { user, sessionToken: session.sessionToken }
306
308
  });
307
309
  const cookieOptions = {
@@ -358,6 +360,8 @@ function createLegacyRegisterHandler(config) {
358
360
  const response = server.NextResponse.json({
359
361
  success: true,
360
362
  message: "\u6CE8\u518C\u6210\u529F",
363
+ user,
364
+ sessionToken: session.sessionToken,
361
365
  data: { user, sessionToken: session.sessionToken }
362
366
  });
363
367
  const cookieOptions = {
@@ -421,13 +425,16 @@ function createLegacyValidateHandler(config) {
421
425
  const sessionToken = request.cookies.get(cookieName)?.value;
422
426
  if (!sessionToken) {
423
427
  return server.NextResponse.json(
424
- { success: true, data: { valid: false } },
428
+ { success: true, valid: false, user: null, data: { valid: false, user: null } },
425
429
  { status: 200 }
426
430
  );
427
431
  }
428
432
  const validation = await config.authService.validateSession(sessionToken);
429
433
  return server.NextResponse.json({
430
434
  success: true,
435
+ valid: validation.valid,
436
+ user: validation.user,
437
+ message: validation.valid ? "\u4F1A\u8BDD\u6709\u6548" : "\u4F1A\u8BDD\u65E0\u6548",
431
438
  data: validation
432
439
  });
433
440
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/auth/legacy/schema/index.ts","../../../../src/auth/legacy/services/authDbService.ts","../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts","../../../../src/auth/legacy/server.ts"],"names":["pgTable","serial","varchar","boolean","timestamp","integer","text","relations","eq","bcrypt","randomBytes","and","gt","lt","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, data: { valid: false } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import type { NextRequest } from 'next/server';\nimport type { User } from './types';\nimport type { LegacyAuthDbService } from './services';\n\nexport interface LegacyServerConfig {\n cookieName?: string;\n}\n\nexport function createLegacyValidateApiAuth(\n authService: LegacyAuthDbService,\n config: LegacyServerConfig = {}\n) {\n const cookieName = config.cookieName || 'session_token';\n return async (request: NextRequest): Promise<User | null> => {\n try {\n const sessionToken = request.cookies.get(cookieName)?.value;\n if (!sessionToken) return null;\n\n const validation = await authService.validateSession(sessionToken);\n return validation.valid && validation.user ? validation.user : null;\n } catch (error) {\n console.error('💥 [LegacyAuth] API权限验证异常:', error);\n return null;\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/auth/legacy/schema/index.ts","../../../../src/auth/legacy/services/authDbService.ts","../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts","../../../../src/auth/legacy/server.ts"],"names":["pgTable","serial","varchar","boolean","timestamp","integer","text","relations","eq","bcrypt","randomBytes","and","gt","lt","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, valid: false, user: null, data: { valid: false, user: null } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n valid: validation.valid,\n user: validation.user,\n message: validation.valid ? '会话有效' : '会话无效',\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import type { NextRequest } from 'next/server';\nimport type { User } from './types';\nimport type { LegacyAuthDbService } from './services';\n\nexport interface LegacyServerConfig {\n cookieName?: string;\n}\n\nexport function createLegacyValidateApiAuth(\n authService: LegacyAuthDbService,\n config: LegacyServerConfig = {}\n) {\n const cookieName = config.cookieName || 'session_token';\n return async (request: NextRequest): Promise<User | null> => {\n try {\n const sessionToken = request.cookies.get(cookieName)?.value;\n if (!sessionToken) return null;\n\n const validation = await authService.validateSession(sessionToken);\n return validation.valid && validation.user ? validation.user : null;\n } catch (error) {\n console.error('💥 [LegacyAuth] API权限验证异常:', error);\n return null;\n }\n };\n}\n"]}
@@ -296,6 +296,8 @@ function createLegacyLoginHandler(config) {
296
296
  const response = NextResponse.json({
297
297
  success: true,
298
298
  message: "\u767B\u5F55\u6210\u529F",
299
+ user,
300
+ sessionToken: session.sessionToken,
299
301
  data: { user, sessionToken: session.sessionToken }
300
302
  });
301
303
  const cookieOptions = {
@@ -352,6 +354,8 @@ function createLegacyRegisterHandler(config) {
352
354
  const response = NextResponse.json({
353
355
  success: true,
354
356
  message: "\u6CE8\u518C\u6210\u529F",
357
+ user,
358
+ sessionToken: session.sessionToken,
355
359
  data: { user, sessionToken: session.sessionToken }
356
360
  });
357
361
  const cookieOptions = {
@@ -415,13 +419,16 @@ function createLegacyValidateHandler(config) {
415
419
  const sessionToken = request.cookies.get(cookieName)?.value;
416
420
  if (!sessionToken) {
417
421
  return NextResponse.json(
418
- { success: true, data: { valid: false } },
422
+ { success: true, valid: false, user: null, data: { valid: false, user: null } },
419
423
  { status: 200 }
420
424
  );
421
425
  }
422
426
  const validation = await config.authService.validateSession(sessionToken);
423
427
  return NextResponse.json({
424
428
  success: true,
429
+ valid: validation.valid,
430
+ user: validation.user,
431
+ message: validation.valid ? "\u4F1A\u8BDD\u6709\u6548" : "\u4F1A\u8BDD\u65E0\u6548",
425
432
  data: validation
426
433
  });
427
434
  } catch (error) {