delete/create api

This commit is contained in:
2024-03-25 17:00:56 -05:00
parent 5b75f8bb9a
commit 7646ee0fc8
3 changed files with 255 additions and 78 deletions

View File

@@ -1,65 +1,205 @@
import fetch from "node-fetch";
import fetchEbayUserToken from "../utils/fetchEbayUserToken.js";
import fetchEbayUserToken from "../utils/fetchEbayUserToken.js";
export const addItem = async (req, res) => {
const itemDetails = req.body;
// must be called with req/res due to cookie access - cookie flow is inside fetchEbayUserToken()
const token = await fetchEbayUserToken(req, res)
export const createAndListItem = async (req, res) => {
const {
sku,
marketplaceId,
format,
availableQuantity,
categoryId,
condition,
listingDescription,
pricingSummary,
merchantLocationKey,
quantityLimitPerBuyer,
product, // Extract the entire product object
packageWeightAndSize, // Adjusted to packageWeightAndSize from the refined payload
imageUrls,
} = req.body;
// Constructing the payload for the Inventory API
const offerPayload = {
sku: itemDetails.sku,
marketplaceId: itemDetails.marketplaceId,
format: itemDetails.format,
listingDescription: itemDetails.listingDescription,
availableQuantity: itemDetails.availableQuantity,
categoryId: itemDetails.categoryId,
listingPolicies: {
paymentPolicyId: itemDetails.listingPolicies.paymentPolicyId,
fulfillmentPolicyId: itemDetails.listingPolicies.fulfillmentPolicyId,
returnPolicyId: itemDetails.listingPolicies.returnPolicyId,
},
pricingSummary: {
price: {
currency: itemDetails.pricingSummary.price.currency,
value: itemDetails.pricingSummary.price.value,
},
},
merchantLocationKey: itemDetails.merchantLocationKey,
quantityLimitPerBuyer: itemDetails.quantityLimitPerBuyer,
};
const token = await fetchEbayUserToken(req, res); // Get the eBay user token
let dynamicAspects = {};
for (const [key, value] of Object.entries(product.aspects)) {
dynamicAspects[key] = Array.isArray(value) ? value : [value];
}
try {
const response = await fetch(
"https://api.ebay.com/sell/inventory/v1/offer",
// Create the inventory item
const inventoryItemPayload = {
sku,
condition,
product: {
title: product.title.substring(0, 80), // Utilizing product title
brand: product.brand, // Using brand from the product object
description: product.description, // Using product description
imageUrls: product.imageUrls, // Using all imageUrls from product
aspects: dynamicAspects
},
availability: {
shipToLocationAvailability: {
quantity: availableQuantity,
},
},
// Package weight and dimensions, adjusted to the new structure
packageWeightAndSize: {
weight: {
value: parseFloat(packageWeightAndSize.weight.value),
unit: packageWeightAndSize.weight.unit,
},
dimensions: {
length: parseFloat(packageWeightAndSize.dimensions.length),
width: parseFloat(packageWeightAndSize.dimensions.width),
height: parseFloat(packageWeightAndSize.dimensions.height),
unit: packageWeightAndSize.dimensions.unit,
},
},
};
const createItemResponse = await fetch(
`https://api.ebay.com/sell/inventory/v1/inventory_item/${sku}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
"Content-Language": "en-US",
"Authorization": `Bearer ${token}`,
"Accept": "application/json",
},
body: JSON.stringify(inventoryItemPayload),
}
);
// Optionally, you can parse the response body if eBay's API returns useful information in it
const itemResponseData = await createItemResponse;
console.log(itemResponseData);
// 2. Create the offer for the inventory item
const offerPayload = {
sku,
marketplaceId,
format,
listing: {
categoryId,
listingDescription,
merchantLocationKey,
},
pricingSummary,
quantityLimitPerBuyer,
};
const offerResponse = await fetch(
`https://api.ebay.com/sell/inventory/v1/offer`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Content-Language": "en-US",
"Authorization": `Bearer ${token}`,
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(offerPayload),
}
);
console.log(response)
if (!response.ok) {
const errorBody = await response.text(); // Get the response body as text
console.error(`eBay API responded with status ${response.status}: ${errorBody}`);
throw new Error(`eBay API responded with status ${response.status}: ${errorBody}`);
}
if (!offerResponse.ok) {
// Handle error in creating the offer
const errorBody = await offerResponse.text();
throw new Error(
`Failed to create offer: ${offerResponse.status} - ${errorBody}`
);
}
const responseData = await response.json();
res.json({ success: true, data: responseData });
const offerData = await offerResponse.json();
const offerId = offerData.offerId;
// 3. Publish the offer to convert it into a live listing
await fetch(
`https://api.ebay.com/sell/inventory/v1/offer/${offerId}/publish/`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
}
);
res.json({ success: true, message: "Item listed successfully" });
} catch (error) {
console.error("Error adding item to eBay via Inventory API:", error);
console.log(error.message);
console.error("Error in createAndListItem endpoint:", error);
res.status(500).json({
success: false,
message: "Failed to add item to eBay via Inventory API",
message: "Failed to create and list item on eBay",
error: error.message,
});
}
};
export const deleteItemBySku = async (req, res) => {
const { sku } = req.params; // Assuming SKU is provided as a URL parameter
try {
const token = await fetchEbayUserToken(req, res); // Get the eBay user token
// Perform the deletion of the inventory item
const deleteResponse = await fetch(`https://api.ebay.com/sell/inventory/v1/inventory_item/${sku}`, {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
"Accept": "application/json",
},
});
if (!deleteResponse.ok) {
// Handle unsuccessful deletion
const errorBody = await deleteResponse.text();
throw new Error(`Failed to delete inventory item: ${deleteResponse.status} - ${errorBody}`);
}
// Successfully deleted the item
res.json({ success: true, message: `Item with SKU: ${sku} deleted successfully.` });
} catch (error) {
console.error("Error in deleteItemBySku endpoint:", error);
res.status(500).json({
success: false,
message: `Failed to delete item with SKU: ${sku} from eBay`,
error: error.message,
});
}
};
export const getAllInventory = async (req, res) => {
const limit = req.query.limit || '100'; // Set default limit
const offset = req.query.offset || '0'; // Set default offset
try {
const token = await fetchEbayUserToken(req, res); // Assuming fetchEbayUserToken doesn't need req, res passed and handles token internally
const response = await fetch(`https://api.ebay.com/sell/inventory/v1/inventory_item?limit=${limit}&offset=${offset}`, {
method: 'GET',
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${token}`,
"Accept-Language": "en-US",
},
});
if (!response.ok) {
// If the response is not okay, throw an error with status and statusText
throw new Error(`Failed to retrieve inventory items: ${response.status} ${response.statusText}`);
}
const inventoryItems = await response.json(); // Parsing the JSON body of the response
res.json(inventoryItems); // Sending the inventory items back to the client
} catch (error) {
console.error('Error fetching inventory:', error);
res.status(500).json({
error: 'Internal Server Error',
message: error.message,
});
}
};