delete/create api
This commit is contained in:
@@ -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,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user