Просмотр исходного кода

fix: correct ShopRenter pagination to use 0-based indexing across all functions #86

- Updated _shared/shoprenter-client.ts default page parameter from 1 to 0
- Fixed mcp-shoprenter/index.ts to use page 0 for all API calls
- Added page conversion in shop-data-api and webshop-data-api for ShopRenter
- ShopRenter API uses 0-based pagination (page 0 is first page)
- WooCommerce and Shopify clients remain unchanged (1-based and cursor-based)
Claude 5 месяцев назад
Родитель
Сommit
581c7e4416

+ 4 - 4
supabase/functions/mcp-shoprenter/index.ts

@@ -261,7 +261,7 @@ async function handleGetOrder(args: Record<string, any>): Promise<ToolCallResult
   try {
   try {
     // Search for order by innerId (customer-visible order number)
     // Search for order by innerId (customer-visible order number)
     // The order_id parameter is actually the innerId from the customer's perspective
     // The order_id parameter is actually the innerId from the customer's perspective
-    const response = await fetchOrders(shop_id, 1, 1, { innerId: order_id });
+    const response = await fetchOrders(shop_id, 0, 1, { innerId: order_id });
     const orders = Array.isArray(response) ? response : (response.data || response.orders || []);
     const orders = Array.isArray(response) ? response : (response.data || response.orders || []);
 
 
     if (orders.length === 0) {
     if (orders.length === 0) {
@@ -375,11 +375,11 @@ async function handleListOrders(args: Record<string, any>): Promise<ToolCallResu
       // If filtering by customer name, we need to fetch and filter locally
       // If filtering by customer name, we need to fetch and filter locally
       // because ShopRenter doesn't support name filtering directly
       // because ShopRenter doesn't support name filtering directly
       filters.customer_name = customer_name;
       filters.customer_name = customer_name;
-      const response = await fetchOrders(shop_id, 1, actualLimit, filters);
+      const response = await fetchOrders(shop_id, 0, actualLimit, filters);
       orders = Array.isArray(response) ? response : (response.data || response.orders || []);
       orders = Array.isArray(response) ? response : (response.data || response.orders || []);
     } else {
     } else {
       // Direct API fetch with filters
       // Direct API fetch with filters
-      const response = await fetchOrders(shop_id, 1, actualLimit, filters);
+      const response = await fetchOrders(shop_id, 0, actualLimit, filters);
       orders = Array.isArray(response) ? response : (response.data || response.orders || []);
       orders = Array.isArray(response) ? response : (response.data || response.orders || []);
     }
     }
 
 
@@ -467,7 +467,7 @@ async function handleGetCustomer(args: Record<string, any>): Promise<ToolCallRes
 
 
   try {
   try {
     // Fetch customer by email from ShopRenter API
     // Fetch customer by email from ShopRenter API
-    const response = await fetchCustomers(shop_id, 1, 1, { email });
+    const response = await fetchCustomers(shop_id, 0, 1, { email });
     const customers = Array.isArray(response) ? response : (response.data || response.customers || []);
     const customers = Array.isArray(response) ? response : (response.data || response.customers || []);
 
 
     if (customers.length === 0) {
     if (customers.length === 0) {

+ 6 - 3
supabase/functions/shop-data-api/index.ts

@@ -540,16 +540,19 @@ async function fetchShopRenterData(
     let data;
     let data;
     let rawData;
     let rawData;
 
 
+    // ShopRenter uses 0-based pagination, so convert from 1-based (page 1 -> 0, page 2 -> 1, etc.)
+    const shopRenterPage = Math.max(0, page - 1);
+
     if (resource === "customers") {
     if (resource === "customers") {
-      const response = await ShopRenterClient.fetchCustomers(store.id, page, limit);
+      const response = await ShopRenterClient.fetchCustomers(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.customer(item));
       data = rawData.map((item: any) => adapters.customer(item));
     } else if (resource === "orders") {
     } else if (resource === "orders") {
-      const response = await ShopRenterClient.fetchOrders(store.id, page, limit);
+      const response = await ShopRenterClient.fetchOrders(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.order(item));
       data = rawData.map((item: any) => adapters.order(item));
     } else if (resource === "products") {
     } else if (resource === "products") {
-      const response = await ShopRenterClient.fetchProducts(store.id, page, limit);
+      const response = await ShopRenterClient.fetchProducts(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.product(item));
       data = rawData.map((item: any) => adapters.product(item));
     }
     }

+ 6 - 3
supabase/functions/webshop-data-api/index.ts

@@ -405,16 +405,19 @@ async function fetchShopRenterData(
     let data;
     let data;
     let rawData;
     let rawData;
 
 
+    // ShopRenter uses 0-based pagination, so convert from 1-based (page 1 -> 0, page 2 -> 1, etc.)
+    const shopRenterPage = Math.max(0, page - 1);
+
     if (resource === "customers") {
     if (resource === "customers") {
-      const response = await ShopRenterClient.fetchCustomers(store.id, page, limit);
+      const response = await ShopRenterClient.fetchCustomers(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.customer(item));
       data = rawData.map((item: any) => adapters.customer(item));
     } else if (resource === "orders") {
     } else if (resource === "orders") {
-      const response = await ShopRenterClient.fetchOrders(store.id, page, limit);
+      const response = await ShopRenterClient.fetchOrders(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.order(item));
       data = rawData.map((item: any) => adapters.order(item));
     } else if (resource === "products") {
     } else if (resource === "products") {
-      const response = await ShopRenterClient.fetchProducts(store.id, page, limit);
+      const response = await ShopRenterClient.fetchProducts(store.id, shopRenterPage, limit);
       rawData = response.items || [];
       rawData = response.items || [];
       data = rawData.map((item: any) => adapters.product(item));
       data = rawData.map((item: any) => adapters.product(item));
     }
     }