62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { requireAuth } from "@/lib/auth";
|
|
|
|
// Same encodeBase62 used in the code route
|
|
function encodeBase62(id: string): string {
|
|
const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
let hash = 0;
|
|
for (let i = 0; i < Math.min(id.length, 10); i++) {
|
|
hash = (hash * 31 + id.charCodeAt(i)) >>> 0;
|
|
}
|
|
let code = "";
|
|
while (code.length < 6) {
|
|
code = chars[hash % 62] + code;
|
|
hash = Math.floor(hash / 62);
|
|
if (hash === 0 && code.length < 6) {
|
|
hash = Math.floor(Math.random() * 62 ** (6 - code.length));
|
|
}
|
|
}
|
|
return code;
|
|
}
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const jwtPayload = await requireAuth(req);
|
|
if (!jwtPayload) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const userId = jwtPayload.userId;
|
|
|
|
const [totalReferrals, upgradedCount, earnings] = await Promise.all([
|
|
prisma.referral.count({
|
|
where: { referrerId: userId },
|
|
}),
|
|
prisma.referral.count({
|
|
where: { referrerId: userId, status: "upgraded" },
|
|
}),
|
|
prisma.referral.aggregate({
|
|
where: { referrerId: userId },
|
|
_sum: { rewardFlh: true },
|
|
}),
|
|
]);
|
|
|
|
const referralCode = encodeBase62(userId);
|
|
|
|
return NextResponse.json({
|
|
totalReferrals,
|
|
upgradedCount,
|
|
totalEarned: earnings._sum.rewardFlh || 0,
|
|
referralCode,
|
|
shareLink: `${process.env.NEXT_PUBLIC_APP_URL || "https://falah.app"}/join?ref=${referralCode}`,
|
|
});
|
|
} catch (error) {
|
|
console.error("Referral stats error:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to get referral stats" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|