@jytextiles/medusa-plugin-faire-store-sync 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.medusa/server/src/__tests__/faire-client.spec.js +126 -0
  2. package/.medusa/server/src/admin/index.js +5 -0
  3. package/.medusa/server/src/admin/index.mjs +5 -0
  4. package/.medusa/server/src/api/admin/faire/auth/api-key/route.js +26 -0
  5. package/.medusa/server/src/api/admin/faire/ingest/orders/route.js +5 -4
  6. package/.medusa/server/src/api/admin/faire/products/route.js +18 -5
  7. package/.medusa/server/src/jobs/pull-faire-orders.js +8 -5
  8. package/.medusa/server/src/lib/faire-client.js +144 -71
  9. package/.medusa/server/src/lib/types.js +7 -6
  10. package/.medusa/server/src/modules/faire-sync/migrations/Migration20260708000000.js +14 -0
  11. package/.medusa/server/src/modules/faire-sync/models/faire-sync-settings.js +3 -1
  12. package/.medusa/server/src/modules/faire-sync/service.js +49 -2
  13. package/.medusa/server/src/workflows/ingest-faire-orders-bulk.js +25 -6
  14. package/package.json +1 -1
  15. package/src/__tests__/faire-client.spec.ts +138 -0
  16. package/src/admin/lib/api.ts +7 -1
  17. package/src/api/admin/faire/auth/api-key/route.ts +29 -0
  18. package/src/api/admin/faire/ingest/orders/route.ts +7 -3
  19. package/src/api/admin/faire/products/route.ts +18 -4
  20. package/src/jobs/pull-faire-orders.ts +7 -4
  21. package/src/lib/faire-client.ts +190 -93
  22. package/src/lib/types.ts +39 -16
  23. package/src/modules/faire-sync/migrations/Migration20260708000000.ts +13 -0
  24. package/src/modules/faire-sync/models/faire-sync-settings.ts +2 -0
  25. package/src/modules/faire-sync/service.ts +58 -2
  26. package/src/workflows/ingest-faire-orders-bulk.ts +36 -10
  27. package/.medusa/server/src/__tests__/webhook.spec.js +0 -77
  28. package/.medusa/server/src/api/webhooks/faire/route.js +0 -125
  29. package/.medusa/server/src/lib/webhook.js +0 -58
  30. package/.medusa/server/src/subscribers/faire-inventory-sync.js +0 -87
  31. package/.medusa/server/src/subscribers/faire-listing-events.js +0 -46
  32. package/.medusa/server/src/subscribers/faire-order-ingest.js +0 -54
  33. package/.medusa/server/src/subscribers/faire-order-lifecycle.js +0 -71
  34. package/src/__tests__/webhook.spec.ts +0 -81
  35. package/src/api/webhooks/faire/route.ts +0 -133
  36. package/src/lib/webhook.ts +0 -85
  37. package/src/subscribers/faire-inventory-sync.ts +0 -97
  38. package/src/subscribers/faire-listing-events.ts +0 -48
  39. package/src/subscribers/faire-order-ingest.ts +0 -61
  40. package/src/subscribers/faire-order-lifecycle.ts +0 -81
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const faire_client_1 = require("../lib/faire-client");
4
+ const types_1 = require("../lib/types");
5
+ // Capture the last fetch call (url, init).
6
+ let lastUrl;
7
+ let lastInit;
8
+ const fetchMock = jest.fn(async (url, init) => {
9
+ lastUrl = url;
10
+ lastInit = init;
11
+ return {
12
+ ok: true,
13
+ status: 200,
14
+ headers: new Map(),
15
+ text: async () => JSON.stringify({ access_token: "tok", brand_id: "b_1", name: "Acme" }),
16
+ };
17
+ });
18
+ global.fetch = fetchMock;
19
+ const oauthOpts = {
20
+ authMode: "oauth",
21
+ clientId: "app_123",
22
+ clientSecret: "secret_456",
23
+ redirectUri: "https://shop.test/app/settings/oauth/faire/callback",
24
+ };
25
+ describe("FaireClient — issue #952 corrections", () => {
26
+ beforeEach(() => fetchMock.mockClear());
27
+ it("uses the verified base / auth / token URLs by default", () => {
28
+ const c = new faire_client_1.FaireClient({});
29
+ // defaults are exported from types and consumed verbatim
30
+ expect(types_1.DEFAULT_API_BASE).toBe("https://faire.com/external-api/v2");
31
+ expect(types_1.DEFAULT_AUTH_URL).toBe("https://faire.com/oauth2/authorize");
32
+ expect(types_1.DEFAULT_TOKEN_URL).toBe("https://www.faire.com/api/external-api-oauth2/token");
33
+ });
34
+ it("builds the authorize URL with Faire's applicationId/redirectUrl params", () => {
35
+ const c = new faire_client_1.FaireClient(oauthOpts);
36
+ const url = new URL(c.getAuthorizationUrl("state-abc"));
37
+ expect(url.origin + url.pathname).toBe("https://faire.com/oauth2/authorize");
38
+ expect(url.searchParams.get("applicationId")).toBe("app_123");
39
+ expect(url.searchParams.get("redirectUrl")).toBe(oauthOpts.redirectUri);
40
+ expect(url.searchParams.get("state")).toBe("state-abc");
41
+ // MUST NOT use RFC-6749 client_id/redirect_uri
42
+ expect(url.searchParams.has("client_id")).toBe(false);
43
+ expect(url.searchParams.has("redirect_uri")).toBe(false);
44
+ });
45
+ it("exchanges code with a NON-RFC-6749 JSON body", async () => {
46
+ const c = new faire_client_1.FaireClient(oauthOpts);
47
+ await c.exchangeCodeForToken("code_xyz");
48
+ expect(lastUrl).toBe(types_1.DEFAULT_TOKEN_URL);
49
+ expect(lastInit.method).toBe("POST");
50
+ expect(lastInit.headers["Content-Type"]).toBe("application/json");
51
+ const body = JSON.parse(lastInit.body);
52
+ expect(body).toMatchObject({
53
+ application_token: "app_123",
54
+ application_secret: "secret_456",
55
+ authorization_code: "code_xyz",
56
+ grant_type: "AUTHORIZATION_CODE",
57
+ redirect_url: oauthOpts.redirectUri,
58
+ });
59
+ expect(body.scope).toEqual([]);
60
+ // MUST NOT send RFC-6749 fields
61
+ expect(body.client_id).toBeUndefined();
62
+ expect(body.client_secret).toBeUndefined();
63
+ });
64
+ it("sends OAuth auth headers (X-FAIRE-OAUTH-ACCESS-TOKEN + APP-CREDENTIALS), never Bearer", async () => {
65
+ const c = new faire_client_1.FaireClient(oauthOpts);
66
+ await c.getBrand("access-tok");
67
+ expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/brands/profile`);
68
+ expect(lastInit.headers["X-FAIRE-OAUTH-ACCESS-TOKEN"]).toBe("access-tok");
69
+ const expectedCreds = Buffer.from("app_123:secret_456").toString("base64");
70
+ expect(lastInit.headers["X-FAIRE-APP-CREDENTIALS"]).toBe(expectedCreds);
71
+ expect(lastInit.headers["Authorization"]).toBeUndefined();
72
+ });
73
+ it("sends API-key auth header (X-FAIRE-ACCESS-TOKEN) in apiKey mode", async () => {
74
+ const c = new faire_client_1.FaireClient({ authMode: "apiKey", accessToken: "key_abc" });
75
+ // In apiKey mode the stored account access_token IS the api key.
76
+ await c.getBrand("key_abc");
77
+ expect(lastInit.headers["X-FAIRE-ACCESS-TOKEN"]).toBe("key_abc");
78
+ expect(lastInit.headers["X-FAIRE-OAUTH-ACCESS-TOKEN"]).toBeUndefined();
79
+ expect(lastInit.headers["Authorization"]).toBeUndefined();
80
+ });
81
+ it("hits /brands/profile (NOT /brand)", async () => {
82
+ const c = new faire_client_1.FaireClient(oauthOpts);
83
+ await c.getBrand("t");
84
+ expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/brands/profile`);
85
+ });
86
+ it("pushes inventory via PATCH /product-inventory/by-skus (not GET /inventory)", async () => {
87
+ const c = new faire_client_1.FaireClient(oauthOpts);
88
+ await c.updateInventory("t", [{ sku: "S1", current_count: 7 }]);
89
+ expect(lastInit.method).toBe("PATCH");
90
+ expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/product-inventory/by-skus`);
91
+ expect(JSON.parse(lastInit.body)).toEqual({
92
+ inventories: [{ sku: "S1", current_count: 7 }],
93
+ });
94
+ });
95
+ it("lists orders with cursor page + updated_at_min", async () => {
96
+ const c = new faire_client_1.FaireClient(oauthOpts);
97
+ await c.listOrders("t", { page: "cursor-xyz", updated_at_min: "2026-01-01T00:00:00Z" });
98
+ const url = new URL(lastUrl);
99
+ expect(url.pathname).toBe("/external-api/v2/orders");
100
+ expect(url.searchParams.get("page")).toBe("cursor-xyz");
101
+ expect(url.searchParams.get("updated_at_min")).toBe("2026-01-01T00:00:00Z");
102
+ });
103
+ it("posts order processing (PUT) and shipments (POST) on the right paths", async () => {
104
+ const c = new faire_client_1.FaireClient(oauthOpts);
105
+ await c.setOrderProcessing("t", "o_1", { accepted: true });
106
+ expect(lastInit.method).toBe("PUT");
107
+ expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/orders/o_1/processing`);
108
+ await c.createOrderShipment("t", "o_1", { carrier: "UPS", tracking: "1Z" });
109
+ expect(lastInit.method).toBe("POST");
110
+ expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/orders/o_1/shipments`);
111
+ });
112
+ it("surfaces 401 as FaireApiError", async () => {
113
+ fetchMock.mockImplementationOnce(async () => ({
114
+ ok: false,
115
+ status: 401,
116
+ headers: new Map(),
117
+ text: async () => "",
118
+ }));
119
+ const c = new faire_client_1.FaireClient(oauthOpts);
120
+ await expect(c.getBrand("t")).rejects.toMatchObject({
121
+ name: "FaireApiError",
122
+ status: 401,
123
+ });
124
+ });
125
+ });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpcmUtY2xpZW50LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvX190ZXN0c19fL2ZhaXJlLWNsaWVudC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQWdFO0FBQ2hFLHdDQUFvRjtBQUVwRiwyQ0FBMkM7QUFDM0MsSUFBSSxPQUFlLENBQUE7QUFDbkIsSUFBSSxRQUFhLENBQUE7QUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBVyxFQUFFLElBQVMsRUFBRSxFQUFFO0lBQ3pELE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDYixRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ2YsT0FBTztRQUNMLEVBQUUsRUFBRSxJQUFJO1FBQ1IsTUFBTSxFQUFFLEdBQUc7UUFDWCxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbEIsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDbEYsQ0FBQTtBQUNWLENBQUMsQ0FBQyxDQUVEO0FBQUMsTUFBYyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7QUFFbEMsTUFBTSxTQUFTLEdBQUc7SUFDaEIsUUFBUSxFQUFFLE9BQWdCO0lBQzFCLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFlBQVksRUFBRSxZQUFZO0lBQzFCLFdBQVcsRUFBRSxxREFBcUQ7Q0FDbkUsQ0FBQTtBQUVELFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7SUFDcEQsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRXZDLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxDQUFDLEdBQUcs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
@@ -29,6 +29,10 @@ const faireApi = {
29
29
  method: "POST",
30
30
  body: { code, state }
31
31
  }),
32
+ connectApiKey: (access_token) => sdk.client.fetch("/admin/faire/auth/api-key", {
33
+ method: "POST",
34
+ body: { access_token }
35
+ }),
32
36
  disconnect: () => sdk.client.fetch("/admin/faire/auth/disconnect", { method: "POST" }),
33
37
  syncProduct: (id) => sdk.client.fetch(`/admin/faire/sync/product/${id}`, { method: "POST" }),
34
38
  productStatus: (id) => sdk.client.fetch(`/admin/faire/status/product/${id}`),
@@ -63,6 +67,7 @@ const faireApi = {
63
67
  const query = {};
64
68
  if (opts.limit !== void 0) query.limit = String(opts.limit);
65
69
  if (opts.page !== void 0) query.page = String(opts.page);
70
+ if (opts.updated_at_min !== void 0) query.updated_at_min = opts.updated_at_min;
66
71
  return sdk.client.fetch("/admin/faire/products", { query });
67
72
  }
68
73
  };
@@ -26,6 +26,10 @@ const faireApi = {
26
26
  method: "POST",
27
27
  body: { code, state }
28
28
  }),
29
+ connectApiKey: (access_token) => sdk.client.fetch("/admin/faire/auth/api-key", {
30
+ method: "POST",
31
+ body: { access_token }
32
+ }),
29
33
  disconnect: () => sdk.client.fetch("/admin/faire/auth/disconnect", { method: "POST" }),
30
34
  syncProduct: (id) => sdk.client.fetch(`/admin/faire/sync/product/${id}`, { method: "POST" }),
31
35
  productStatus: (id) => sdk.client.fetch(`/admin/faire/status/product/${id}`),
@@ -60,6 +64,7 @@ const faireApi = {
60
64
  const query = {};
61
65
  if (opts.limit !== void 0) query.limit = String(opts.limit);
62
66
  if (opts.page !== void 0) query.page = String(opts.page);
67
+ if (opts.updated_at_min !== void 0) query.updated_at_min = opts.updated_at_min;
63
68
  return sdk.client.fetch("/admin/faire/products", { query });
64
69
  }
65
70
  };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const faire_sync_1 = require("../../../../../modules/faire-sync");
6
+ // POST /admin/faire/auth/api-key — connect a Faire account in API-key
7
+ // (single-merchant) mode. Body: { access_token }. Fetches the brand profile
8
+ // with the supplied token and persists the account.
9
+ const POST = async (req, res) => {
10
+ const { access_token } = req.body;
11
+ if (!access_token) {
12
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "access_token is required");
13
+ }
14
+ const service = req.scope.resolve(faire_sync_1.FAIRE_SYNC_MODULE);
15
+ const { account, brand } = await service.connectWithApiKey(access_token);
16
+ res.json({
17
+ account: {
18
+ id: account.id,
19
+ brand_id: account.brand_id,
20
+ brand_name: account.brand_name,
21
+ },
22
+ brand,
23
+ });
24
+ };
25
+ exports.POST = POST;
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL2F1dGgvYXBpLWtleS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsa0VBQXFFO0FBR3JFLHNFQUFzRTtBQUN0RSw0RUFBNEU7QUFDNUUsb0RBQW9EO0FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQWlDLENBQUE7SUFDOUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBCQUEwQixDQUMzQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFxQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUE7SUFFeEUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRyxPQUFlLENBQUMsRUFBRTtZQUN2QixRQUFRLEVBQUcsT0FBZSxDQUFDLFFBQVE7WUFDbkMsVUFBVSxFQUFHLE9BQWUsQ0FBQyxVQUFVO1NBQ3hDO1FBQ0QsS0FBSztLQUNOLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQXBCWSxRQUFBLElBQUksUUFvQmhCIn0=
@@ -4,17 +4,18 @@ exports.POST = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const ingest_faire_orders_bulk_1 = require("../../../../../workflows/ingest-faire-orders-bulk");
6
6
  // POST /admin/faire/ingest/orders — pull Faire orders and create Medusa orders
7
- // for them. Runs as a long-running background workflow; returns a batch id the
8
- // client can poll at GET /admin/faire/ingest/orders/:batchId.
7
+ // for them. Faire is polled (no webhooks); runs as a long-running background
8
+ // workflow and returns a batch id the client can poll at
9
+ // GET /admin/faire/ingest/orders/:batchId.
9
10
  const POST = async (req, res) => {
10
11
  const limit = req.body?.limit;
11
12
  if (limit != null && (!Number.isFinite(limit) || limit <= 0)) {
12
13
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "limit must be a positive number");
13
14
  }
14
15
  const { result } = await (0, ingest_faire_orders_bulk_1.ingestFaireOrdersBulkWorkflow)(req.scope).run({
15
- input: { limit },
16
+ input: { limit, updated_at_min: req.body?.updated_at_min },
16
17
  });
17
18
  res.status(202).json({ batch_id: result.batch_id, status: "processing" });
18
19
  };
19
20
  exports.POST = POST;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL2luZ2VzdC9vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXVEO0FBQ3ZELGdHQUFpRztBQU1qRywrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLDhEQUE4RDtBQUN2RCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQW9DLEVBQ3BDLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQTtJQUM3QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsaUNBQWlDLENBQ2xDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSx3REFBNkIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3BFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRTtLQUNqQixDQUFDLENBQUE7SUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRyxNQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO0FBQ3BGLENBQUMsQ0FBQTtBQWpCWSxRQUFBLElBQUksUUFpQmhCIn0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL2luZ2VzdC9vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXVEO0FBQ3ZELGdHQUFpRztBQVNqRywrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLHlEQUF5RDtBQUN6RCwyQ0FBMkM7QUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUFvQyxFQUNwQyxHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUE7SUFDN0IsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLGlDQUFpQyxDQUNsQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsd0RBQTZCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNwRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO0tBQzNELENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFHLE1BQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7QUFDcEYsQ0FBQyxDQUFBO0FBakJZLFFBQUEsSUFBSSxRQWlCaEIifQ==
@@ -2,15 +2,28 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GET = void 0;
4
4
  const faire_sync_1 = require("../../../../modules/faire-sync");
5
- // GET /admin/faire/products — list products already on Faire (paginated)
5
+ // GET /admin/faire/products — list products already on Faire (cursor-paginated).
6
+ // `page` is an opaque cursor returned by the previous response's `next_page`,
7
+ // NOT a 1-based index. Optional `updated_at_min` filters to changed products.
6
8
  const GET = async (req, res) => {
7
9
  const service = req.scope.resolve(faire_sync_1.FAIRE_SYNC_MODULE);
8
10
  const account = await service.ensureFreshToken();
9
11
  const client = service.getClient();
10
12
  const limit = Number(req.query.limit) || 50;
11
- const page = req.query.page ? Number(req.query.page) : 1;
12
- const data = await client.listProducts(account.access_token, { limit, page });
13
- res.json({ products: data.results, count: data.count });
13
+ const page = typeof req.query.page === "string" ? req.query.page : undefined;
14
+ const updated_at_min = typeof req.query.updated_at_min === "string"
15
+ ? req.query.updated_at_min
16
+ : undefined;
17
+ const data = await client.listProducts(account.access_token, {
18
+ limit,
19
+ page,
20
+ updated_at_min,
21
+ });
22
+ res.json({
23
+ products: data.results,
24
+ count: data.count,
25
+ next_page: data.next_page,
26
+ });
14
27
  };
15
28
  exports.GET = GET;
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUFrRTtBQUdsRSx5RUFBeUU7QUFDbEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sT0FBTyxHQUFxQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7QUFDekQsQ0FBQyxDQUFBO0FBUlksUUFBQSxHQUFHLE9BUWYifQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUFrRTtBQUdsRSxpRkFBaUY7QUFDakYsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUN2RSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSxPQUFPLEdBQXFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzNDLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzVFLE1BQU0sY0FBYyxHQUNsQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxLQUFLLFFBQVE7UUFDMUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYztRQUMxQixDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2YsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7UUFDM0QsS0FBSztRQUNMLElBQUk7UUFDSixjQUFjO0tBQ2YsQ0FBQyxDQUFBO0lBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTztRQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQXBCWSxRQUFBLEdBQUcsT0FvQmYifQ==
@@ -5,9 +5,12 @@ exports.default = pullFaireOrdersJob;
5
5
  const faire_sync_1 = require("../modules/faire-sync");
6
6
  const ingest_faire_orders_bulk_1 = require("../workflows/ingest-faire-orders-bulk");
7
7
  /**
8
- * Scheduled pull of new Faire orders. Runs the bulk order-ingestion workflow
9
- * (a long-running background workflow) so new wholesale orders placed on Faire
10
- * are mirrored into Medusa without a seller having to trigger it manually.
8
+ * Scheduled incremental pull of Faire orders.
9
+ *
10
+ * Faire is POLLING, not webhooks there is no inbound delivery. This job runs
11
+ * the bulk order-ingestion workflow, which fetches only orders changed since
12
+ * the persisted `last_order_sync_at` high-water mark (cursor-based). Cadence is
13
+ * every 5 minutes (Faire's own WooCommerce plugin polls on a similar interval).
11
14
  *
12
15
  * Disable by setting FAIRE_AUTO_INGEST_ORDERS=false.
13
16
  */
@@ -27,6 +30,6 @@ async function pullFaireOrdersJob(container) {
27
30
  }
28
31
  exports.config = {
29
32
  name: "faire-pull-orders",
30
- schedule: "*/30 * * * *", // every 30 minutes
33
+ schedule: "*/5 * * * *", // every 5 minutes (polling model)
31
34
  };
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1mYWlyZS1vcmRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9wdWxsLWZhaXJlLW9yZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxxQ0FZQztBQXZCRCxzREFBeUQ7QUFFekQsb0ZBQXFGO0FBRXJGOzs7Ozs7R0FNRztBQUNZLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQjtJQUN6RSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssT0FBTztRQUFFLE9BQU07SUFFNUQsTUFBTSxPQUFPLEdBQXFCLFNBQVMsQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQUMsQ0FBQTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ2hELElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTTtJQUVwQixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEsd0RBQTZCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekUsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLFFBQVEsRUFBRSxjQUFjLEVBQUUsbUJBQW1CO0NBQzlDLENBQUEifQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1mYWlyZS1vcmRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9wdWxsLWZhaXJlLW9yZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFlQSxxQ0FZQztBQTFCRCxzREFBeUQ7QUFFekQsb0ZBQXFGO0FBRXJGOzs7Ozs7Ozs7R0FTRztBQUNZLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQjtJQUN6RSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssT0FBTztRQUFFLE9BQU07SUFFNUQsTUFBTSxPQUFPLEdBQXFCLFNBQVMsQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQUMsQ0FBQTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ2hELElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTTtJQUVwQixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEsd0RBQTZCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekUsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLFFBQVEsRUFBRSxhQUFhLEVBQUUsa0NBQWtDO0NBQzVELENBQUEifQ==