diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index 9f6fd74..e0c8d34 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -199,8 +199,8 @@ export const app = new Elysia() ) // COMMERCE - .group("/commerce", (app) => app - .group("/products", { auth: true }, (app) => app + .group("/commerce", { auth: true }, (app) => app + .group("/products", (app) => app .group("/sync", (app) => app // Sync status .get("/", async ({ sessionId }) => { @@ -234,7 +234,19 @@ export const app = new Elysia() return { pProduct, wProduct }; }, { params: t.Object({ pProductId: t.Numeric() }) - }))) + }) + ) + .group("/orders", (app) => app + .get("/:wOrderId", async ({ params: { wOrderId } }) => { + const wOrder = await s.Commerce.Webflow.Orders.get(wOrderId); + if (!wOrder) throw new NotFoundError("Missing webflow order"); + + const pOrder = await s.Commerce.Printful.Orders.get(`@${wOrder.orderId}`); + + return { wOrder, pOrder }; + }, { params: t.Object({ wOrderId: t.String() }) }) + ) + ) // EVENTS .group("/events", { auth: true }, (app) => app diff --git a/apps/portal/src/routes/(app)/apparel/orders/+page.svelte b/apps/portal/src/routes/(app)/apparel/orders/+page.svelte index e69de29..3640420 100644 --- a/apps/portal/src/routes/(app)/apparel/orders/+page.svelte +++ b/apps/portal/src/routes/(app)/apparel/orders/+page.svelte @@ -0,0 +1,62 @@ + + +{#await data.orders.webflow} +

Loading...

+{:then wOrders} +
+ + + + + + + + + {#each wOrders as wOrder} + + + + + {/each} + +
IdStatus
+ {#await isOrderSynced(wOrder) then isSynced} + {#if isSynced} +
+ Synced +
+ {:else} +
+ Desynced +
+ {/if} + {/await} +
+
+{:catch error} +

Something went wrong: {error.message}

+{/await} diff --git a/packages/commerce/src/printful.ts b/packages/commerce/src/printful.ts index 4a656da..b80ed53 100644 --- a/packages/commerce/src/printful.ts +++ b/packages/commerce/src/printful.ts @@ -103,6 +103,18 @@ class ProductsClient { class OrdersClient { constructor(private creds: Credentials) { } + async get(orderId: number | string): Promise { + const res = await fetch(`${this.creds.apiUrl}/store/orders/${orderId}`, { + method: "GET", + headers: this.creds.authHeaders, + }); + if (res.status === 429) throw new PrintfulRateLimitError(res.headers.get("Retry-After"), await parsePayload(res)); + if (res.status === 404 || res.status === 400) return; + if (!res.ok) throw new PrintfulError("Failed to get Printful order", res.status, await parsePayload(res)); + const payload = (await res.json()) as Printful.MetaDataSingle; + return payload.result; + } + async create(pOrder: Printful.Orders.Order) { const res = await fetch(`${this.creds.apiUrl}/orders`, { method: "POST", diff --git a/packages/commerce/src/webflow.ts b/packages/commerce/src/webflow.ts index e1fbf31..ad07782 100644 --- a/packages/commerce/src/webflow.ts +++ b/packages/commerce/src/webflow.ts @@ -192,6 +192,17 @@ class ProductsClient { class OrdersClient { constructor(private creds: Credentials) { } + async get(wOrderId: string): Promise { + const res = await fetch(`${this.creds.apiSitesUrl}/orders/${wOrderId}`, { + method: "GET", + headers: this.creds.authHeader, + }); + if (res.status === 429) throw new WebflowRateLimitError(res.headers.get("Retry-After"), await parsePayload(res)); + if (res.status === 404 || res.status === 400) return; + if (!res.ok) throw new WebflowError("Failed to get Webflow order", res.status, await parsePayload(res)); + return (await res.json()) as Webflow.Orders.Order; + } + async list(opt: PagingOptions & { status?: Webflow.Orders.Order["status"] } = {}): Promise { const allOrders: Webflow.Orders.Order[] = []; let offset = opt.offset ?? 0;