itemLookUp complete and addItem endpoint

This commit is contained in:
2024-03-21 15:18:06 -05:00
parent ab2b011580
commit 191164f4cc
7 changed files with 162 additions and 4 deletions

View File

@@ -1,9 +1,9 @@
import fetch from "node-fetch";
import fetchEbayToken from "../utils/fetchEbayToken.js"; // Adjust the import path according to your project structure
import fetchEbayReadToken from "../utils/fetchEbayReadToken.js"; // Adjust the import path according to your project structure
export const itemLookup = async (req, res) => {
const productCode = req.query.productCode;
const oauthToken = await fetchEbayToken();
const oauthToken = await fetchEbayReadToken();
console.log(productCode);
try {
const response = await fetch(

View File

@@ -0,0 +1,44 @@
// inventoryController.js
import buildAddItemRequestXML from "../utils/buildAddItemRequestXML.js";
import fetch from "node-fetch";
import fetchEbayUserToken from "../utils/fetchEbayUserToken.js"; // Adjust the import path according to your project structure
export const addItem = async (req, res) => {
const itemDetails = req.body; // Assuming item details are sent in the request body
itemDetails.userToken = await fetchEbayUserToken(); // Fetch and add the user token to itemDetails
const xmlRequest = buildAddItemRequestXML(itemDetails);
try {
const response = await fetch("https://api.ebay.com/ws/api.dll", {
method: "POST",
headers: {
"Content-Type": "text/xml",
"X-EBAY-API-SITEID": "0",
"X-EBAY-API-CALL-NAME": "AddItem",
"X-EBAY-API-COMPATIBILITY-LEVEL": "967", // Ensure this is the current compatibility level
"X-EBAY-API-APP-NAME": process.env.EBAY_CLIENT_ID,
"X-EBAY-API-DEV-NAME": process.env.EBAY_DEV_ID,
"X-EBAY-API-CERT-NAME": process.env.EBAY_CLIENT_SECRET,
},
body: xmlRequest,
});
if (!response.ok) {
throw new Error(`eBay API responded with status ${response.status}`);
}
const responseData = await response.text();
// Parse the XML response and handle it appropriately
// You might need an XML parser here to handle the response
res.json({ success: true, data: responseData }); // Send back a success response
} catch (error) {
console.error("Error adding item to eBay:", error);
res.status(500).json({
success: false,
message: "Failed to add item to eBay",
error: error.message,
});
}
};

View File

@@ -0,0 +1,12 @@
// routes/dataRoutes.js
import express from "express";
import { addItem } from "../controllers/inventoryController.js"; // Adjust the import path according to your project structure
const router = express.Router();
// Use the itemLookup function from dataController for the GET request to '/item-lookup'
router.get("/add-item", addItem);
// You can add more data-related routes here in the future
export default router;

View File

@@ -3,6 +3,7 @@ import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import dataRoutes from "./routes/dataRoutes.js";
import inventoryRoutes from "./routes/inventoryRoutes.js";
dotenv.config();
@@ -13,6 +14,7 @@ app.use(express.json());
// Use the itemLookupRoute with a base path, e.g., '/api'
app.use("/api/data", dataRoutes);
app.use("/api/inventory", inventoryRoutes);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

View File

@@ -0,0 +1,58 @@
const buildAddItemRequestXML = (itemDetails) => {
// Constructing the XML payload using template literals
return `<?xml version="1.0" encoding="utf-8"?>
<AddItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<RequesterCredentials>
<eBayAuthToken>${itemDetails.userToken}</eBayAuthToken>
</RequesterCredentials>
<Item>
<Title>${itemDetails.title}</Title>
<Description><![CDATA[${itemDetails.description}]]></Description>
<PrimaryCategory>
<CategoryID>${itemDetails.categoryID}</CategoryID>
</PrimaryCategory>
<StartPrice>${itemDetails.startPrice}</StartPrice>
<ConditionID>${itemDetails.conditionID}</ConditionID>
<Country>${itemDetails.country}</Country>
<Currency>${itemDetails.currency}</Currency>
<DispatchTimeMax>${itemDetails.dispatchTimeMax}</DispatchTimeMax>
<ListingDuration>${itemDetails.listingDuration}</ListingDuration>
<ListingType>${itemDetails.listingType}</ListingType>
<PaymentMethods>${itemDetails.paymentMethods}</PaymentMethods>
<PayPalEmailAddress>${itemDetails.payPalEmailAddress}</PayPalEmailAddress>
<PictureDetails>
${itemDetails.imageURLs
.map((url) => `<PictureURL>${url}</PictureURL>`)
.join("")}
</PictureDetails>
<PostalCode>${itemDetails.postalCode}</PostalCode>
<Quantity>${itemDetails.quantity}</Quantity>
<ReturnPolicy>
<ReturnsAcceptedOption>${
itemDetails.returnsAcceptedOption
}</ReturnsAcceptedOption>
<RefundOption>${itemDetails.refundOption}</RefundOption>
<ReturnsWithinOption>${
itemDetails.returnsWithinOption
}</ReturnsWithinOption>
<Description>${itemDetails.returnPolicyDescription}</Description>
<ShippingCostPaidByOption>${
itemDetails.shippingCostPaidByOption
}</ShippingCostPaidByOption>
</ReturnPolicy>
<ShippingDetails>
<ShippingType>${itemDetails.shippingType}</ShippingType>
<ShippingServiceOptions>
<ShippingServicePriority>1</ShippingServicePriority>
<ShippingService>${itemDetails.shippingService}</ShippingService>
<ShippingServiceCost>${
itemDetails.shippingServiceCost
}</ShippingServiceCost>
</ShippingServiceOptions>
</ShippingDetails>
<Site>${itemDetails.site}</Site>
</Item>
</AddItemRequest>`;
};
export default buildAddItemRequestXML;

View File

@@ -1,6 +1,7 @@
// Need to figoure out expiration and make sure to cycle this appropriately to avoid unnecessary calls
import fetch from "node-fetch";
const fetchEbayToken = async () => {
const fetchEbayReadToken = async () => {
const ebayClientId = process.env.EBAY_CLIENT_ID;
const ebayClientSecret = process.env.EBAY_CLIENT_SECRET;
const credentials = Buffer.from(
@@ -35,4 +36,4 @@ const fetchEbayToken = async () => {
}
};
export default fetchEbayToken;
export default fetchEbayReadToken;

View File

@@ -0,0 +1,41 @@
import fetch from "node-fetch";
const fetchEbayUserToken = async (authorizationCode) => {
const clientId = process.env.EBAY_CLIENT_ID;
const clientSecret = process.env.EBAY_CLIENT_SECRET;
const redirectUri = process.env.EBAY_REDIRECT_URI; // Make sure this matches the URI registered with eBay
const credentials = Buffer.from(`${clientId}:${clientSecret}`).toString(
"base64"
);
try {
const response = await fetch(
"https://api.ebay.com/identity/v1/oauth2/token",
{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: `Basic ${credentials}`,
},
body: `grant_type=authorization_code&code=${authorizationCode}&redirect_uri=${encodeURIComponent(
redirectUri
)}`,
}
);
if (!response.ok) {
const errorBody = await response.text();
throw new Error(
`Failed to fetch eBay user token: ${response.status} ${response.statusText} - ${errorBody}`
);
}
const data = await response.json();
return data.access_token; // This is the User access token
} catch (error) {
console.error("Error fetching eBay user token:", error);
throw error;
}
};
export default fetchEbayUserToken;