import { NextRequest, NextResponse } from "next/server"; import bcrypt from "bcryptjs"; import { prisma } from "@/lib/prisma"; import { signJWT } from "@/lib/auth"; import { findReferrerByCode } from "@/lib/referral"; const REFERRER_REWARD_FLH = 200; const REFERRED_BONUS_FLH = 1000; export async function POST(req: NextRequest) { try { const { email, name, password, referralCode } = await req.json(); if (!email || !name || !password) { return NextResponse.json( { error: "Email, name, and password are required" }, { status: 400 } ); } const existing = await prisma.user.findUnique({ where: { email } }); if (existing) { return NextResponse.json( { error: "An account with this email already exists" }, { status: 409 } ); } const passwordHash = await bcrypt.hash(password, 12); // Look up referrer if a referral code was provided let referrerId: string | null = null; if (referralCode && typeof referralCode === "string") { const users = await prisma.user.findMany({ select: { id: true }, }); referrerId = await findReferrerByCode(users, referralCode); } // Calculate starting balance let startingBalance = 5000; // default sign-up bonus if (referrerId) { startingBalance += REFERRED_BONUS_FLH; // +1,000 FLH for using a referral code } const user = await prisma.user.create({ data: { email, name, passwordHash, provider: "email", flhBalance: startingBalance, trialEndsAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), }, }); // If referral code was valid, create the referral record and credit the referrer if (referrerId) { await prisma.$transaction([ // Create the referral record prisma.referral.create({ data: { referrerId, referredId: user.id, status: "joined", rewardFlh: REFERRER_REWARD_FLH, }, }), // Credit the referrer prisma.user.update({ where: { id: referrerId }, data: { flhBalance: { increment: REFERRER_REWARD_FLH } }, }), // Notify the referrer prisma.notification.create({ data: { userId: referrerId, type: "referral_bonus", title: "Referral Bonus Earned!", body: `${name} joined Falah using your referral code — you earned ${REFERRER_REWARD_FLH} FLH!`, data: JSON.stringify({ referredUserId: user.id, referredName: name, rewardFlh: REFERRER_REWARD_FLH, }), }, }), ]); } const token = await signJWT({ userId: user.id, email: user.email, isPremium: user.isPremium, isPro: user.isPro, }); return NextResponse.json({ token, user: { id: user.id, email: user.email, name: user.name, isPremium: user.isPremium, isPro: user.isPro, flhBalance: user.flhBalance, dailyMsgCount: user.dailyMsgCount, }, referralApplied: referrerId ? true : false, referralReward: referrerId ? REFERRED_BONUS_FLH : 0, }); } catch (error) { console.error("Register error:", error); return NextResponse.json( { error: "Registration failed. Please try again." }, { status: 500 } ); } }