import { generateToken } from '~/server/utils/auth' import { prisma } from '~/server/utils/prisma' interface FirebaseUser { localId: string email: string displayName?: string photoUrl?: string } export default defineEventHandler(async (event) => { const body = await readBody(event) const { idToken } = body if (!idToken) { throw createError({ statusCode: 400, message: 'Firebase ID token required' }) } const config = useRuntimeConfig() const apiKey = config.firebaseApiKey || config.public.firebaseApiKey if (!apiKey) { throw createError({ statusCode: 500, message: 'Firebase API key not configured' }) } const verifyRes = await $fetch( `https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${apiKey}`, { method: 'POST', body: { idToken } } ).catch(() => null) if (!verifyRes?.users?.[0]) { throw createError({ statusCode: 401, message: 'Invalid Firebase token' }) } const fbUser: FirebaseUser = verifyRes.users[0] const email = fbUser.email const username = fbUser.displayName || email.split('@')[0] const userId = fbUser.localId const user = await prisma.user.upsert({ where: { email }, update: { username }, create: { id: userId, email, username, password: 'firebase-managed', role: 'user', profile: { create: { displayName: username, avatar: fbUser.photoUrl || `https://api.dicebear.com/7.x/avataaars/svg?seed=${userId}` } } } }) const token = generateToken({ id: user.id, email: user.email, username: user.username, role: user.role }) return { message: 'Google sign-in successful', token, user: { id: user.id, email: user.email, username: user.username, role: user.role, photoUrl: fbUser.photoUrl } } })