first commit

This commit is contained in:
2026-01-17 14:17:42 +05:30
commit 0f194eb9e7
328 changed files with 73544 additions and 0 deletions

View File

@@ -0,0 +1,188 @@
import { NextRequest, NextResponse } from 'next/server'
import { auth } from '@/auth'
import { prisma } from '@/lib/prisma'
import bcrypt from 'bcryptjs'
import { EmailService } from '@/lib/email'
const emailService = new EmailService()
interface AddMemberData {
name: string
email: string
phone: string
address?: string
}
export async function POST(request: NextRequest) {
try {
const session = await auth()
if (!session?.user?.id) {
return NextResponse.json(
{ success: false, message: 'Unauthorized' },
{ status: 401 }
)
}
// Check if user is a partner (MEMBER role)
const partner = await prisma.user.findUnique({
where: { id: session.user.id },
include: {
referrals: true
}
})
if (!partner || partner.role !== 'MEMBER') {
return NextResponse.json(
{ success: false, message: 'Only partners can add members' },
{ status: 403 }
)
}
// Check if partner has minimum required members
if (partner.referrals.length < partner.minReferrals) {
// Partner is still building their minimum required members
console.log(`Partner needs ${partner.minReferrals - partner.referrals.length} more members to meet minimum requirement`)
}
const data: AddMemberData = await request.json()
// Validate required fields
if (!data.name || !data.email || !data.phone) {
return NextResponse.json(
{ success: false, message: 'Name, email, and phone are required' },
{ status: 400 }
)
}
// Check if user already exists
const existingUser = await prisma.user.findUnique({
where: { email: data.email }
})
if (existingUser) {
return NextResponse.json(
{ success: false, message: 'User with this email already exists' },
{ status: 400 }
)
}
// Generate random password
const randomPassword = Math.random().toString(36).slice(-8) + Math.random().toString(36).slice(-8)
const hashedPassword = await bcrypt.hash(randomPassword, 12)
// Create new member user
const newMember = await prisma.user.create({
data: {
name: data.name,
email: data.email,
phone: data.phone,
password: hashedPassword,
role: 'CUSTOMER',
referrerId: partner.id,
address: data.address,
isActive: true,
}
})
// Create wallet for the new member
await prisma.wallet.create({
data: {
userId: newMember.id,
balance: 0,
totalEarnings: 0,
totalWithdrawn: 0
}
})
try {
// Send notification to admin
await emailService.sendMemberAddedAdminNotification(partner, newMember)
// Send welcome email to new member
await emailService.sendMemberWelcomeEmail(data, partner, randomPassword)
} catch (emailError) {
console.error('Email sending failed:', emailError)
// Don't fail the request if email fails
}
return NextResponse.json({
success: true,
message: 'Member added successfully! They will receive login details via email.',
member: {
id: newMember.id,
name: newMember.name,
email: newMember.email,
phone: newMember.phone,
referralCode: newMember.referralCode
},
totalMembers: partner.referrals.length + 1,
minRequired: partner.minReferrals,
isMinimumMet: (partner.referrals.length + 1) >= partner.minReferrals
})
} catch (error) {
console.error('Add member error:', error)
return NextResponse.json(
{ success: false, message: 'Internal server error' },
{ status: 500 }
)
}
}
// Get partner's members
export async function GET(request: NextRequest) {
try {
const session = await auth()
if (!session?.user?.id) {
return NextResponse.json(
{ success: false, message: 'Unauthorized' },
{ status: 401 }
)
}
// Get partner with their referrals
const partner = await prisma.user.findUnique({
where: { id: session.user.id },
include: {
referrals: {
select: {
id: true,
name: true,
email: true,
phone: true,
joinedAt: true,
isActive: true,
referralCode: true
},
orderBy: {
joinedAt: 'desc'
}
}
}
})
if (!partner || partner.role !== 'MEMBER') {
return NextResponse.json(
{ success: false, message: 'Only partners can view members' },
{ status: 403 }
)
}
return NextResponse.json({
success: true,
members: partner.referrals,
totalMembers: partner.referrals.length,
minRequired: partner.minReferrals,
isMinimumMet: partner.referrals.length >= partner.minReferrals
})
} catch (error) {
console.error('Get members error:', error)
return NextResponse.json(
{ success: false, message: 'Internal server error' },
{ status: 500 }
)
}
}