Files
biblical-guide.com/app/api/user/profile/route.ts
Andrei 17141abb05 fix: add GET handler to user profile API route
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 <noreply@anthropic.com>
2025-10-12 22:39:08 +00:00

147 lines
4.2 KiB
TypeScript

import { NextResponse } from 'next/server'
import { getUserFromToken } from '@/lib/auth'
import { prisma } from '@/lib/db'
export const runtime = 'nodejs'
function getErrorMessages(locale: string = 'ro') {
const messages = {
ro: {
unauthorized: 'Nu esti autentificat',
nameRequired: 'Numele este obligatoriu',
updateFailed: 'Actualizarea a eșuat',
success: 'Profil actualizat cu succes',
userNotFound: 'Utilizator negăsit'
},
en: {
unauthorized: 'Unauthorized',
nameRequired: 'Name is required',
updateFailed: 'Update failed',
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)
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 })
}
// Parse request body
const { name } = await request.json()
// Validate input
if (!name || typeof name !== 'string' || name.trim().length === 0) {
return NextResponse.json({ error: messages.nameRequired }, { status: 400 })
}
// Update user profile using raw query
await prisma.$executeRaw`
UPDATE "User"
SET name = ${name.trim()}, "updatedAt" = CURRENT_TIMESTAMP
WHERE id = ${user.id}
`
// Get updated user data
const updatedUsers = await prisma.$queryRaw`
SELECT id, email, name, role, theme, "fontSize", "createdAt", "updatedAt", "lastLoginAt"
FROM "User"
WHERE id = ${user.id}
`
const updatedUser = Array.isArray(updatedUsers) && updatedUsers.length > 0 ? updatedUsers[0] : null
return NextResponse.json({
message: messages.success,
user: updatedUser
})
} catch (error) {
console.error('Profile update error:', error)
const url = new URL(request.url)
const locale = url.searchParams.get('locale') || 'ro'
const messages = getErrorMessages(locale)
return NextResponse.json({ error: messages.updateFailed }, { status: 500 })
}
}