ed34b186f9
- New /refer page with share/copy/stats - Fixed modal z-index conflicts (z-50 → z-[60]) across forum, groups, souq, halal-monitor - Seed route: forum categories, marketplace listings, private groups - Mufti/Daie personas now available in Premium tier - Fixed referral share link: falahos.my/mobile/auth?ref=CODE - Fixed client-side persona access check for premium
120 lines
3.4 KiB
TypeScript
120 lines
3.4 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|