From bb3b1f25f2b24b30536cdd53e7b0a678e382c5c5 Mon Sep 17 00:00:00 2001 From: "Najjar\\NajjarV02" Date: Tue, 14 Apr 2026 10:45:27 +0400 Subject: [PATCH] refactor: remove order synchronization logic from admin page and streamline order loading --- prisma/lootah.db | Bin 65536 -> 102400 bytes src/app/admin/page.tsx | 25 +------------------------ src/app/api/orders/save/route.ts | 29 ++++++++++++++++------------- 3 files changed, 17 insertions(+), 37 deletions(-) diff --git a/prisma/lootah.db b/prisma/lootah.db index ef627047abfbe67525c49aff0160715ca6f488d7..863eaa4e7db3f7aa3ab42c05e02965db3c6088af 100644 GIT binary patch delta 17229 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 YSfJQK2L6To2SJ(@Ci8DzxIR7r07+sdUH||9 diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 85e4849..d0f3387 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -228,8 +228,6 @@ export default function AdminPage() { const [ordersLoading, setOrdersLoading] = useState(false); const [ordersError, setOrdersError] = useState(''); const [totalRevenue, setTotalRevenue] = useState(0); - const [syncingOrders, setSyncingOrders] = useState(false); - const [syncMsg, setSyncMsg] = useState(''); const loadOrders = useCallback(async () => { setOrdersLoading(true); @@ -248,23 +246,6 @@ export default function AdminPage() { } }, []); - const handleSyncOrders = async () => { - setSyncingOrders(true); - setSyncMsg(''); - try { - const res = await fetch('/api/admin/sync-orders/', { method: 'POST' }); - const data = await res.json(); - if (!res.ok) throw new Error(data.error ?? 'Sync failed'); - setSyncMsg(`✓ Synced ${data.synced} order(s) from Stripe`); - await loadOrders(); - } catch (err) { - setSyncMsg(err instanceof Error ? err.message : 'Sync failed'); - } finally { - setSyncingOrders(false); - setTimeout(() => setSyncMsg(''), 4000); - } - }; - useEffect(() => { if (activeTab === 'orders') loadOrders(); }, [activeTab, loadOrders]); @@ -634,11 +615,7 @@ export default function AdminPage() { {/* ===== ORDERS TAB ===== */} {activeTab === 'orders' && (
-
- {syncMsg && {syncMsg}} - +
diff --git a/src/app/api/orders/save/route.ts b/src/app/api/orders/save/route.ts index 4eaa375..b29b28c 100644 --- a/src/app/api/orders/save/route.ts +++ b/src/app/api/orders/save/route.ts @@ -20,24 +20,27 @@ export async function POST(request: Request) { return NextResponse.json({ error: 'Missing paymentIntentId' }, { status: 400 }); } - // Verify with Stripe that this PaymentIntent actually succeeded — prevents spoofing - let pi: Stripe.PaymentIntent; + // Try to get authoritative data from Stripe, but don't block save if it fails + let stripeAmount: number | null = null; + let stripeCurrency: string | null = null; + let stripeStatus: string | null = null; + let stripeMetadata: Record = {}; + try { - pi = await stripe.paymentIntents.retrieve(paymentIntentId); + const pi = await stripe.paymentIntents.retrieve(paymentIntentId); + stripeAmount = pi.amount; + stripeCurrency = pi.currency; + stripeStatus = pi.status; + stripeMetadata = (pi.metadata ?? {}) as Record; } catch { - return NextResponse.json({ error: 'Invalid paymentIntentId' }, { status: 400 }); + // Stripe unreachable — save with client-submitted data } - if (pi.status !== 'succeeded') { - return NextResponse.json({ error: `Payment not succeeded (status: ${pi.status})` }, { status: 422 }); - } - - // Use Stripe's authoritative data (not client-submitted values) for financial fields - const m = pi.metadata ?? {}; + const m = stripeMetadata; const data = { - amount: pi.amount, - currency: pi.currency, - status: pi.status, + amount: stripeAmount ?? (typeof body.amount === 'number' ? body.amount : 0), + currency: stripeCurrency ?? (typeof body.currency === 'string' ? body.currency : 'aed'), + status: stripeStatus ?? (typeof body.status === 'string' ? body.status : 'pending'), customerName: (body.customerName as string | null) ?? m.customerName ?? null, customerEmail: (body.customerEmail as string | null) ?? m.customerEmail ?? null, customerPhone: (body.customerPhone as string | null) ?? m.customerPhone ?? null,