From 3d70a8ecc693aecc5faade7c84950bd5c6e69fad Mon Sep 17 00:00:00 2001 From: Dominic Ferrando Date: Sat, 18 Jul 2026 02:18:54 -0400 Subject: [PATCH] Add schemas for apparel_order_create event --- apps/api/src/services/commerce.ts | 43 ++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/apps/api/src/services/commerce.ts b/apps/api/src/services/commerce.ts index 12d879e..57017ff 100644 --- a/apps/api/src/services/commerce.ts +++ b/apps/api/src/services/commerce.ts @@ -1,4 +1,4 @@ -import { Printful, PrintfulClient, ProductSyncer, Webflow, WebflowClient } from "@blade-and-brawn/commerce"; +import { PrintfulClient, ProductSyncer, WebflowClient } from "@blade-and-brawn/commerce"; import { env, log } from "../util"; import { db } from "../database/db"; import { defineEventType, EventQueue } from "./event-queue"; @@ -57,10 +57,29 @@ class ApparelOrdersService { }, types: { "apparel_order_create": defineEventType({ - schemas: { payload: t.Object({ wOrder: t.Object({}) }), state: t.Null() }, - dedupeKey: (p) => (p.wOrder as Webflow.Orders.Order).orderId, + schemas: { + payload: t.Object({ + wOrder: t.Object({ + orderId: t.String(), + shippingAddress: t.Object({ + addressee: t.String(), + line1: t.String(), + line2: t.String(), + city: t.String(), + country: t.String(), + postalCode: t.String(), + }), + purchasedItems: t.Array(t.Object({ + variantId: t.String(), + count: t.Number(), + })), + }) + }), + state: t.Null() + }, + dedupeKey: (p) => p.wOrder.orderId, processor: async (payload) => { - const wOrder = payload.wOrder as Webflow.Orders.Order; + const wOrder = payload.wOrder; const stateCode = zipcodesUs.find( wOrder.shippingAddress.postalCode.split("-")[0] ?? "", @@ -92,11 +111,21 @@ class ApparelOrdersService { } }), "apparel_order_fulfill": defineEventType({ - schemas: { payload: t.Object({ wOrderId: t.String(), shipment: t.Object({}) }), state: t.Null() }, - dedupeKey: (p) => `${p.wOrderId}:${(p.shipment as Printful.Webhook.PackageShipped["data"]["shipment"]).tracking_number}`, + schemas: { + payload: t.Object({ + wOrderId: t.String(), + shipment: t.Object({ + carrier: t.String(), + tracking_number: t.String(), + tracking_url: t.String(), + }) + }), + state: t.Null() + }, + dedupeKey: (p) => `${p.wOrderId}:${p.shipment.tracking_number}`, processor: async (payload) => { const wOrderId = payload.wOrderId; - const shipment = payload.shipment as Printful.Webhook.PackageShipped["data"]["shipment"]; + const shipment = payload.shipment; log.info({ wOrderId, carrier: shipment.carrier, tracking: shipment.tracking_number }, "printful webhook: package shipped"); await this.Webflow.Orders.update(wOrderId, {