examplesstorefront Public
// Orders: what a cart becomes at checkout. An order starts as pending_payment and moves on when// the payment provider reports the outcome.import type { Totals } from "./money.ts";export type OrderStatus = "pending_payment" | "paid" | "cancelled" | "fulfilled";export type Address = { name: string; line1: string; line2: string; city: string; postal_code: string; country: string;};export type OrderItem = { product_id: string; name: string; quantity: number; unit_price_cents: number };export type Order = { id: string; status: OrderStatus; email: string; ship_to: Address; items: OrderItem[]; created_at: string;} & Totals;type Row = { id: string; status: OrderStatus; email: string; ship_to: string; subtotal_cents: number; shipping_cents: number; total_cents: number; currency: string; created_at: number;};export async function getOrder(db: D1Database, id: string): Promise<Order | null> { const row = await db .prepare("SELECT id, status, email, ship_to, subtotal_cents, shipping_cents, total_cents, currency, created_at FROM orders WHERE id = ?") .bind(id) .first<Row>(); if (!row) return null; const { results } = await db .prepare("SELECT product_id, name, quantity, unit_price_cents FROM order_items WHERE order_id = ? ORDER BY product_id") .bind(id) .all<OrderItem>(); return { id: row.id, status: row.status, email: row.email, ship_to: JSON.parse(row.ship_to) as Address, items: results, subtotal_cents: row.subtotal_cents, shipping_cents: row.shipping_cents, total_cents: row.total_cents, currency: row.currency, created_at: new Date(row.created_at).toISOString(), };}