Add sync order button
This commit is contained in:
@@ -286,6 +286,20 @@ export const app = new Elysia()
|
|||||||
|
|
||||||
return { wOrder, pOrder };
|
return { wOrder, pOrder };
|
||||||
}, { params: t.Object({ wOrderId: t.String() }) })
|
}, { params: t.Object({ wOrderId: t.String() }) })
|
||||||
|
.post("/sync/: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}`);
|
||||||
|
if (pOrder) throw status(409, { error: "Cannot sync an already synced webflow order" });
|
||||||
|
|
||||||
|
await s.Commerce.Apparel.Orders.Queue.enqueue({
|
||||||
|
type: "apparel_order_create",
|
||||||
|
source: "portal",
|
||||||
|
payload: { wOrder }
|
||||||
|
});
|
||||||
|
|
||||||
|
}, { params: t.Object({ wOrderId: t.String() }) })
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
let loadError = $state<string | null>(null);
|
let loadError = $state<string | null>(null);
|
||||||
let offset = $state(0);
|
let offset = $state(0);
|
||||||
|
|
||||||
|
let syncingWOrderId = $state<string | null>(null);
|
||||||
|
|
||||||
function errorMessage(err: unknown): string {
|
function errorMessage(err: unknown): string {
|
||||||
const value = (err as { value?: { error?: string } })?.value;
|
const value = (err as { value?: { error?: string } })?.value;
|
||||||
return (
|
return (
|
||||||
@@ -21,6 +23,19 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function sync(wOrderId: string) {
|
||||||
|
syncingWOrderId = wOrderId;
|
||||||
|
loadError = null;
|
||||||
|
try {
|
||||||
|
const res = await api.commerce.orders.sync({ wOrderId }).post();
|
||||||
|
if (res.error) throw res.error;
|
||||||
|
} catch (err) {
|
||||||
|
loadError = errorMessage(err);
|
||||||
|
} finally {
|
||||||
|
syncingWOrderId = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function refresh() {
|
async function refresh() {
|
||||||
loading = true;
|
loading = true;
|
||||||
loadError = null;
|
loadError = null;
|
||||||
@@ -92,6 +107,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>Id</th>
|
<th>Id</th>
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
|
<th>Sync</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -119,10 +135,23 @@
|
|||||||
<div class="badge badge-error">Desynced</div>
|
<div class="badge badge-error">Desynced</div>
|
||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
{#if !order.isSynced}
|
||||||
|
<button
|
||||||
|
disabled={!!syncingWOrderId}
|
||||||
|
onclick={() => sync(order.wOrder.orderId)}
|
||||||
|
class="btn btn-primary btn-xs"
|
||||||
|
>
|
||||||
|
{syncingWOrderId === order.wOrder.orderId
|
||||||
|
? "Syncing..."
|
||||||
|
: "Sync"}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{:else}
|
{:else}
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" class="text-center opacity-60">
|
<td colspan="3" class="text-center opacity-60">
|
||||||
{loading ? "Loading..." : "No orders found"}
|
{loading ? "Loading..." : "No orders found"}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user