1 Commits

Author SHA1 Message Date
0648dcb96c Added .env file support more directly 2024-03-23 00:14:31 -05:00
10 changed files with 48 additions and 74 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
.env
**/node_modules/
package-lock.json
*.swp
.prettyrc
.vscode

1
api/.gitignore vendored
View File

@@ -1 +0,0 @@
.env

View File

@@ -1,18 +1,10 @@
import fetch from "node-fetch"; import fetch from "node-fetch";
import fetchEbayReadToken from "../utils/fetchEbayReadToken.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
import { LoggingLevel, smartLogging } from "../utils/helper.js";
export const itemLookup = async (req, res) => { export const itemLookup = async (req, res) => {
smartLogging(LoggingLevel.Debug, `dataController.itemLookup()`);
const productCode = req.query.productCode; const productCode = req.query.productCode;
let oauthToken; const oauthToken = await fetchEbayReadToken();
try{ console.log(productCode);
oauthToken = await fetchEbayReadToken();
}catch(e){
smartLogging(LoggingLevel.Error, `Error Getting eBay Token: ${e}`);
}
smartLogging(LoggingLevel.Logging, `Product Code: ${productCode}`);
try { try {
const response = await fetch( const response = await fetch(
`https://api.ebay.com/buy/browse/v1/item_summary/search?gtin=${productCode}`, `https://api.ebay.com/buy/browse/v1/item_summary/search?gtin=${productCode}`,
@@ -36,7 +28,7 @@ export const itemLookup = async (req, res) => {
res.status(200).send(price); res.status(200).send(price);
} catch (error) { } catch (error) {
smartLogging(LoggingLevel.Error, `Error fetching data from eBay Browse API: ${error}`); console.error("Error fetching data from eBay Browse API:", error);
res.status(500).send("Internal Server Error"); res.status(500).send("Internal Server Error");
} }
}; };

View File

@@ -2,14 +2,12 @@
import buildAddFixedPriceItemRequestXML from "../utils/buildAddFixedPriceItemRequestXML.js"; import buildAddFixedPriceItemRequestXML from "../utils/buildAddFixedPriceItemRequestXML.js";
import fetch from "node-fetch"; import fetch from "node-fetch";
import fetchEbayUserToken from "../utils/fetchEbayUserToken.js"; // Adjust the import path according to your project structure import fetchEbayUserToken from "../utils/fetchEbayUserToken.js"; // Adjust the import path according to your project structure
import { LoggingLevel, smartLogging } from "../utils/helper.js";
export const addItem = async (req, res) => { export const addItem = async (req, res) => {
smartLogging(LoggingLevel.AppTrace, `inventoryController.addItem`);
const itemDetails = req.body; // Assuming item details are sent in the request body const itemDetails = req.body; // Assuming item details are sent in the request body
itemDetails.userToken = itemDetails.userToken =
"v^1.1#i^1#r^0#I^3#f^0#p^3#t^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"; "v^1.1#i^1#r^0#I^3#f^0#p^3#t^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";
smartLogging(LoggingLevel.Logging, `${itemDetails}`); console.log(itemDetails);
const xmlRequest = buildAddFixedPriceItemRequestXML(itemDetails); const xmlRequest = buildAddFixedPriceItemRequestXML(itemDetails);
try { try {
@@ -37,7 +35,7 @@ export const addItem = async (req, res) => {
res.json({ success: true, data: responseData }); // Send back a success response res.json({ success: true, data: responseData }); // Send back a success response
} catch (error) { } catch (error) {
smartLogging(LoggingLevel.Error,`Error adding item to eBay: ${error}); console.error("Error adding item to eBay:", error);
res.status(500).json({ res.status(500).json({
success: false, success: false,
message: "Failed to add item to eBay", message: "Failed to add item to eBay",

View File

@@ -4,7 +4,6 @@ import cors from "cors";
import dotenv from "dotenv"; import dotenv from "dotenv";
import dataRoutes from "./routes/dataRoutes.js"; import dataRoutes from "./routes/dataRoutes.js";
import inventoryRoutes from "./routes/inventoryRoutes.js"; import inventoryRoutes from "./routes/inventoryRoutes.js";
import { LoggingLevel, setLevel, smartLogging } from "./utils/helper.js";
dotenv.config(); dotenv.config();
@@ -17,7 +16,18 @@ app.use(express.json());
app.use("/api/data", dataRoutes); app.use("/api/data", dataRoutes);
app.use("/api/inventory", inventoryRoutes); app.use("/api/inventory", inventoryRoutes);
//Set Logging Level
setLevel(LoggingLevel.AppTrace); //This should get passed in from the Docker-Compose.
const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;
app.listen(PORT, () => smartLogging(LoggingLevel.Logging, `Server running on port ${PORT}`)); app.listen(PORT, () => {
console.log(`Environment: \n\n
${JSON.stringify(process.env)}`);
console.log(`Server running on port ${PORT}`); //These will both get updated to smartLogging later
console.log(`System Settings: \n
port = ${process.env.PORT} \n
debug = ${process.env.DEBUG} \n
dotenv_key = ${process.env.DOTENV_KEY} \n
ebay_client_id = ${process.env.EBAY_CLIENT_ID} \n
ebay_client_secret = ${process.env.EBAY_CLIENT_SECRET} \n
ebay_dev_id = ${process.env.EBAY_DEV_ID} \n
ebay_redirect_uri = ${process.env.EBAY_REDIRECT_URI} \n
`);
});

View File

@@ -1,9 +1,7 @@
// Need to figoure out expiration and make sure to cycle this appropriately to avoid unnecessary calls // Need to figoure out expiration and make sure to cycle this appropriately to avoid unnecessary calls
import fetch from "node-fetch"; import fetch from "node-fetch";
import { LoggingLevel, smartLogging } from "./helper.js";
const fetchEbayReadToken = async () => { const fetchEbayReadToken = async () => {
smartLogging(LoggingLevel.AppTrace, `fetchEbayReadToken`);
const ebayClientId = process.env.EBAY_CLIENT_ID; const ebayClientId = process.env.EBAY_CLIENT_ID;
const ebayClientSecret = process.env.EBAY_CLIENT_SECRET; const ebayClientSecret = process.env.EBAY_CLIENT_SECRET;
const credentials = Buffer.from( const credentials = Buffer.from(
@@ -11,7 +9,6 @@ const fetchEbayReadToken = async () => {
).toString("base64"); ).toString("base64");
try { try {
smartLogging(LoggingLevel.Debug, `Fetching Token from eBay`);
const response = await fetch( const response = await fetch(
"https://api.ebay.com/identity/v1/oauth2/token", "https://api.ebay.com/identity/v1/oauth2/token",
{ {
@@ -34,7 +31,7 @@ const fetchEbayReadToken = async () => {
const data = await response.json(); const data = await response.json();
return data.access_token; return data.access_token;
} catch (error) { } catch (error) {
smartLogging(LoggingLevel.Error, `Error fetching eBay OAuth token: ${error}`); console.error("Error fetching eBay OAuth token:", error);
throw error; // Throw the error to be handled by the caller throw error; // Throw the error to be handled by the caller
} }
}; };

View File

@@ -1,8 +1,6 @@
import fetch from "node-fetch"; import fetch from "node-fetch";
import { LoggingLevel, smartLogging } from "./helper.js";
const fetchEbayUserToken = async (authorizationCode) => { const fetchEbayUserToken = async (authorizationCode) => {
smartLogging(LoggingLevel.AppTrace, `fetchEbayUserToken`);
const clientId = process.env.EBAY_CLIENT_ID; const clientId = process.env.EBAY_CLIENT_ID;
const clientSecret = process.env.EBAY_CLIENT_SECRET; const clientSecret = process.env.EBAY_CLIENT_SECRET;
const redirectUri = process.env.EBAY_REDIRECT_URI; // Make sure this matches the URI registered with eBay const redirectUri = process.env.EBAY_REDIRECT_URI; // Make sure this matches the URI registered with eBay
@@ -35,7 +33,7 @@ const fetchEbayUserToken = async (authorizationCode) => {
const data = await response.json(); const data = await response.json();
return data.access_token; // This is the User access token return data.access_token; // This is the User access token
} catch (error) { } catch (error) {
smartLogging(LoggingLevel.Error,`Error fetching eBay user token: ${JSON.stringify(error)}`); console.error("Error fetching eBay user token:", error);
throw error; throw error;
} }
}; };

View File

@@ -1,46 +0,0 @@
export let setlvl = undefined;
export function setLevel(level){
console.log(`Setting logging level to: ${level}`);
setlvl = level;
}
export function smartLogging(level, msg){
if(setlvl == undefined){ //If no level is set treat it as console.log()
console.log(msg);
}else if(level <= setlvl){
switch (level) {
case LoggingLevel.Error:
console.error(msg);
break;
case LoggingLevel.Warning:
console.warn(msg);
break;
case LoggingLevel.Logging:
console.log(msg);
break;
case LoggingLevel.Debug:
console.debug(msg);
case LoggingLevel.AppTrace:
console.debug(msg);
break;
case LoggingLevel.Trace:
console.trace(msg);
break;
default:
console.log(msg);
}
}
}
export const LoggingLevel = {
Error: "10",
Warning: "9",
Logging: "8",
Debug: "7",
AppTrace: "6",
Trace: "5"
}

View File

@@ -2,8 +2,17 @@ version: "3.8"
services: services:
api: api:
build: ./api build: ./api
container_name: eBayAPI
ports: ports:
- "3000:3000" - "3000:3000"
env_file:
- .env
# environment:
# PORT: 8005
# DEBUG: "false"
# DOTENV_KEY: "DotKeyDC"
# EBAY_CLIENT_ID: "EbayClientIDDC"
# EBAY_CLIENT_SECRET: "EbayClientSecretDC"
# EBAY_DEV_ID: "EbayDevIDDC"
# EBAY_REDIRECT_URI: "EbayRedirectURIDC"
volumes: volumes:
- ./api:/usr/src/app # Mount the local ./api directory to /usr/src/app in the container - ./api:/usr/src/app # Mount the local ./api directory to /usr/src/app in the container

11
envSample Normal file
View File

@@ -0,0 +1,11 @@
PORT=8003
DEBUG=true
DOTENV_KEY=DotKey
EBAY_CLIENT_ID=EbayClientID
EBAY_CLIENT_SECRET=EbayClientSecret
EBAY_DEV_ID=EbayDevID
EBAY_REDIRECT_URI=EbayRedirectURI
#I'm not 100% on this, but I think the --env-file flag for docker containers should handle this. We just
#need to figure out how that gets consumed.