diff --git a/src/sections/fulfillment-inbound-shipment.ts b/src/sections/fulfillment-inbound-shipment.ts index 724349f4..1ba230a4 100644 --- a/src/sections/fulfillment-inbound-shipment.ts +++ b/src/sections/fulfillment-inbound-shipment.ts @@ -32,9 +32,14 @@ const SKUInboundGuidance = Codec.interface({ GuidanceReasonList: optional(ensureArray('GuidanceReason', GuidanceReason)), }) +const InvalidSKU = Codec.interface({ + SellerSKU: string, + ErrorReason: string, +}) + const GetInboundGuidanceForSKU = Codec.interface({ SKUInboundGuidanceList: ensureArray('SKUInboundGuidance', SKUInboundGuidance), - InvalidSKUList: optional(string), + InvalidSKUList: optional(ensureArray('InvalidSKU', InvalidSKU)), }) type GetInboundGuidanceForSKU = GetInterface @@ -45,9 +50,59 @@ const GetInboundGuidanceForSKUResponse = Codec.interface({ }), }) +const InvalidASIN = Codec.interface({ + ASIN: string, + ErrorReason: string, +}) + +const ASINInboundGuidance = Codec.interface({ + ASIN: string, + InboundGuidance, + GuidanceReasonList: optional(ensureArray('GuidanceReason', GuidanceReason)), +}) + +const GetInboundGuidanceForASIN = Codec.interface({ + ASINInboundGuidanceList: ensureArray('ASINInboundGuidance', ASINInboundGuidance), + InvalidASINList: ensureArray('InvalidASIN', InvalidASIN), +}) + +type GetInboundGuidanceForASIN = GetInterface + +const GetInboundGuidanceForASINResponse = Codec.interface({ + GetInboundGuidanceForASINResponse: Codec.interface({ + GetInboundGuidanceForASINResult: GetInboundGuidanceForASIN, + }), +}) + +interface GetInboundGuidanceForASINParameters { + ASINList: string[] + MarketplaceId: string +} + export class FulfillmentInboundShipment { constructor(private httpClient: HttpClient) {} + async getInboundGuidanceForAsin( + parameters: GetInboundGuidanceForASINParameters, + ): Promise<[GetInboundGuidanceForASIN, RequestMeta]> { + const [response, meta] = await this.httpClient.request('POST', { + resource: Resource.FulfillmentInboundShipment, + version: FULFILLMENT_INBOUND_SHIPMENT_API_VERSION, + action: 'GetInboundGuidanceForASIN', + parameters: { + 'ASINList.Id': parameters.ASINList, + MarketplaceId: parameters.MarketplaceId, + }, + }) + + return GetInboundGuidanceForASINResponse.decode(response).caseOf({ + Right: (x) => [x.GetInboundGuidanceForASINResponse.GetInboundGuidanceForASINResult, meta], + Left: (error) => { + throw new ParsingError(error) + }, + }) + } + async getInboundGuidanceForSku( parameters: GetInboundGuidanceForSKUParameters, ): Promise<[GetInboundGuidanceForSKU, RequestMeta]> { diff --git a/test/unit/__snapshots__/fulfillment-inbound-shipment.test.ts.snap b/test/unit/__snapshots__/fulfillment-inbound-shipment.test.ts.snap index 024bc4cc..3e1e9db0 100644 --- a/test/unit/__snapshots__/fulfillment-inbound-shipment.test.ts.snap +++ b/test/unit/__snapshots__/fulfillment-inbound-shipment.test.ts.snap @@ -1,9 +1,33 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`fulfillmentInboundShipment getInboundGuidanceForAsin returns sku inbound guidance list if succesful 1`] = ` +Array [ + Object { + "ASINInboundGuidanceList": Array [ + Object { + "ASIN": "B00005N5PF", + "GuidanceReasonList": Array [ + "SlowMovingASIN", + ], + "InboundGuidance": "InboundNotRecommended", + }, + ], + "InvalidASINList": Array [], + }, + Object { + "quotaMax": 1000, + "quotaRemaining": 999, + "quotaResetOn": 2020-04-06T10:22:23.582Z, + "requestId": "0", + "timestamp": 2020-05-06T09:22:23.582Z, + }, +] +`; + exports[`fulfillmentInboundShipment getInboundGuidanceForSku returns sku inbound guidance list if succesful 1`] = ` Array [ Object { - "InvalidSKUList": "", + "InvalidSKUList": Array [], "SKUInboundGuidanceList": Array [ Object { "ASIN": "B00005N5PF",