examples/storefront Public
import { WorkerEntrypoint } from "cloudflare:workers";import { createApp } from "./app.ts";import type { Env } from "./env.ts";import { expireOrders } from "./expiry.ts";import { cancelOrder, getOrder, markPaid, recordShipment, type Order, type Settled } from "./orders.ts";import { stripePayments } from "./payments.ts";// The calls the shop's other Workers make through a service binding (entrypoint OrdersService).// storefront-api stays the only Worker that writes to the database; see// .rebasely/kb/decisions/0006-one-writer-for-the-database.md.export class OrdersService extends WorkerEntrypoint<Env> { markPaid(orderId: string, paymentIntentId: string): Promise<Settled> { return markPaid(this.env.DB, this.env.ORDER_EVENTS, orderId, paymentIntentId, Date.now()); } cancel(orderId: string): Promise<Settled> { return cancelOrder(this.env.DB, this.env.ORDER_EVENTS, orderId, Date.now()); } forFulfilment(orderId: string): Promise<Order | null> { return getOrder(this.env.DB, orderId); } recordShipment(orderId: string, shipmentId: string): Promise<Settled> { return recordShipment(this.env.DB, orderId, shipmentId, Date.now()); }}export default { fetch(req, env) { return createApp(env).fetch(req); }, // triggers.crons in wrangler.jsonc: every five minutes. async scheduled(controller, env) { const report = await expireOrders(env.DB, env.ORDER_EVENTS, stripePayments(env.STRIPE_SECRET_KEY), controller.scheduledTime); if (report.cancelled.length || report.left_to_webhook.length) console.log(JSON.stringify({ msg: "expired unpaid orders", ...report })); },} satisfies ExportedHandler<Env>;