Rebasely Beta: data may be purged

examplesstorefront Public

TypeScript · 62 lines · 1.7 KiB · at 582fe0a

// 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(),  };}