Files
cbd420/app/api/referral-points/route.ts
2026-01-03 06:06:54 +00:00

97 lines
3.1 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { cookies } from 'next/headers'
import pool from '@/lib/db'
// GET /api/referral-points - Get current user's referral points and settings
export async function GET(request: NextRequest) {
try {
const cookieStore = await cookies()
const buyerIdCookie = cookieStore.get('buyer_id')?.value
if (!buyerIdCookie) {
return NextResponse.json(
{ error: 'Authentication required' },
{ status: 401 }
)
}
const buyer_id = parseInt(buyerIdCookie, 10)
// Get buyer's referral points
const [buyerRows] = await pool.execute(
'SELECT referral_points FROM buyers WHERE id = ?',
[buyer_id]
)
const buyers = buyerRows as any[]
if (buyers.length === 0) {
return NextResponse.json(
{ error: 'Buyer not found' },
{ status: 404 }
)
}
const referralPoints = parseFloat(buyers[0].referral_points) || 0
// Get referral settings
const [settingsRows] = await pool.execute(
'SELECT setting_key, setting_value FROM referral_settings'
)
const settings = settingsRows as any[]
// Get EUR-based settings (preferred)
let pointsToEur = parseFloat(
settings.find(s => s.setting_key === 'points_to_eur')?.setting_value || '0'
)
let pointsPerEur = parseFloat(
settings.find(s => s.setting_key === 'points_per_eur')?.setting_value || '0'
)
// Get CHF-based settings (for backward compatibility)
const pointsToChf = parseFloat(
settings.find(s => s.setting_key === 'points_to_chf')?.setting_value || '100'
)
const pointsPerChf = parseFloat(
settings.find(s => s.setting_key === 'points_per_chf')?.setting_value || '10'
)
// If EUR settings not found, convert from CHF (1 CHF ≈ 1.0309 EUR)
const chfToEurRate = 1.030927835
if (pointsToEur === 0) {
pointsToEur = pointsToChf / chfToEurRate
}
if (pointsPerEur === 0) {
pointsPerEur = pointsPerChf * chfToEurRate
}
const pointsToCryptoChf = parseFloat(
settings.find(s => s.setting_key === 'points_to_crypto_chf')?.setting_value || '100'
)
const minRedemptionPoints = parseFloat(
settings.find(s => s.setting_key === 'min_redemption_points')?.setting_value || '1000'
)
// Calculate maximum discount available (in EUR, then convert to CHF for display)
const maxDiscountEur = referralPoints / pointsToEur
const maxDiscountChf = maxDiscountEur * 0.97 // Convert EUR to CHF
return NextResponse.json({
referral_points: referralPoints,
points_to_eur: pointsToEur,
points_per_eur: pointsPerEur,
points_to_chf: pointsToChf, // Keep for backward compatibility
points_per_chf: pointsPerChf, // Keep for backward compatibility
points_to_crypto_chf: pointsToCryptoChf,
min_redemption_points: minRedemptionPoints,
max_discount_eur: maxDiscountEur,
max_discount_chf: maxDiscountChf,
})
} catch (error) {
console.error('Error fetching referral points:', error)
return NextResponse.json(
{ error: 'Failed to fetch referral points' },
{ status: 500 }
)
}
}