route.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { db } from '@/lib/db';
  3. import { users } from '@/lib/schema';
  4. import { eq } from 'drizzle-orm';
  5. import jwt from 'jsonwebtoken';
  6. export async function PUT(request: NextRequest) {
  7. try {
  8. const token = request.cookies.get('auth-token')?.value;
  9. if (!token) {
  10. return NextResponse.json(
  11. { error: '未授权访问' },
  12. { status: 401 }
  13. );
  14. }
  15. let userId: string;
  16. try {
  17. const decoded = jwt.verify(token, process.env.JWT_SECRET!) as { userId: string };
  18. userId = decoded.userId;
  19. } catch (error) {
  20. return NextResponse.json(
  21. { error: '无效的认证令牌' },
  22. { status: 401 }
  23. );
  24. }
  25. const body = await request.json();
  26. const { username } = body;
  27. // 验证输入
  28. if (username !== null && typeof username !== 'string') {
  29. return NextResponse.json(
  30. { error: '用户名必须是字符串' },
  31. { status: 400 }
  32. );
  33. }
  34. // 如果提供了用户名,验证长度
  35. if (username && username.trim().length > 50) {
  36. return NextResponse.json(
  37. { error: '用户名长度不能超过50个字符' },
  38. { status: 400 }
  39. );
  40. }
  41. // 更新用户信息
  42. const updatedUser = await db
  43. .update(users)
  44. .set({
  45. username: username ? username.trim() : null,
  46. updatedAt: new Date(),
  47. })
  48. .where(eq(users.id, userId))
  49. .returning({
  50. id: users.id,
  51. email: users.email,
  52. username: users.username,
  53. isEmailVerified: users.isEmailVerified,
  54. });
  55. if (updatedUser.length === 0) {
  56. return NextResponse.json(
  57. { error: '用户不存在' },
  58. { status: 404 }
  59. );
  60. }
  61. return NextResponse.json({
  62. success: true,
  63. user: updatedUser[0],
  64. });
  65. } catch (error) {
  66. console.error('更新个人资料失败:', error);
  67. return NextResponse.json(
  68. { error: '服务器内部错误' },
  69. { status: 500 }
  70. );
  71. }
  72. }