From 17141abb05f458cd0914d3f1c573553984cb33ee Mon Sep 17 00:00:00 2001 From: Andrei Date: Sun, 12 Oct 2025 22:39:08 +0000 Subject: [PATCH] fix: add GET handler to user profile API route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed 405 Method Not Allowed error on subscription pages: Issue: - Subscription pages were making GET requests to /api/user/profile - The API route only had a PUT handler (for profile updates) - This caused 405 (Method Not Allowed) errors Solution: - Added GET handler to /api/user/profile/route.ts - Handler authenticates user via Bearer token - Returns complete user data including subscription fields: * subscriptionTier * subscriptionStatus * conversationLimit * conversationCount * limitResetDate * stripeCustomerId * stripeSubscriptionId Result: - Subscription pages can now fetch user data successfully - Settings page subscription widget displays correctly - No more 405 errors in console 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/api/user/profile/route.ts | 69 ++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/app/api/user/profile/route.ts b/app/api/user/profile/route.ts index 4bf5e0d..abb44b4 100644 --- a/app/api/user/profile/route.ts +++ b/app/api/user/profile/route.ts @@ -10,18 +10,83 @@ function getErrorMessages(locale: string = 'ro') { unauthorized: 'Nu esti autentificat', nameRequired: 'Numele este obligatoriu', updateFailed: 'Actualizarea a eșuat', - success: 'Profil actualizat cu succes' + success: 'Profil actualizat cu succes', + userNotFound: 'Utilizator negăsit' }, en: { unauthorized: 'Unauthorized', nameRequired: 'Name is required', updateFailed: 'Update failed', - success: 'Profile updated successfully' + success: 'Profile updated successfully', + userNotFound: 'User not found' } } return messages[locale as keyof typeof messages] || messages.ro } +export async function GET(request: Request) { + try { + const url = new URL(request.url) + const locale = url.searchParams.get('locale') || 'ro' + const messages = getErrorMessages(locale) + + // Get token from authorization header + const authHeader = request.headers.get('authorization') + const token = authHeader?.replace('Bearer ', '') + + if (!token) { + return NextResponse.json({ error: messages.unauthorized }, { status: 401 }) + } + + // Verify token and get user + const user = await getUserFromToken(token) + + if (!user) { + return NextResponse.json({ error: messages.unauthorized }, { status: 401 }) + } + + // Get full user data including subscription fields + const userData = await prisma.user.findUnique({ + where: { id: user.id }, + select: { + id: true, + email: true, + name: true, + role: true, + theme: true, + fontSize: true, + subscriptionTier: true, + subscriptionStatus: true, + conversationLimit: true, + conversationCount: true, + limitResetDate: true, + stripeCustomerId: true, + stripeSubscriptionId: true, + createdAt: true, + updatedAt: true, + lastLoginAt: true + } + }) + + if (!userData) { + return NextResponse.json({ error: messages.userNotFound }, { status: 404 }) + } + + return NextResponse.json({ + success: true, + user: userData + }) + + } catch (error) { + console.error('Profile fetch error:', error) + const url = new URL(request.url) + const locale = url.searchParams.get('locale') || 'ro' + const messages = getErrorMessages(locale) + + return NextResponse.json({ error: messages.unauthorized }, { status: 500 }) + } +} + export async function PUT(request: Request) { try { const url = new URL(request.url)