@yoryoboy/bi-mcp 1.16.0 → 1.19.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.
- package/README.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +179 -6
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +3 -6
- package/dist/src/config/__tests__/google-store.test.js +30 -0
- package/dist/src/config/__tests__/google-store.test.js.map +7 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
- package/dist/src/config/google-store.js +18 -0
- package/dist/src/config/google-store.js.map +2 -2
- package/dist/src/config/mcp-tool-deadline-context.js +34 -0
- package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
- package/dist/src/config/mcp-tool-deadline.js +67 -0
- package/dist/src/config/mcp-tool-deadline.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
- package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
- package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-api.js +6 -0
- package/dist/src/services/vtex/vtex-api.js.map +2 -2
- package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
- package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
- package/dist/src/tools/config/list-profiles.js +39 -3
- package/dist/src/tools/config/list-profiles.js.map +2 -2
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
- package/dist/src/tools/mercadolibre/index.js +32 -0
- package/dist/src/tools/mercadolibre/index.js.map +2 -2
- package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
- package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
- package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
- package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
- package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/google-ads/report-utils.js +0 -78
- package/dist/src/google-ads/report-utils.js.map +0 -7
- package/dist/src/search-console/search-console-utils.js +0 -275
- package/dist/src/search-console/search-console-utils.js.map +0 -7
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
- package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMercadoLibreApiContext,
|
|
3
|
+
runMercadoLibreBatch
|
|
4
|
+
} from "./mercadolibre-api.js";
|
|
5
|
+
import { getMercadoLibreItemDetailsBatch } from "./mercadolibre-items.js";
|
|
6
|
+
async function fetchUserProduct(api, userProductId) {
|
|
7
|
+
const response = await api.get(`/user-products/${userProductId}`);
|
|
8
|
+
return response.data;
|
|
9
|
+
}
|
|
10
|
+
async function fetchUserProductBundles(api, userProductId) {
|
|
11
|
+
const response = await api.get(`/user-products/${userProductId}/bundles`);
|
|
12
|
+
return response.data;
|
|
13
|
+
}
|
|
14
|
+
async function getMercadoLibreUserProduct(profileId, userProductId) {
|
|
15
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
16
|
+
return fetchUserProduct(api, userProductId);
|
|
17
|
+
}
|
|
18
|
+
async function getMercadoLibreUserProductsBatch(profileId, userProductIds, options = {}) {
|
|
19
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
20
|
+
return runMercadoLibreBatch(userProductIds, (userProductId) => fetchUserProduct(api, userProductId), options);
|
|
21
|
+
}
|
|
22
|
+
async function getMercadoLibreUserProductBundles(profileId, userProductId) {
|
|
23
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
24
|
+
return fetchUserProductBundles(api, userProductId);
|
|
25
|
+
}
|
|
26
|
+
async function getMercadoLibreUserProductBundlesBatch(profileId, userProductIds, options = {}) {
|
|
27
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
28
|
+
return runMercadoLibreBatch(userProductIds, (userProductId) => fetchUserProductBundles(api, userProductId), options);
|
|
29
|
+
}
|
|
30
|
+
async function resolveMercadoLibreUserProductsFromItems(profileId, itemIds) {
|
|
31
|
+
const items = await getMercadoLibreItemDetailsBatch(profileId, itemIds, [
|
|
32
|
+
"id",
|
|
33
|
+
"user_product_id",
|
|
34
|
+
"title",
|
|
35
|
+
"catalog_product_id",
|
|
36
|
+
"domain_id",
|
|
37
|
+
"family_id"
|
|
38
|
+
]);
|
|
39
|
+
return items.map((item) => ({
|
|
40
|
+
itemId: typeof item.id === "string" ? item.id : "",
|
|
41
|
+
userProductId: typeof item.user_product_id === "string" ? item.user_product_id : "",
|
|
42
|
+
title: typeof item.title === "string" ? item.title : "",
|
|
43
|
+
catalogProductId: typeof item.catalog_product_id === "string" ? item.catalog_product_id : "",
|
|
44
|
+
domainId: typeof item.domain_id === "string" ? item.domain_id : "",
|
|
45
|
+
familyId: typeof item.family_id === "number" || typeof item.family_id === "string" ? String(item.family_id) : ""
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
getMercadoLibreUserProduct,
|
|
50
|
+
getMercadoLibreUserProductBundles,
|
|
51
|
+
getMercadoLibreUserProductBundlesBatch,
|
|
52
|
+
getMercadoLibreUserProductsBatch,
|
|
53
|
+
resolveMercadoLibreUserProductsFromItems
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=mercadolibre-kits.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/services/mercadolibre/mercadolibre-kits.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport {\n getMercadoLibreApiContext,\n runMercadoLibreBatch,\n type MercadoLibreBatchFetchOptions,\n type MercadoLibreDocumentsBatchResult,\n} from \"./mercadolibre-api.js\";\nimport { getMercadoLibreItemDetailsBatch } from \"./mercadolibre-items.js\";\n\nasync function fetchUserProduct(api: AxiosInstance, userProductId: string): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(`/user-products/${userProductId}`);\n return response.data;\n}\n\nasync function fetchUserProductBundles(\n api: AxiosInstance,\n userProductId: string\n): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(`/user-products/${userProductId}/bundles`);\n return response.data;\n}\n\nexport async function getMercadoLibreUserProduct(profileId: string, userProductId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return fetchUserProduct(api, userProductId);\n}\n\nexport async function getMercadoLibreUserProductsBatch(\n profileId: string,\n userProductIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentsBatchResult<Record<string, unknown>>> {\n const { api } = await getMercadoLibreApiContext(profileId);\n\n return runMercadoLibreBatch(userProductIds, (userProductId) => fetchUserProduct(api, userProductId), options);\n}\n\nexport async function getMercadoLibreUserProductBundles(profileId: string, userProductId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return fetchUserProductBundles(api, userProductId);\n}\n\nexport async function getMercadoLibreUserProductBundlesBatch(\n profileId: string,\n userProductIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentsBatchResult<Record<string, unknown>>> {\n const { api } = await getMercadoLibreApiContext(profileId);\n\n return runMercadoLibreBatch(userProductIds, (userProductId) => fetchUserProductBundles(api, userProductId), options);\n}\n\nexport async function resolveMercadoLibreUserProductsFromItems(\n profileId: string,\n itemIds: string[]\n) {\n const items = await getMercadoLibreItemDetailsBatch(profileId, itemIds, [\n \"id\",\n \"user_product_id\",\n \"title\",\n \"catalog_product_id\",\n \"domain_id\",\n \"family_id\",\n ]);\n\n return items.map((item) => ({\n itemId: typeof item.id === \"string\" ? item.id : \"\",\n userProductId: typeof item.user_product_id === \"string\" ? item.user_product_id : \"\",\n title: typeof item.title === \"string\" ? item.title : \"\",\n catalogProductId: typeof item.catalog_product_id === \"string\" ? item.catalog_product_id : \"\",\n domainId: typeof item.domain_id === \"string\" ? item.domain_id : \"\",\n familyId: typeof item.family_id === \"number\" || typeof item.family_id === \"string\" ? String(item.family_id) : \"\",\n }));\n}\n"],
|
|
5
|
+
"mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,uCAAuC;AAEhD,eAAe,iBAAiB,KAAoB,eAAyD;AAC3G,QAAM,WAAW,MAAM,IAAI,IAA6B,kBAAkB,aAAa,EAAE;AACzF,SAAO,SAAS;AAClB;AAEA,eAAe,wBACb,KACA,eACkC;AAClC,QAAM,WAAW,MAAM,IAAI,IAA6B,kBAAkB,aAAa,UAAU;AACjG,SAAO,SAAS;AAClB;AAEA,eAAsB,2BAA2B,WAAmB,eAAuB;AACzF,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,SAAO,iBAAiB,KAAK,aAAa;AAC5C;AAEA,eAAsB,iCACpB,WACA,gBACA,UAAyC,CAAC,GAC0B;AACpE,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AAEzD,SAAO,qBAAqB,gBAAgB,CAAC,kBAAkB,iBAAiB,KAAK,aAAa,GAAG,OAAO;AAC9G;AAEA,eAAsB,kCAAkC,WAAmB,eAAuB;AAChG,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,SAAO,wBAAwB,KAAK,aAAa;AACnD;AAEA,eAAsB,uCACpB,WACA,gBACA,UAAyC,CAAC,GAC0B;AACpE,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AAEzD,SAAO,qBAAqB,gBAAgB,CAAC,kBAAkB,wBAAwB,KAAK,aAAa,GAAG,OAAO;AACrH;AAEA,eAAsB,yCACpB,WACA,SACA;AACA,QAAM,QAAQ,MAAM,gCAAgC,WAAW,SAAS;AAAA,IACtE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,QAAQ,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AAAA,IAChD,eAAe,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,IACjF,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,kBAAkB,OAAO,KAAK,uBAAuB,WAAW,KAAK,qBAAqB;AAAA,IAC1F,UAAU,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,IAChE,UAAU,OAAO,KAAK,cAAc,YAAY,OAAO,KAAK,cAAc,WAAW,OAAO,KAAK,SAAS,IAAI;AAAA,EAChH,EAAE;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { asRecord, normalizeScalarString } from "../../tools/mercadolibre/helpers.js";
|
|
2
|
+
import { getMercadoLibreConnectionRow } from "../../config/mercadolibre-profile-store.js";
|
|
3
|
+
import { assertActiveProfile } from "../../config/profile-store.js";
|
|
4
|
+
import { decryptSecret } from "../../config/vtex-crypto.js";
|
|
5
|
+
import {
|
|
6
|
+
createMercadoLibreClient,
|
|
7
|
+
isRetryableMercadoLibreError,
|
|
8
|
+
MercadoLibreApiError
|
|
9
|
+
} from "./mercadolibre-api.js";
|
|
10
|
+
const DEFAULT_MAX_RETRIES = 2;
|
|
11
|
+
const DEFAULT_BASE_RETRY_DELAY_MS = 250;
|
|
12
|
+
const DEFAULT_PACK_OPERATION_DEADLINE_MS = 3e4;
|
|
13
|
+
class PackOperationDeadlineExceededError extends Error {
|
|
14
|
+
constructor() {
|
|
15
|
+
super("MercadoLibre pack billing info operation deadline exceeded");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function getOrderSellerId(order) {
|
|
19
|
+
const seller = order.seller;
|
|
20
|
+
if (seller == null || typeof seller !== "object" || Array.isArray(seller)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const sellerId = seller.id;
|
|
24
|
+
if (typeof sellerId === "number" && Number.isFinite(sellerId)) {
|
|
25
|
+
return String(sellerId);
|
|
26
|
+
}
|
|
27
|
+
if (typeof sellerId === "string" && sellerId.trim()) {
|
|
28
|
+
return sellerId.trim();
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
async function verifyMercadoLibreOrderOwnership(profileId, order) {
|
|
33
|
+
await assertActiveProfile(profileId);
|
|
34
|
+
const connection = await getMercadoLibreConnectionRow(profileId);
|
|
35
|
+
if (!connection || !connection.sellerId || !isRecord(order)) return "unverifiable";
|
|
36
|
+
const orderSellerId = getOrderSellerId(order);
|
|
37
|
+
if (!orderSellerId) return "unverifiable";
|
|
38
|
+
return orderSellerId === String(connection.sellerId).trim() ? "owned" : "mismatch";
|
|
39
|
+
}
|
|
40
|
+
function isRecord(value) {
|
|
41
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
function getFiscalFieldStatus(value, allowFiniteNumber = false) {
|
|
44
|
+
if (value == null) {
|
|
45
|
+
return "missing";
|
|
46
|
+
}
|
|
47
|
+
if (typeof value === "string") {
|
|
48
|
+
return value.trim() ? "valid" : "missing";
|
|
49
|
+
}
|
|
50
|
+
if (allowFiniteNumber && typeof value === "number" && Number.isFinite(value)) {
|
|
51
|
+
return "valid";
|
|
52
|
+
}
|
|
53
|
+
return "malformed";
|
|
54
|
+
}
|
|
55
|
+
function normalizeBillingInfoFiscalState(billingInfo) {
|
|
56
|
+
const buyer = asRecord(billingInfo.buyer);
|
|
57
|
+
const buyerBillingInfo = asRecord(buyer.billing_info);
|
|
58
|
+
const address = asRecord(buyerBillingInfo.address);
|
|
59
|
+
const state = address.state;
|
|
60
|
+
if (!isRecord(state)) {
|
|
61
|
+
return billingInfo;
|
|
62
|
+
}
|
|
63
|
+
if (getFiscalFieldStatus(state.code) !== "valid" || getFiscalFieldStatus(state.name) !== "valid") {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
...billingInfo,
|
|
68
|
+
buyer: {
|
|
69
|
+
...buyer,
|
|
70
|
+
billing_info: {
|
|
71
|
+
...buyerBillingInfo,
|
|
72
|
+
address: {
|
|
73
|
+
...address,
|
|
74
|
+
state: state.name.trim()
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function getBillingInfoFiscalFieldStatus(billingInfo) {
|
|
81
|
+
const buyerBillingInfo = asRecord(asRecord(billingInfo.buyer).billing_info);
|
|
82
|
+
const identification = asRecord(buyerBillingInfo.identification);
|
|
83
|
+
const address = asRecord(buyerBillingInfo.address);
|
|
84
|
+
const taxpayerType = asRecord(asRecord(buyerBillingInfo.taxes).taxpayer_type);
|
|
85
|
+
const requiredFieldStatuses = [
|
|
86
|
+
getFiscalFieldStatus(buyerBillingInfo.name),
|
|
87
|
+
getFiscalFieldStatus(buyerBillingInfo.last_name),
|
|
88
|
+
getFiscalFieldStatus(identification.type),
|
|
89
|
+
getFiscalFieldStatus(identification.number),
|
|
90
|
+
getFiscalFieldStatus(address.street_name),
|
|
91
|
+
// Mercado Libre may provide a numeric street number; all other fiscal fields are strings.
|
|
92
|
+
getFiscalFieldStatus(address.street_number, true),
|
|
93
|
+
getFiscalFieldStatus(address.city_name),
|
|
94
|
+
getFiscalFieldStatus(address.state),
|
|
95
|
+
getFiscalFieldStatus(address.zip_code),
|
|
96
|
+
getFiscalFieldStatus(address.country_id),
|
|
97
|
+
getFiscalFieldStatus(taxpayerType.id),
|
|
98
|
+
getFiscalFieldStatus(taxpayerType.description)
|
|
99
|
+
];
|
|
100
|
+
if (requiredFieldStatuses.includes("malformed")) {
|
|
101
|
+
return "malformed";
|
|
102
|
+
}
|
|
103
|
+
return requiredFieldStatuses.includes("missing") ? "missing" : "valid";
|
|
104
|
+
}
|
|
105
|
+
function credentialMaintenanceRequired(connection) {
|
|
106
|
+
return !connection || connection.status === "disabled" || !connection.encryptedAccessToken || !connection.expiresAt || connection.expiresAt.getTime() <= Date.now();
|
|
107
|
+
}
|
|
108
|
+
function sleep(ms) {
|
|
109
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
110
|
+
}
|
|
111
|
+
function getWithOptionalSignal(api, path, signal) {
|
|
112
|
+
return signal ? api.get(path, { signal }) : api.get(path);
|
|
113
|
+
}
|
|
114
|
+
async function getWithRetry(request, options, resource) {
|
|
115
|
+
const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
116
|
+
const baseRetryDelayMs = options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS;
|
|
117
|
+
const pause = options.sleep ?? sleep;
|
|
118
|
+
const now = options.now ?? Date.now;
|
|
119
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
120
|
+
const remainingMs = options.deadlineAt == null ? void 0 : options.deadlineAt - now();
|
|
121
|
+
if (remainingMs != null && remainingMs <= 0) throw new PackOperationDeadlineExceededError();
|
|
122
|
+
try {
|
|
123
|
+
if (remainingMs == null) return (await request()).data;
|
|
124
|
+
const controller = new AbortController();
|
|
125
|
+
let timeout;
|
|
126
|
+
try {
|
|
127
|
+
return (await Promise.race([
|
|
128
|
+
request(controller.signal),
|
|
129
|
+
new Promise((_, reject) => {
|
|
130
|
+
timeout = setTimeout(() => {
|
|
131
|
+
controller.abort();
|
|
132
|
+
reject(new PackOperationDeadlineExceededError());
|
|
133
|
+
}, remainingMs);
|
|
134
|
+
})
|
|
135
|
+
])).data;
|
|
136
|
+
} finally {
|
|
137
|
+
if (timeout) clearTimeout(timeout);
|
|
138
|
+
}
|
|
139
|
+
} catch (error) {
|
|
140
|
+
if (error instanceof PackOperationDeadlineExceededError) throw error;
|
|
141
|
+
if (!isRetryableMercadoLibreError(error) || attempt >= maxRetries) {
|
|
142
|
+
const status = error instanceof MercadoLibreApiError ? error.status : void 0;
|
|
143
|
+
const code = error instanceof MercadoLibreApiError ? error.code : void 0;
|
|
144
|
+
const retryAfterMs2 = error instanceof MercadoLibreApiError ? error.retryAfterMs : void 0;
|
|
145
|
+
const terminalError = new MercadoLibreApiError(
|
|
146
|
+
"MercadoLibre billing info request unavailable",
|
|
147
|
+
status,
|
|
148
|
+
code,
|
|
149
|
+
retryAfterMs2
|
|
150
|
+
);
|
|
151
|
+
terminalError.resource = resource;
|
|
152
|
+
terminalError.attempts = attempt + 1;
|
|
153
|
+
terminalError.retryable = isRetryableMercadoLibreError(error);
|
|
154
|
+
throw terminalError;
|
|
155
|
+
}
|
|
156
|
+
const retryAfterMs = error instanceof MercadoLibreApiError ? error.retryAfterMs : void 0;
|
|
157
|
+
const retryDelayMs = retryAfterMs ?? baseRetryDelayMs * 2 ** attempt;
|
|
158
|
+
if (options.deadlineAt != null && now() + retryDelayMs >= options.deadlineAt) {
|
|
159
|
+
throw new PackOperationDeadlineExceededError();
|
|
160
|
+
}
|
|
161
|
+
await pause(retryDelayMs);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function getMercadoLibreOrderBillingInfo(profileId, orderId, options = {}) {
|
|
166
|
+
await assertActiveProfile(profileId);
|
|
167
|
+
const connection = await getMercadoLibreConnectionRow(profileId);
|
|
168
|
+
if (!connection || credentialMaintenanceRequired(connection)) {
|
|
169
|
+
return { available: false, reason: "credential_maintenance_required" };
|
|
170
|
+
}
|
|
171
|
+
const api = createMercadoLibreClient(decryptSecret(connection.encryptedAccessToken));
|
|
172
|
+
const sellerId = connection.sellerId;
|
|
173
|
+
const orderPayload = await getWithRetry(
|
|
174
|
+
(signal) => getWithOptionalSignal(api, `/orders/${encodeURIComponent(orderId)}`, signal),
|
|
175
|
+
options,
|
|
176
|
+
"order"
|
|
177
|
+
);
|
|
178
|
+
if (!isRecord(orderPayload)) {
|
|
179
|
+
return { available: false, reason: "order_payload_malformed" };
|
|
180
|
+
}
|
|
181
|
+
const order = orderPayload;
|
|
182
|
+
const orderSellerId = getOrderSellerId(order);
|
|
183
|
+
if (!orderSellerId) {
|
|
184
|
+
return { available: false, reason: "order_seller_id_missing_or_malformed" };
|
|
185
|
+
}
|
|
186
|
+
if (orderSellerId !== String(sellerId).trim()) {
|
|
187
|
+
return { available: false, reason: "order_seller_ownership_mismatch" };
|
|
188
|
+
}
|
|
189
|
+
const buyer = asRecord(order.buyer);
|
|
190
|
+
const billingInfoId = normalizeScalarString(asRecord(buyer.billing_info).id);
|
|
191
|
+
if (!billingInfoId) {
|
|
192
|
+
return { available: false, reason: "order_buyer_billing_info_missing" };
|
|
193
|
+
}
|
|
194
|
+
const accountPayload = await getWithRetry(
|
|
195
|
+
(signal) => getWithOptionalSignal(api, `/users/${encodeURIComponent(sellerId)}`, signal),
|
|
196
|
+
options,
|
|
197
|
+
"account"
|
|
198
|
+
);
|
|
199
|
+
if (!isRecord(accountPayload)) {
|
|
200
|
+
return { available: false, reason: "account_payload_malformed" };
|
|
201
|
+
}
|
|
202
|
+
const siteId = normalizeScalarString(accountPayload.site_id);
|
|
203
|
+
if (!siteId) {
|
|
204
|
+
return { available: false, reason: "order_site_id_missing_or_malformed" };
|
|
205
|
+
}
|
|
206
|
+
const billingInfoPayload = await getWithRetry(
|
|
207
|
+
(signal) => getWithOptionalSignal(
|
|
208
|
+
api,
|
|
209
|
+
`/orders/billing-info/${encodeURIComponent(siteId)}/${encodeURIComponent(billingInfoId)}`,
|
|
210
|
+
signal
|
|
211
|
+
),
|
|
212
|
+
options,
|
|
213
|
+
"billing_info"
|
|
214
|
+
);
|
|
215
|
+
if (!isRecord(billingInfoPayload) || !isRecord(asRecord(billingInfoPayload.buyer).billing_info)) {
|
|
216
|
+
return { available: false, reason: "billing_info_payload_malformed" };
|
|
217
|
+
}
|
|
218
|
+
const normalizedBillingInfoPayload = normalizeBillingInfoFiscalState(billingInfoPayload);
|
|
219
|
+
if (!normalizedBillingInfoPayload) {
|
|
220
|
+
return { available: false, reason: "billing_info_fiscal_fields_malformed" };
|
|
221
|
+
}
|
|
222
|
+
const fiscalFieldStatus = getBillingInfoFiscalFieldStatus(normalizedBillingInfoPayload);
|
|
223
|
+
if (fiscalFieldStatus === "malformed") {
|
|
224
|
+
return { available: false, reason: "billing_info_fiscal_fields_malformed" };
|
|
225
|
+
}
|
|
226
|
+
if (fiscalFieldStatus === "missing") {
|
|
227
|
+
return { available: false, reason: "billing_info_fiscal_fields_missing" };
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
available: true,
|
|
231
|
+
order,
|
|
232
|
+
billingInfo: normalizedBillingInfoPayload
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function isOrderNotFound(error) {
|
|
236
|
+
return error instanceof MercadoLibreApiError && error.status === 404 && error.resource === "order";
|
|
237
|
+
}
|
|
238
|
+
function getMemberFailureReason(error) {
|
|
239
|
+
if (error instanceof PackOperationDeadlineExceededError) return "operation_deadline_exceeded";
|
|
240
|
+
if (!(error instanceof MercadoLibreApiError)) return "request_failed";
|
|
241
|
+
if (error.status === 404) return "order_not_found";
|
|
242
|
+
if (error.status === 401 || error.status === 403) return "access_denied";
|
|
243
|
+
if (error.status === 408 || error.status === 429 || error.status != null && error.status >= 500) {
|
|
244
|
+
return "upstream_unavailable";
|
|
245
|
+
}
|
|
246
|
+
return "request_failed";
|
|
247
|
+
}
|
|
248
|
+
function getSafeRetryDiagnostics(error) {
|
|
249
|
+
if (!(error instanceof MercadoLibreApiError) || !Number.isSafeInteger(error.attempts) || error.attempts < 1 || typeof error.retryable !== "boolean") {
|
|
250
|
+
return {};
|
|
251
|
+
}
|
|
252
|
+
const terminalError = error;
|
|
253
|
+
return { attempts: terminalError.attempts, retryable: terminalError.retryable };
|
|
254
|
+
}
|
|
255
|
+
function packUnavailableResult(packId, unavailableReason) {
|
|
256
|
+
const deadlineExceeded = unavailableReason === "pack_operation_deadline_exceeded";
|
|
257
|
+
return {
|
|
258
|
+
resolutionKind: "pack",
|
|
259
|
+
packId,
|
|
260
|
+
members: [],
|
|
261
|
+
unavailableReason,
|
|
262
|
+
metadata: {
|
|
263
|
+
memberCount: 0,
|
|
264
|
+
validMemberCount: 0,
|
|
265
|
+
invalidMemberCount: 0,
|
|
266
|
+
accessibleCount: 0,
|
|
267
|
+
availableCount: 0,
|
|
268
|
+
unavailableCount: 0,
|
|
269
|
+
failedCount: 0,
|
|
270
|
+
partialCoverage: true,
|
|
271
|
+
deadlineExceeded,
|
|
272
|
+
recoveryGuidance: deadlineExceeded ? "The pack operation deadline expired before the pack could be resolved; retry the same sale reference." : "Verify the pack reference in MercadoLibre and retry with the original sale reference."
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function extractPackMembers(packPayload) {
|
|
277
|
+
if (!isRecord(packPayload) || !Array.isArray(packPayload.orders)) return null;
|
|
278
|
+
return packPayload.orders.map((member, memberIndex) => {
|
|
279
|
+
const orderId = normalizeScalarString(asRecord(member).id)?.trim();
|
|
280
|
+
return orderId ? { orderId } : { memberIndex };
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
async function getMercadoLibrePackBillingInfo(profileId, packId, options) {
|
|
284
|
+
await assertActiveProfile(profileId);
|
|
285
|
+
const connection = await getMercadoLibreConnectionRow(profileId);
|
|
286
|
+
if (!connection || credentialMaintenanceRequired(connection)) {
|
|
287
|
+
return packUnavailableResult(packId, "pack_orders_empty");
|
|
288
|
+
}
|
|
289
|
+
const api = createMercadoLibreClient(decryptSecret(connection.encryptedAccessToken));
|
|
290
|
+
const now = options.now ?? Date.now;
|
|
291
|
+
const deadlineAt = options.deadlineAt ?? now() + Math.max(1, options.packOperationDeadlineMs ?? DEFAULT_PACK_OPERATION_DEADLINE_MS);
|
|
292
|
+
const packOptions = { ...options, deadlineAt };
|
|
293
|
+
let packPayload;
|
|
294
|
+
try {
|
|
295
|
+
packPayload = await getWithRetry(
|
|
296
|
+
(signal) => getWithOptionalSignal(api, `/packs/${encodeURIComponent(packId)}`, signal),
|
|
297
|
+
packOptions,
|
|
298
|
+
"pack"
|
|
299
|
+
);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
if (error instanceof PackOperationDeadlineExceededError) {
|
|
302
|
+
return packUnavailableResult(packId, "pack_operation_deadline_exceeded");
|
|
303
|
+
}
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
const packMembers = extractPackMembers(packPayload);
|
|
307
|
+
if (packMembers === null) return packUnavailableResult(packId, "pack_payload_malformed");
|
|
308
|
+
if (packMembers.length === 0) return packUnavailableResult(packId, "pack_orders_empty");
|
|
309
|
+
const maxConcurrency = Math.max(1, Math.floor(options.maxConcurrency ?? 4));
|
|
310
|
+
const members = packMembers.map((member) => {
|
|
311
|
+
if ("memberIndex" in member) {
|
|
312
|
+
return { memberIndex: member.memberIndex, accessible: false, failureReason: "invalid_member" };
|
|
313
|
+
}
|
|
314
|
+
return { orderId: member.orderId, accessible: false, failureReason: "request_failed" };
|
|
315
|
+
});
|
|
316
|
+
const validMembers = members.filter(
|
|
317
|
+
(member) => "orderId" in member
|
|
318
|
+
);
|
|
319
|
+
let nextMemberIndex = 0;
|
|
320
|
+
await Promise.all(
|
|
321
|
+
Array.from({ length: Math.min(maxConcurrency, validMembers.length) }, async () => {
|
|
322
|
+
while (nextMemberIndex < validMembers.length) {
|
|
323
|
+
const member = validMembers[nextMemberIndex++];
|
|
324
|
+
if (now() >= deadlineAt) {
|
|
325
|
+
Object.assign(member, { accessible: false, failureReason: "operation_deadline_exceeded" });
|
|
326
|
+
delete member.result;
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
Object.assign(member, { accessible: true, result: await getMercadoLibreOrderBillingInfo(profileId, member.orderId, packOptions) });
|
|
331
|
+
} catch (error) {
|
|
332
|
+
Object.assign(member, {
|
|
333
|
+
accessible: false,
|
|
334
|
+
failureReason: getMemberFailureReason(error),
|
|
335
|
+
...getSafeRetryDiagnostics(error)
|
|
336
|
+
});
|
|
337
|
+
delete member.result;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
})
|
|
341
|
+
);
|
|
342
|
+
const accessibleCount = members.filter((member) => member.accessible).length;
|
|
343
|
+
const availableCount = members.filter((member) => member.accessible && member.result.available).length;
|
|
344
|
+
const unavailableCount = members.filter((member) => member.accessible && !member.result.available).length;
|
|
345
|
+
const failedCount = members.length - accessibleCount;
|
|
346
|
+
const invalidMemberCount = members.filter((member) => "memberIndex" in member).length;
|
|
347
|
+
const deadlineExceeded = members.some(
|
|
348
|
+
(member) => !member.accessible && member.failureReason === "operation_deadline_exceeded"
|
|
349
|
+
);
|
|
350
|
+
const partialCoverage = availableCount !== members.length;
|
|
351
|
+
return {
|
|
352
|
+
resolutionKind: "pack",
|
|
353
|
+
packId,
|
|
354
|
+
members,
|
|
355
|
+
metadata: {
|
|
356
|
+
memberCount: members.length,
|
|
357
|
+
validMemberCount: validMembers.length,
|
|
358
|
+
invalidMemberCount,
|
|
359
|
+
accessibleCount,
|
|
360
|
+
availableCount,
|
|
361
|
+
unavailableCount,
|
|
362
|
+
failedCount,
|
|
363
|
+
partialCoverage,
|
|
364
|
+
deadlineExceeded,
|
|
365
|
+
recoveryGuidance: deadlineExceeded ? "The pack operation deadline expired before all members could be resolved; retry the same sale reference." : partialCoverage ? "Retry failed member orders with the same sale reference after resolving MercadoLibre access or upstream availability." : "All visible pack member orders returned complete fiscal data."
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
async function getMercadoLibreSaleBillingInfo(profileId, saleReference, options = {}) {
|
|
370
|
+
const now = options.now ?? Date.now;
|
|
371
|
+
const deadlineAt = options.deadlineAt ?? now() + Math.max(1, options.packOperationDeadlineMs ?? DEFAULT_PACK_OPERATION_DEADLINE_MS);
|
|
372
|
+
const featureOptions = { ...options, deadlineAt };
|
|
373
|
+
try {
|
|
374
|
+
return {
|
|
375
|
+
resolutionKind: "order",
|
|
376
|
+
orderId: saleReference,
|
|
377
|
+
result: await getMercadoLibreOrderBillingInfo(profileId, saleReference, featureOptions)
|
|
378
|
+
};
|
|
379
|
+
} catch (error) {
|
|
380
|
+
if (error instanceof PackOperationDeadlineExceededError) {
|
|
381
|
+
throw error;
|
|
382
|
+
}
|
|
383
|
+
if (!isOrderNotFound(error)) throw error;
|
|
384
|
+
return getMercadoLibrePackBillingInfo(profileId, saleReference, featureOptions);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
export {
|
|
388
|
+
getMercadoLibreOrderBillingInfo,
|
|
389
|
+
getMercadoLibreSaleBillingInfo,
|
|
390
|
+
verifyMercadoLibreOrderOwnership
|
|
391
|
+
};
|
|
392
|
+
//# sourceMappingURL=mercadolibre-order-billing-info.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/services/mercadolibre/mercadolibre-order-billing-info.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport { asRecord, normalizeScalarString } from \"../../tools/mercadolibre/helpers.js\";\nimport { getMercadoLibreConnectionRow } from \"../../config/mercadolibre-profile-store.js\";\nimport { assertActiveProfile } from \"../../config/profile-store.js\";\nimport { decryptSecret } from \"../../config/vtex-crypto.js\";\nimport {\n createMercadoLibreClient,\n isRetryableMercadoLibreError,\n MercadoLibreApiError,\n} from \"./mercadolibre-api.js\";\n\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_BASE_RETRY_DELAY_MS = 250;\nconst DEFAULT_PACK_OPERATION_DEADLINE_MS = 30_000;\n\nexport interface MercadoLibreOrderBillingInfoOptions {\n maxRetries?: number;\n baseRetryDelayMs?: number;\n sleep?: (ms: number) => Promise<void>;\n maxConcurrency?: number;\n /** Bounds a pack lookup, including member requests, retries, and backoff. */\n packOperationDeadlineMs?: number;\n /** Injectable clock for deterministic deadline tests. */\n now?: () => number;\n /** Internal deadline shared by all requests in a single pack operation. */\n deadlineAt?: number;\n}\n\ntype BillingInfoRequestResource = \"order\" | \"pack\" | \"account\" | \"billing_info\";\n\ninterface TerminalBillingInfoRequestError extends MercadoLibreApiError {\n resource: BillingInfoRequestResource;\n attempts: number;\n retryable: boolean;\n}\n\nclass PackOperationDeadlineExceededError extends Error {\n constructor() {\n super(\"MercadoLibre pack billing info operation deadline exceeded\");\n }\n}\n\nexport type MercadoLibreOrderBillingInfoResult =\n | {\n available: true;\n order: Record<string, unknown>;\n billingInfo: Record<string, unknown>;\n }\n | {\n available: false;\n reason:\n | \"order_buyer_billing_info_missing\"\n | \"order_payload_malformed\"\n | \"order_seller_id_missing_or_malformed\"\n | \"order_seller_ownership_mismatch\"\n | \"account_payload_malformed\"\n | \"order_site_id_missing_or_malformed\"\n | \"billing_info_payload_malformed\"\n | \"billing_info_fiscal_fields_malformed\"\n | \"billing_info_fiscal_fields_missing\"\n | \"credential_maintenance_required\";\n };\n\nexport type MercadoLibrePackMemberBillingInfoResult =\n | { orderId: string; accessible: true; result: MercadoLibreOrderBillingInfoResult }\n | {\n orderId: string;\n accessible: false;\n failureReason:\n | \"order_not_found\"\n | \"access_denied\"\n | \"upstream_unavailable\"\n | \"request_failed\"\n | \"operation_deadline_exceeded\";\n /** Present only for terminal retry failures; excludes upstream error details. */\n attempts?: number;\n /** Present only alongside attempts for terminal retry failures. */\n retryable?: boolean;\n }\n | {\n memberIndex: number;\n accessible: false;\n failureReason: \"invalid_member\";\n };\n\nexport type MercadoLibreSaleBillingInfoResult =\n | { resolutionKind: \"order\"; orderId: string; result: MercadoLibreOrderBillingInfoResult }\n | {\n resolutionKind: \"pack\";\n packId: string;\n members: MercadoLibrePackMemberBillingInfoResult[];\n metadata: PackResolutionMetadata;\n }\n | {\n resolutionKind: \"pack\";\n packId: string;\n members: [];\n unavailableReason: \"pack_payload_malformed\" | \"pack_orders_empty\" | \"pack_operation_deadline_exceeded\";\n metadata: PackResolutionMetadata;\n };\n\ninterface PackResolutionMetadata {\n memberCount: number;\n validMemberCount: number;\n invalidMemberCount: number;\n accessibleCount: number;\n availableCount: number;\n unavailableCount: number;\n failedCount: number;\n partialCoverage: boolean;\n deadlineExceeded: boolean;\n recoveryGuidance: string;\n}\n\nfunction getOrderSellerId(order: Record<string, unknown>): string | null {\n const seller = order.seller;\n if (seller == null || typeof seller !== \"object\" || Array.isArray(seller)) {\n return null;\n }\n\n const sellerId = (seller as Record<string, unknown>).id;\n if (typeof sellerId === \"number\" && Number.isFinite(sellerId)) {\n return String(sellerId);\n }\n\n if (typeof sellerId === \"string\" && sellerId.trim()) {\n return sellerId.trim();\n }\n\n return null;\n}\n\nexport type MercadoLibreOrderOwnership = \"owned\" | \"mismatch\" | \"unverifiable\";\n\n/** Reuses the same profile seller comparison used before reading buyer/fiscal data. */\nexport async function verifyMercadoLibreOrderOwnership(\n profileId: string,\n order: unknown,\n): Promise<MercadoLibreOrderOwnership> {\n await assertActiveProfile(profileId);\n const connection = await getMercadoLibreConnectionRow(profileId);\n if (!connection || !connection.sellerId || !isRecord(order)) return \"unverifiable\";\n const orderSellerId = getOrderSellerId(order);\n if (!orderSellerId) return \"unverifiable\";\n return orderSellerId === String(connection.sellerId).trim() ? \"owned\" : \"mismatch\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\ntype FiscalFieldStatus = \"valid\" | \"missing\" | \"malformed\";\n\nfunction getFiscalFieldStatus(value: unknown, allowFiniteNumber = false): FiscalFieldStatus {\n if (value == null) {\n return \"missing\";\n }\n\n if (typeof value === \"string\") {\n return value.trim() ? \"valid\" : \"missing\";\n }\n\n if (allowFiniteNumber && typeof value === \"number\" && Number.isFinite(value)) {\n return \"valid\";\n }\n\n return \"malformed\";\n}\n\nfunction normalizeBillingInfoFiscalState(\n billingInfo: Record<string, unknown>\n): Record<string, unknown> | null {\n const buyer = asRecord(billingInfo.buyer);\n const buyerBillingInfo = asRecord(buyer.billing_info);\n const address = asRecord(buyerBillingInfo.address);\n const state = address.state;\n\n if (!isRecord(state)) {\n return billingInfo;\n }\n\n // The report contract exposes one state display field, so normalize the documented\n // Mercado Libre object to its display name while requiring its code to be complete too.\n if (getFiscalFieldStatus(state.code) !== \"valid\" || getFiscalFieldStatus(state.name) !== \"valid\") {\n return null;\n }\n\n return {\n ...billingInfo,\n buyer: {\n ...buyer,\n billing_info: {\n ...buyerBillingInfo,\n address: {\n ...address,\n state: (state.name as string).trim(),\n },\n },\n },\n };\n}\n\nfunction getBillingInfoFiscalFieldStatus(billingInfo: Record<string, unknown>): FiscalFieldStatus {\n const buyerBillingInfo = asRecord(asRecord(billingInfo.buyer).billing_info);\n const identification = asRecord(buyerBillingInfo.identification);\n const address = asRecord(buyerBillingInfo.address);\n const taxpayerType = asRecord(asRecord(buyerBillingInfo.taxes).taxpayer_type);\n\n // A fiscal projection is reportable only when this minimum upstream record is complete.\n const requiredFieldStatuses = [\n getFiscalFieldStatus(buyerBillingInfo.name),\n getFiscalFieldStatus(buyerBillingInfo.last_name),\n getFiscalFieldStatus(identification.type),\n getFiscalFieldStatus(identification.number),\n getFiscalFieldStatus(address.street_name),\n // Mercado Libre may provide a numeric street number; all other fiscal fields are strings.\n getFiscalFieldStatus(address.street_number, true),\n getFiscalFieldStatus(address.city_name),\n getFiscalFieldStatus(address.state),\n getFiscalFieldStatus(address.zip_code),\n getFiscalFieldStatus(address.country_id),\n getFiscalFieldStatus(taxpayerType.id),\n getFiscalFieldStatus(taxpayerType.description),\n ];\n\n if (requiredFieldStatuses.includes(\"malformed\")) {\n return \"malformed\";\n }\n\n return requiredFieldStatuses.includes(\"missing\") ? \"missing\" : \"valid\";\n}\n\nfunction credentialMaintenanceRequired(connection: Awaited<ReturnType<typeof getMercadoLibreConnectionRow>>): boolean {\n return (\n !connection ||\n connection.status === \"disabled\" ||\n !connection.encryptedAccessToken ||\n !connection.expiresAt ||\n connection.expiresAt.getTime() <= Date.now()\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getWithOptionalSignal<T>(api: AxiosInstance, path: string, signal?: AbortSignal) {\n return signal ? api.get<T>(path, { signal }) : api.get<T>(path);\n}\n\nasync function getWithRetry<T>(\n request: (signal?: AbortSignal) => Promise<{ data: T }>,\n options: MercadoLibreOrderBillingInfoOptions,\n resource: BillingInfoRequestResource\n): Promise<T> {\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const baseRetryDelayMs = options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS;\n const pause = options.sleep ?? sleep;\n const now = options.now ?? Date.now;\n\n for (let attempt = 0; ; attempt += 1) {\n const remainingMs = options.deadlineAt == null ? undefined : options.deadlineAt - now();\n if (remainingMs != null && remainingMs <= 0) throw new PackOperationDeadlineExceededError();\n\n try {\n if (remainingMs == null) return (await request()).data;\n\n const controller = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return (\n await Promise.race([\n request(controller.signal),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n controller.abort();\n reject(new PackOperationDeadlineExceededError());\n }, remainingMs);\n }),\n ])\n ).data;\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n } catch (error) {\n if (error instanceof PackOperationDeadlineExceededError) throw error;\n if (!isRetryableMercadoLibreError(error) || attempt >= maxRetries) {\n const status = error instanceof MercadoLibreApiError ? error.status : undefined;\n const code = error instanceof MercadoLibreApiError ? error.code : undefined;\n const retryAfterMs = error instanceof MercadoLibreApiError ? error.retryAfterMs : undefined;\n const terminalError = new MercadoLibreApiError(\n \"MercadoLibre billing info request unavailable\",\n status,\n code,\n retryAfterMs\n ) as TerminalBillingInfoRequestError;\n terminalError.resource = resource;\n terminalError.attempts = attempt + 1;\n terminalError.retryable = isRetryableMercadoLibreError(error);\n throw terminalError;\n }\n\n const retryAfterMs = error instanceof MercadoLibreApiError ? error.retryAfterMs : undefined;\n const retryDelayMs = retryAfterMs ?? baseRetryDelayMs * 2 ** attempt;\n if (options.deadlineAt != null && now() + retryDelayMs >= options.deadlineAt) {\n throw new PackOperationDeadlineExceededError();\n }\n await pause(retryDelayMs);\n }\n }\n}\n\nexport async function getMercadoLibreOrderBillingInfo(\n profileId: string,\n orderId: string,\n options: MercadoLibreOrderBillingInfoOptions = {}\n): Promise<MercadoLibreOrderBillingInfoResult> {\n await assertActiveProfile(profileId);\n const connection = await getMercadoLibreConnectionRow(profileId);\n if (!connection || credentialMaintenanceRequired(connection)) {\n return { available: false, reason: \"credential_maintenance_required\" };\n }\n\n const api = createMercadoLibreClient(decryptSecret(connection.encryptedAccessToken));\n const sellerId = connection.sellerId;\n const orderPayload = await getWithRetry(\n (signal) => getWithOptionalSignal<unknown>(api, `/orders/${encodeURIComponent(orderId)}`, signal),\n options,\n \"order\"\n );\n if (!isRecord(orderPayload)) {\n return { available: false, reason: \"order_payload_malformed\" };\n }\n const order = orderPayload;\n const orderSellerId = getOrderSellerId(order);\n\n if (!orderSellerId) {\n return { available: false, reason: \"order_seller_id_missing_or_malformed\" };\n }\n\n if (orderSellerId !== String(sellerId).trim()) {\n return { available: false, reason: \"order_seller_ownership_mismatch\" };\n }\n\n const buyer = asRecord(order.buyer);\n const billingInfoId = normalizeScalarString(asRecord(buyer.billing_info).id);\n\n if (!billingInfoId) {\n return { available: false, reason: \"order_buyer_billing_info_missing\" };\n }\n\n const accountPayload = await getWithRetry(\n (signal) => getWithOptionalSignal<unknown>(api, `/users/${encodeURIComponent(sellerId)}`, signal),\n options,\n \"account\"\n );\n if (!isRecord(accountPayload)) {\n return { available: false, reason: \"account_payload_malformed\" };\n }\n const siteId = normalizeScalarString(accountPayload.site_id);\n if (!siteId) {\n return { available: false, reason: \"order_site_id_missing_or_malformed\" };\n }\n\n const billingInfoPayload = await getWithRetry(\n (signal) =>\n getWithOptionalSignal<unknown>(\n api,\n `/orders/billing-info/${encodeURIComponent(siteId)}/${encodeURIComponent(billingInfoId)}`,\n signal\n ),\n options,\n \"billing_info\"\n );\n if (!isRecord(billingInfoPayload) || !isRecord(asRecord(billingInfoPayload.buyer).billing_info)) {\n return { available: false, reason: \"billing_info_payload_malformed\" };\n }\n const normalizedBillingInfoPayload = normalizeBillingInfoFiscalState(billingInfoPayload);\n if (!normalizedBillingInfoPayload) {\n return { available: false, reason: \"billing_info_fiscal_fields_malformed\" };\n }\n const fiscalFieldStatus = getBillingInfoFiscalFieldStatus(normalizedBillingInfoPayload);\n if (fiscalFieldStatus === \"malformed\") {\n return { available: false, reason: \"billing_info_fiscal_fields_malformed\" };\n }\n if (fiscalFieldStatus === \"missing\") {\n return { available: false, reason: \"billing_info_fiscal_fields_missing\" };\n }\n\n return {\n available: true,\n order,\n billingInfo: normalizedBillingInfoPayload,\n };\n}\n\nfunction isOrderNotFound(error: unknown): boolean {\n return (\n error instanceof MercadoLibreApiError &&\n error.status === 404 &&\n (error as Partial<TerminalBillingInfoRequestError>).resource === \"order\"\n );\n}\n\nfunction getMemberFailureReason(\n error: unknown\n): \"order_not_found\" | \"access_denied\" | \"upstream_unavailable\" | \"request_failed\" | \"operation_deadline_exceeded\" {\n if (error instanceof PackOperationDeadlineExceededError) return \"operation_deadline_exceeded\";\n if (!(error instanceof MercadoLibreApiError)) return \"request_failed\";\n if (error.status === 404) return \"order_not_found\";\n if (error.status === 401 || error.status === 403) return \"access_denied\";\n if (error.status === 408 || error.status === 429 || (error.status != null && error.status >= 500)) {\n return \"upstream_unavailable\";\n }\n return \"request_failed\";\n}\n\nfunction getSafeRetryDiagnostics(error: unknown): Pick<\n Extract<MercadoLibrePackMemberBillingInfoResult, { orderId: string; accessible: false }>,\n \"attempts\" | \"retryable\"\n> {\n if (\n !(error instanceof MercadoLibreApiError) ||\n !Number.isSafeInteger((error as Partial<TerminalBillingInfoRequestError>).attempts) ||\n (error as Partial<TerminalBillingInfoRequestError>).attempts! < 1 ||\n typeof (error as Partial<TerminalBillingInfoRequestError>).retryable !== \"boolean\"\n ) {\n return {};\n }\n\n const terminalError = error as TerminalBillingInfoRequestError;\n return { attempts: terminalError.attempts, retryable: terminalError.retryable };\n}\n\nfunction packUnavailableResult(\n packId: string,\n unavailableReason: \"pack_payload_malformed\" | \"pack_orders_empty\" | \"pack_operation_deadline_exceeded\"\n): MercadoLibreSaleBillingInfoResult {\n const deadlineExceeded = unavailableReason === \"pack_operation_deadline_exceeded\";\n return {\n resolutionKind: \"pack\",\n packId,\n members: [],\n unavailableReason,\n metadata: {\n memberCount: 0,\n validMemberCount: 0,\n invalidMemberCount: 0,\n accessibleCount: 0,\n availableCount: 0,\n unavailableCount: 0,\n failedCount: 0,\n partialCoverage: true,\n deadlineExceeded,\n recoveryGuidance: deadlineExceeded\n ? \"The pack operation deadline expired before the pack could be resolved; retry the same sale reference.\"\n : \"Verify the pack reference in MercadoLibre and retry with the original sale reference.\",\n },\n };\n}\n\nfunction extractPackMembers(packPayload: unknown): Array<{ orderId: string } | { memberIndex: number }> | null {\n if (!isRecord(packPayload) || !Array.isArray(packPayload.orders)) return null;\n\n return packPayload.orders.map((member, memberIndex) => {\n const orderId = normalizeScalarString(asRecord(member).id)?.trim();\n return orderId ? { orderId } : { memberIndex };\n });\n}\n\nasync function getMercadoLibrePackBillingInfo(\n profileId: string,\n packId: string,\n options: MercadoLibreOrderBillingInfoOptions\n): Promise<MercadoLibreSaleBillingInfoResult> {\n await assertActiveProfile(profileId);\n const connection = await getMercadoLibreConnectionRow(profileId);\n if (!connection || credentialMaintenanceRequired(connection)) {\n return packUnavailableResult(packId, \"pack_orders_empty\");\n }\n\n const api: AxiosInstance = createMercadoLibreClient(decryptSecret(connection.encryptedAccessToken));\n const now = options.now ?? Date.now;\n const deadlineAt = options.deadlineAt ?? now() + Math.max(1, options.packOperationDeadlineMs ?? DEFAULT_PACK_OPERATION_DEADLINE_MS);\n const packOptions = { ...options, deadlineAt };\n let packPayload: unknown;\n try {\n packPayload = await getWithRetry(\n (signal) => getWithOptionalSignal<unknown>(api, `/packs/${encodeURIComponent(packId)}`, signal),\n packOptions,\n \"pack\"\n );\n } catch (error) {\n if (error instanceof PackOperationDeadlineExceededError) {\n return packUnavailableResult(packId, \"pack_operation_deadline_exceeded\");\n }\n throw error;\n }\n const packMembers = extractPackMembers(packPayload);\n if (packMembers === null) return packUnavailableResult(packId, \"pack_payload_malformed\");\n if (packMembers.length === 0) return packUnavailableResult(packId, \"pack_orders_empty\");\n\n const maxConcurrency = Math.max(1, Math.floor(options.maxConcurrency ?? 4));\n const members: MercadoLibrePackMemberBillingInfoResult[] = packMembers.map((member) => {\n if (\"memberIndex\" in member) {\n return { memberIndex: member.memberIndex, accessible: false, failureReason: \"invalid_member\" };\n }\n return { orderId: member.orderId, accessible: false, failureReason: \"request_failed\" };\n });\n const validMembers = members.filter((member): member is Extract<MercadoLibrePackMemberBillingInfoResult, { orderId: string }> =>\n \"orderId\" in member\n );\n let nextMemberIndex = 0;\n await Promise.all(\n Array.from({ length: Math.min(maxConcurrency, validMembers.length) }, async () => {\n while (nextMemberIndex < validMembers.length) {\n const member = validMembers[nextMemberIndex++];\n if (now() >= deadlineAt) {\n Object.assign(member, { accessible: false, failureReason: \"operation_deadline_exceeded\" });\n delete (member as Partial<{ result: MercadoLibreOrderBillingInfoResult }>).result;\n continue;\n }\n try {\n Object.assign(member, { accessible: true, result: await getMercadoLibreOrderBillingInfo(profileId, member.orderId, packOptions) });\n } catch (error) {\n Object.assign(member, {\n accessible: false,\n failureReason: getMemberFailureReason(error),\n ...getSafeRetryDiagnostics(error),\n });\n delete (member as Partial<{ result: MercadoLibreOrderBillingInfoResult }>).result;\n }\n }\n })\n );\n\n const accessibleCount = members.filter((member) => member.accessible).length;\n const availableCount = members.filter((member) => member.accessible && member.result.available).length;\n const unavailableCount = members.filter((member) => member.accessible && !member.result.available).length;\n const failedCount = members.length - accessibleCount;\n const invalidMemberCount = members.filter((member) => \"memberIndex\" in member).length;\n const deadlineExceeded = members.some(\n (member) => !member.accessible && member.failureReason === \"operation_deadline_exceeded\"\n );\n const partialCoverage = availableCount !== members.length;\n\n return {\n resolutionKind: \"pack\",\n packId,\n members,\n metadata: {\n memberCount: members.length,\n validMemberCount: validMembers.length,\n invalidMemberCount,\n accessibleCount,\n availableCount,\n unavailableCount,\n failedCount,\n partialCoverage,\n deadlineExceeded,\n recoveryGuidance: deadlineExceeded\n ? \"The pack operation deadline expired before all members could be resolved; retry the same sale reference.\"\n : partialCoverage\n ? \"Retry failed member orders with the same sale reference after resolving MercadoLibre access or upstream availability.\"\n : \"All visible pack member orders returned complete fiscal data.\",\n },\n };\n}\n\n/** Resolves an explicit sale reference without guessing whether it is an order or pack. */\nexport async function getMercadoLibreSaleBillingInfo(\n profileId: string,\n saleReference: string,\n options: MercadoLibreOrderBillingInfoOptions = {}\n): Promise<MercadoLibreSaleBillingInfoResult> {\n const now = options.now ?? Date.now;\n const deadlineAt = options.deadlineAt ?? now() + Math.max(1, options.packOperationDeadlineMs ?? DEFAULT_PACK_OPERATION_DEADLINE_MS);\n const featureOptions = { ...options, deadlineAt };\n\n try {\n return {\n resolutionKind: \"order\",\n orderId: saleReference,\n result: await getMercadoLibreOrderBillingInfo(profileId, saleReference, featureOptions),\n };\n } catch (error) {\n if (error instanceof PackOperationDeadlineExceededError) {\n throw error;\n }\n if (!isOrderNotFound(error)) throw error;\n return getMercadoLibrePackBillingInfo(profileId, saleReference, featureOptions);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["retryAfterMs"]
|
|
7
|
+
}
|
|
@@ -14,8 +14,8 @@ function orderSearchParams(params) {
|
|
|
14
14
|
limit: params.limit ?? 50
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
async function fetchOrder(api, orderId) {
|
|
18
|
-
const response = await api.get(`/orders/${orderId}`);
|
|
17
|
+
async function fetchOrder(api, orderId, options = {}) {
|
|
18
|
+
const response = Object.keys(options).length > 0 ? await api.get(`/orders/${orderId}`, options) : await api.get(`/orders/${orderId}`);
|
|
19
19
|
return response.data;
|
|
20
20
|
}
|
|
21
21
|
async function fetchOrdersPage(api, params) {
|
|
@@ -38,22 +38,22 @@ async function searchMercadoLibreOrdersBatch(profileId, params, offsets, options
|
|
|
38
38
|
options
|
|
39
39
|
);
|
|
40
40
|
}
|
|
41
|
-
async function getMercadoLibreOrder(profileId, orderId) {
|
|
41
|
+
async function getMercadoLibreOrder(profileId, orderId, options = {}) {
|
|
42
42
|
const { api } = await getMercadoLibreApiContext(profileId);
|
|
43
|
-
return fetchOrder(api, orderId);
|
|
43
|
+
return fetchOrder(api, orderId, options);
|
|
44
44
|
}
|
|
45
45
|
async function getMercadoLibreOrderDetailsBatch(profileId, orderIds, options = {}) {
|
|
46
46
|
const { api } = await getMercadoLibreApiContext(profileId);
|
|
47
47
|
return runMercadoLibreBatch(orderIds, (orderId) => fetchOrder(api, orderId), options);
|
|
48
48
|
}
|
|
49
|
-
async function getMercadoLibreOrderShipments(profileId, orderId) {
|
|
49
|
+
async function getMercadoLibreOrderShipments(profileId, orderId, options = {}) {
|
|
50
50
|
const { api } = await getMercadoLibreApiContext(profileId);
|
|
51
|
-
const response = await api.get(`/orders/${orderId}/shipments`);
|
|
51
|
+
const response = Object.keys(options).length > 0 ? await api.get(`/orders/${orderId}/shipments`, options) : await api.get(`/orders/${orderId}/shipments`);
|
|
52
52
|
return response.data;
|
|
53
53
|
}
|
|
54
|
-
async function getMercadoLibreShipment(profileId, shipmentId) {
|
|
54
|
+
async function getMercadoLibreShipment(profileId, shipmentId, options = {}) {
|
|
55
55
|
const { api } = await getMercadoLibreApiContext(profileId);
|
|
56
|
-
const response = await api.get(`/shipments/${shipmentId}`);
|
|
56
|
+
const response = Object.keys(options).length > 0 ? await api.get(`/shipments/${shipmentId}`, options) : await api.get(`/shipments/${shipmentId}`);
|
|
57
57
|
return response.data;
|
|
58
58
|
}
|
|
59
59
|
async function getMercadoLibreShipmentBatch(profileId, shipmentIds, options = {}) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/mercadolibre/mercadolibre-orders.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport {\n getMercadoLibreApiContext,\n runMercadoLibreBatch,\n type MercadoLibreDocumentsBatchResult,\n type MercadoLibreBatchFetchOptions,\n} from \"./mercadolibre-api.js\";\n\nexport interface MercadoLibreOrdersSearchParams {\n seller: string;\n from: string;\n to: string;\n status?: string;\n q?: string;\n sort?: string;\n offset?: number;\n limit?: number;\n}\n\nfunction orderSearchParams(params: MercadoLibreOrdersSearchParams) {\n return {\n seller: params.seller,\n \"order.date_created.from\": `${params.from}T00:00:00.000-00:00`,\n \"order.date_created.to\": `${params.to}T23:59:59.999-00:00`,\n \"order.status\": params.status,\n q: params.q,\n sort: params.sort,\n offset: params.offset ?? 0,\n limit: params.limit ?? 50,\n };\n}\n\nasync function fetchOrder(api: AxiosInstance
|
|
5
|
-
"mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;
|
|
4
|
+
"sourcesContent": ["import type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nimport {\n getMercadoLibreApiContext,\n runMercadoLibreBatch,\n type MercadoLibreDocumentsBatchResult,\n type MercadoLibreBatchFetchOptions,\n} from \"./mercadolibre-api.js\";\n\nexport interface MercadoLibreOrdersSearchParams {\n seller: string;\n from: string;\n to: string;\n status?: string;\n q?: string;\n sort?: string;\n offset?: number;\n limit?: number;\n}\n\nexport interface MercadoLibreRequestOptions {\n signal?: AbortSignal;\n headers?: AxiosRequestConfig[\"headers\"];\n}\n\nfunction orderSearchParams(params: MercadoLibreOrdersSearchParams) {\n return {\n seller: params.seller,\n \"order.date_created.from\": `${params.from}T00:00:00.000-00:00`,\n \"order.date_created.to\": `${params.to}T23:59:59.999-00:00`,\n \"order.status\": params.status,\n q: params.q,\n sort: params.sort,\n offset: params.offset ?? 0,\n limit: params.limit ?? 50,\n };\n}\n\nasync function fetchOrder(\n api: AxiosInstance,\n orderId: string,\n options: MercadoLibreRequestOptions = {}\n): Promise<Record<string, unknown>> {\n const response = Object.keys(options).length > 0\n ? await api.get<Record<string, unknown>>(`/orders/${orderId}`, options)\n : await api.get<Record<string, unknown>>(`/orders/${orderId}`);\n return response.data;\n}\n\nasync function fetchOrdersPage(\n api: AxiosInstance,\n params: MercadoLibreOrdersSearchParams\n): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(\"/orders/search\", {\n params: orderSearchParams(params),\n });\n return response.data;\n}\n\nexport async function searchMercadoLibreOrders(\n profileId: string,\n params: MercadoLibreOrdersSearchParams\n) {\n const { api, sellerId } = await getMercadoLibreApiContext(profileId);\n return fetchOrdersPage(api, { ...params, seller: params.seller || sellerId });\n}\n\nexport async function searchMercadoLibreOrdersBatch(\n profileId: string,\n params: MercadoLibreOrdersSearchParams,\n offsets: number[],\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentsBatchResult<Record<string, unknown>>> {\n const { api, sellerId } = await getMercadoLibreApiContext(profileId);\n const seller = params.seller || sellerId;\n const offsetIds = offsets.map((offset) => String(offset));\n\n return runMercadoLibreBatch(\n offsetIds,\n (offsetId) => fetchOrdersPage(api, { ...params, seller, offset: Number(offsetId) }),\n options\n );\n}\n\nexport async function getMercadoLibreOrder(\n profileId: string,\n orderId: string,\n options: MercadoLibreRequestOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return fetchOrder(api, orderId, options);\n}\n\nexport async function getMercadoLibreOrderDetailsBatch(\n profileId: string,\n orderIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return runMercadoLibreBatch(orderIds, (orderId) => fetchOrder(api, orderId), options);\n}\n\nexport async function getMercadoLibreOrderShipments(\n profileId: string,\n orderId: string,\n options: MercadoLibreRequestOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = Object.keys(options).length > 0\n ? await api.get<Record<string, unknown>>(`/orders/${orderId}/shipments`, options)\n : await api.get<Record<string, unknown>>(`/orders/${orderId}/shipments`);\n return response.data;\n}\n\nexport async function getMercadoLibreShipment(\n profileId: string,\n shipmentId: string,\n options: MercadoLibreRequestOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = Object.keys(options).length > 0\n ? await api.get<Record<string, unknown>>(`/shipments/${shipmentId}`, options)\n : await api.get<Record<string, unknown>>(`/shipments/${shipmentId}`);\n return response.data;\n}\n\nexport async function getMercadoLibreShipmentBatch(\n profileId: string,\n shipmentIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return runMercadoLibreBatch(\n shipmentIds,\n (shipmentId) => api.get<Record<string, unknown>>(`/shipments/${shipmentId}`).then((response) => response.data),\n options\n );\n}\n\nexport async function getMercadoLibreShipmentItems(profileId: string, shipmentId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/shipments/${shipmentId}/items`);\n return response.data;\n}\n\nexport async function getMercadoLibreShipmentCosts(profileId: string, shipmentId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/shipments/${shipmentId}/costs`);\n return response.data;\n}\n\nexport async function getMercadoLibreShipmentCostsBatch(\n profileId: string,\n shipmentIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return runMercadoLibreBatch(\n shipmentIds,\n (shipmentId) =>\n api.get<Record<string, unknown>>(`/shipments/${shipmentId}/costs`).then((response) => response.data),\n options\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMercadoLibreApiContext,
|
|
3
|
+
runMercadoLibreBatch
|
|
4
|
+
} from "./mercadolibre-api.js";
|
|
5
|
+
async function fetchPack(api, packId) {
|
|
6
|
+
const response = await api.get(`/packs/${packId}`);
|
|
7
|
+
return response.data;
|
|
8
|
+
}
|
|
9
|
+
async function getMercadoLibrePack(profileId, packId) {
|
|
10
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
11
|
+
return fetchPack(api, packId);
|
|
12
|
+
}
|
|
13
|
+
async function getMercadoLibrePackBatch(profileId, packIds, options = {}) {
|
|
14
|
+
const { api } = await getMercadoLibreApiContext(profileId);
|
|
15
|
+
return runMercadoLibreBatch(packIds, (packId) => fetchPack(api, packId), options);
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
getMercadoLibrePack,
|
|
19
|
+
getMercadoLibrePackBatch
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=mercadolibre-packs.js.map
|