feature/IO-3056-Enhanced-Lightbox-Logging

This commit is contained in:
Dave Richer
2024-12-12 13:12:47 -08:00
parent b3c948f0c7
commit 8cee795d70
2 changed files with 188 additions and 96 deletions

View File

@@ -119,13 +119,15 @@ const CardPaymentModalComponent = ({
} }
const iPayData = collectIPayFields(); const iPayData = collectIPayFields();
const { payments } = form.getFieldsValue();
try { try {
const response = await axios.post("/intellipay/lightbox_credentials", { const response = await axios.post("/intellipay/lightbox_credentials", {
bodyshop, bodyshop,
refresh: !!window.intellipay, refresh: !!window.intellipay,
paymentSplitMeta: form.getFieldsValue(), paymentSplitMeta: form.getFieldsValue(),
iPayData: iPayData iPayData: iPayData,
comment: btoa(JSON.stringify({ payments, userEmail: currentUser.email }))
}); });
if (window.intellipay) { if (window.intellipay) {

View File

@@ -1,4 +1,7 @@
const path = require("path"); const path = require("path");
require("dotenv").config({
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
});
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
const qs = require("query-string"); const qs = require("query-string");
@@ -8,9 +11,6 @@ const logger = require("../utils/logger");
const { sendTaskEmail } = require("../email/sendemail"); const { sendTaskEmail } = require("../email/sendemail");
const generateEmailTemplate = require("../email/generateTemplate"); const generateEmailTemplate = require("../email/generateTemplate");
const { getEndpoints } = require("../email/tasksEmails"); const { getEndpoints } = require("../email/tasksEmails");
require("dotenv").config({
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
});
const domain = process.env.NODE_ENV ? "secure" : "test"; const domain = process.env.NODE_ENV ? "secure" : "test";
@@ -50,17 +50,40 @@ const getShopCredentials = async (bodyshop) => {
} }
}; };
const decodeComment = (comment) => {
try {
return comment ? JSON.parse(Buffer.from(comment, "base64").toString()) : null;
} catch (error) {
return null; // Handle malformed base64 string gracefully
}
};
exports.lightbox_credentials = async (req, res) => { exports.lightbox_credentials = async (req, res) => {
logger.log("intellipay-lightbox-credentials", "DEBUG", req.user?.email, null, { const decodedComment = decodeComment(req.body?.comment);
iPayData: req.body.iPayData, const logMeta = {
bodyshop: req.body.bodyshop iPayData: req.body?.iPayData,
}); decodedComment,
bodyshop: {
id: req.body?.bodyshop?.id,
imexshopid: req.body?.bodyshop?.imexshopid,
name: req.body?.bodyshop?.shopname
}
};
logger.log("intellipay-lightbox-credentials", "DEBUG", req.user?.email, null, logMeta);
const shopCredentials = await getShopCredentials(req.body.bodyshop); const shopCredentials = await getShopCredentials(req.body.bodyshop);
if (shopCredentials.error) { if (shopCredentials.error) {
logger.log("intellipay-credentials-error", "ERROR", req.user?.email, null, { message: shopCredentials.error }); logger.log("intellipay-credentials-error", "ERROR", req.user?.email, null, {
res.json(shopCredentials); message: shopCredentials.error?.message,
...logMeta
});
res.json({
message: shopCredentials.error?.message,
type: "intellipay-credentials-error",
...logMeta
});
return; return;
} }
@@ -78,31 +101,53 @@ exports.lightbox_credentials = async (req, res) => {
const response = await axios(options); const response = await axios(options);
logger.log("intellipay-lightbox-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-lightbox-success", "DEBUG", req.user?.email, null, {
responseData: response.data, requestOptions: options,
requestOptions: options ...logMeta
}); });
res.send(response.data); res.send(response.data);
} catch (error) { } catch (error) {
logger.log("intellipay-lightbox-error", "ERROR", req.user?.email, null, { message: error.message }); logger.log("intellipay-lightbox-error", "ERROR", req.user?.email, null, {
res.json({ message: error.message }); message: error?.message,
...logMeta
});
res.json({
message: error?.message,
type: "intellipay-lightbox-error",
...logMeta
});
} }
}; };
exports.payment_refund = async (req, res) => { exports.payment_refund = async (req, res) => {
logger.log("intellipay-refund-request-received", "DEBUG", req.user?.email, null, { const decodedComment = decodeComment(req.body.iPayData?.comment);
bodyshop: req.body.bodyshop, const logResponseMeta = {
paymentid: req.body.paymentid, iPayData: req.body?.iPayData,
amount: req.body.amount bodyshop: {
}); id: req.body.bodyshop?.id,
imexshopid: req.body.bodyshop?.imexshopid,
name: req.body.bodyshop?.shopname
},
paymentid: req.body?.paymentid,
amount: req.body?.amount,
decodedComment
};
logger.log("intellipay-refund-request-received", "DEBUG", req.user?.email, null, logResponseMeta);
const shopCredentials = await getShopCredentials(req.body.bodyshop); const shopCredentials = await getShopCredentials(req.body.bodyshop);
if (shopCredentials.error) { if (shopCredentials.error) {
logger.log("intellipay-refund-credentials-error", "ERROR", req.user?.email, null, { logger.log("intellipay-refund-credentials-error", "ERROR", req.user?.email, null, {
credentialsError: shopCredentials.error credentialsError: shopCredentials.error,
...logResponseMeta
});
res.status(400).json({
credentialsError: shopCredentials.error,
type: "intellipay-refund-credentials-error",
...logResponseMeta
}); });
res.status(400).json({ error: shopCredentials.error });
return; return;
} }
@@ -120,45 +165,61 @@ exports.payment_refund = async (req, res) => {
}; };
logger.log("intellipay-refund-options-prepared", "DEBUG", req.user?.email, null, { logger.log("intellipay-refund-options-prepared", "DEBUG", req.user?.email, null, {
options requestOptions: options,
...logResponseMeta
}); });
const response = await axios(options); const response = await axios(options);
logger.log("intellipay-refund-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-refund-success", "DEBUG", req.user?.email, null, {
responseData: response.data requestOptions: options,
...logResponseMeta
}); });
res.send(response.data); res.send(response.data);
} catch (error) { } catch (error) {
logger.log("intellipay-refund-error", "ERROR", req.user?.email, null, { logger.log("intellipay-refund-error", "ERROR", req.user?.email, null, {
error: error.message, message: error?.message,
stack: error.stack, ...logResponseMeta
requestOptions: { });
paymentid: req.body.paymentid, res.status(500).json({
amount: req.body.amount message: error?.message,
} type: "intellipay-refund-error",
...logResponseMeta
}); });
res.status(500).json({ error: error.message });
} }
}; };
exports.generate_payment_url = async (req, res) => { exports.generate_payment_url = async (req, res) => {
logger.log("intellipay-generate-payment-url-received", "DEBUG", req.user?.email, null, { const decodedComment = decodeComment(req.body.comment);
bodyshop: req.body.bodyshop, const logResponseMeta = {
amount: req.body.amount, iPayData: req.body?.iPayData,
account: req.body.account, bodyshop: {
comment: req.body.comment, id: req.body.bodyshop?.id,
invoice: req.body.invoice imexshopid: req.body.bodyshop?.imexshopid,
}); name: req.body.bodyshop?.shopname
},
amount: req.body?.amount,
account: req.body?.account,
comment: req.body?.comment,
invoice: req.body?.invoice,
decodedComment
};
logger.log("intellipay-generate-payment-url-received", "DEBUG", req.user?.email, null, logResponseMeta);
const shopCredentials = await getShopCredentials(req.body.bodyshop); const shopCredentials = await getShopCredentials(req.body.bodyshop);
if (shopCredentials.error) { if (shopCredentials.error) {
logger.log("intellipay-generate-payment-url-credentials-error", "ERROR", req.user?.email, null, { logger.log("intellipay-generate-payment-url-credentials-error", "ERROR", req.user?.email, null, {
credentialsError: shopCredentials.error message: shopCredentials.error?.message,
...logResponseMeta
});
res.status(400).json({
message: shopCredentials.error?.message,
type: "intellipay-generate-payment-url-credentials-error",
...logResponseMeta
}); });
res.status(400).json({ error: shopCredentials.error });
return; return;
} }
@@ -178,41 +239,46 @@ exports.generate_payment_url = async (req, res) => {
}; };
logger.log("intellipay-generate-payment-url-options-prepared", "DEBUG", req.user?.email, null, { logger.log("intellipay-generate-payment-url-options-prepared", "DEBUG", req.user?.email, null, {
options requestOptions: options,
...logResponseMeta
}); });
const response = await axios(options); const response = await axios(options);
logger.log("intellipay-generate-payment-url-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-generate-payment-url-success", "DEBUG", req.user?.email, null, {
responseData: response.data requestOptions: options,
shortUrl: response.data?.shorturl,
...logResponseMeta
}); });
res.send(response.data); res.send(response.data);
} catch (error) { } catch (error) {
logger.log("intellipay-generate-payment-url-error", "ERROR", req.user?.email, null, { logger.log("intellipay-generate-payment-url-error", "ERROR", req.user?.email, null, {
error: error.message, message: error?.message,
stack: error.stack, ...logResponseMeta
requestOptions: {
amount: req.body.amount,
account: req.body.account,
comment: req.body.comment,
invoice: req.body.invoice
}
}); });
res.status(500).json({ error: error.message }); res.status(500).json({ message: error?.message, ...logResponseMeta });
} }
}; };
//Reference: https://intellipay.com/dist/webapi26.html#operation/fee //Reference: https://intellipay.com/dist/webapi26.html#operation/fee
exports.checkfee = async (req, res) => { exports.checkfee = async (req, res) => {
logger.log("intellipay-checkfee-request-received", "DEBUG", req.user?.email, null, { const logResponseMeta = {
bodyshop: req.body.bodyshop, bodyshop: {
amount: req.body.amount id: req.body?.bodyshop?.id,
}); imexshopid: req.body?.bodyshop?.imexshopid,
name: req.body?.bodyshop?.shopname,
state: req.body?.bodyshop?.state
},
amount: req.body?.amount
};
logger.log("intellipay-checkfee-request-received", "DEBUG", req.user?.email, null, logResponseMeta);
if (!req.body.amount || req.body.amount <= 0) { if (!req.body.amount || req.body.amount <= 0) {
logger.log("intellipay-checkfee-skip", "DEBUG", req.user?.email, null, { logger.log("intellipay-checkfee-skip", "DEBUG", req.user?.email, null, {
message: "Amount is zero or undefined, skipping fee check." message: "Amount is zero or undefined, skipping fee check.",
...logResponseMeta
}); });
res.json({ fee: 0 }); res.json({ fee: 0 });
return; return;
@@ -222,9 +288,10 @@ exports.checkfee = async (req, res) => {
if (shopCredentials.error) { if (shopCredentials.error) {
logger.log("intellipay-checkfee-credentials-error", "ERROR", req.user?.email, null, { logger.log("intellipay-checkfee-credentials-error", "ERROR", req.user?.email, null, {
credentialsError: shopCredentials.error message: shopCredentials.error?.message,
...logResponseMeta
}); });
res.status(400).json({ error: shopCredentials.error }); res.status(400).json({ error: shopCredentials.error?.message, ...logResponseMeta });
return; return;
} }
@@ -250,56 +317,70 @@ exports.checkfee = async (req, res) => {
}; };
logger.log("intellipay-checkfee-options-prepared", "DEBUG", req.user?.email, null, { logger.log("intellipay-checkfee-options-prepared", "DEBUG", req.user?.email, null, {
options requestOptions: options,
...logResponseMeta
}); });
const response = await axios(options); const response = await axios(options);
if (response.data?.error) { if (response.data?.error) {
logger.log("intellipay-checkfee-api-error", "ERROR", req.user?.email, null, { logger.log("intellipay-checkfee-api-error", "ERROR", req.user?.email, null, {
apiError: response.data.error message: response.data?.error,
...logResponseMeta
});
res.status(400).json({
error: response.data?.error,
type: "intellipay-checkfee-api-error",
...logResponseMeta
}); });
res.status(400).json({ error: response.data.error });
} else if (response.data < 0) { } else if (response.data < 0) {
logger.log("intellipay-checkfee-negative-fee", "ERROR", req.user?.email, "Fee amount returned is negative."); logger.log("intellipay-checkfee-negative-fee", "ERROR", req.user?.email, null, {
res.json({ error: "Fee amount negative. Check API credentials & account configuration." }); message: "Fee amount returned is negative.",
...logResponseMeta
});
res.json({
error: "Fee amount negative. Check API credentials & account configuration.",
...logResponseMeta,
type: "intellipay-checkfee-negative-fee"
});
} else { } else {
logger.log("intellipay-checkfee-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-checkfee-success", "DEBUG", req.user?.email, null, {
fee: response.data fee: response.data,
...logResponseMeta
}); });
res.json({ fee: response.data }); res.json({ fee: response.data, ...logResponseMeta });
} }
} catch (error) { } catch (error) {
logger.log("intellipay-checkfee-error", "ERROR", req.user?.email, null, { logger.log("intellipay-checkfee-error", "ERROR", req.user?.email, null, {
error: error.message, message: error?.message,
stack: error.stack, ...logResponseMeta
amount: req.body.amount
}); });
res.status(500).json({ error: error.message }); res.status(500).json({ error: error?.message, logResponseMeta });
} }
}; };
exports.postback = async (req, res) => { exports.postback = async (req, res) => {
const { body: values } = req;
const decodedComment = decodeComment(values?.comment);
const logResponseMeta = {
bodyshop: {
id: req.body?.bodyshop?.id,
imexshopid: req.body?.bodyshop?.imexshopid,
name: req.body?.bodyshop?.shopname,
state: req.body?.bodyshop?.state
},
iprequest: values,
decodedComment
};
logger.log("intellipay-postback-received", "DEBUG", req.user?.email, null, logResponseMeta);
try { try {
const { body: values } = req;
logger.log("intellipay-postback-received", "DEBUG", req.user?.email, null, {
iprequest: values,
base64Comment: values?.comment || null
});
// Decode the base64 comment, if it exists
const decodedComment = values?.comment ? Buffer.from(values.comment, "base64").toString() : null;
logger.log("intellipay-postback-decoded-comment", "DEBUG", req.user?.email, null, {
decodedComment
});
if ((!values.invoice || values.invoice === "") && !decodedComment) { if ((!values.invoice || values.invoice === "") && !decodedComment) {
//invoice is specified through the pay link. Comment by IO. //invoice is specified through the pay link. Comment by IO.
logger.log("intellipay-postback-ignored", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-ignored", "DEBUG", req.user?.email, null, {
reason: "No invoice or comment provided", message: "No invoice or comment provided",
iprequest: values ...logResponseMeta
}); });
res.sendStatus(200); res.sendStatus(200);
return; return;
@@ -311,7 +392,8 @@ exports.postback = async (req, res) => {
const parsedComment = JSON.parse(decodedComment); const parsedComment = JSON.parse(decodedComment);
logger.log("intellipay-postback-parsed-comment", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-parsed-comment", "DEBUG", req.user?.email, null, {
parsedComment parsedComment,
...logResponseMeta
}); });
//Adding in the user email to the short pay email. //Adding in the user email to the short pay email.
@@ -325,7 +407,9 @@ exports.postback = async (req, res) => {
}); });
logger.log("intellipay-postback-jobs-fetched", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-jobs-fetched", "DEBUG", req.user?.email, null, {
jobs jobs,
parsedComment,
...logResponseMeta
}); });
// Insert new payments // Insert new payments
@@ -352,7 +436,10 @@ exports.postback = async (req, res) => {
}); });
logger.log("intellipay-postback-payment-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-payment-success", "DEBUG", req.user?.email, null, {
paymentResult paymentResult,
jobs,
parsedComment,
...logResponseMeta
}); });
if (values.origin === "OneLink" && parsedComment.userEmail) { if (values.origin === "OneLink" && parsedComment.userEmail) {
@@ -375,9 +462,10 @@ exports.postback = async (req, res) => {
}); });
} catch (error) { } catch (error) {
logger.log("intellipay-postback-email-error", "ERROR", req.user?.email, null, { logger.log("intellipay-postback-email-error", "ERROR", req.user?.email, null, {
error: error.message, message: error.message,
jobs, jobs,
paymentResult paymentResult,
...logResponseMeta
}); });
} }
} }
@@ -388,7 +476,8 @@ exports.postback = async (req, res) => {
}); });
logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", req.user?.email, null, {
job job,
...logResponseMeta
}); });
const paymentResult = await gqlClient.request(queries.INSERT_NEW_PAYMENT, { const paymentResult = await gqlClient.request(queries.INSERT_NEW_PAYMENT, {
@@ -403,7 +492,8 @@ exports.postback = async (req, res) => {
}); });
logger.log("intellipay-postback-invoice-payment-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-invoice-payment-success", "DEBUG", req.user?.email, null, {
paymentResult paymentResult,
...logResponseMeta
}); });
const responseResults = await gqlClient.request(queries.INSERT_PAYMENT_RESPONSE, { const responseResults = await gqlClient.request(queries.INSERT_PAYMENT_RESPONSE, {
@@ -420,16 +510,16 @@ exports.postback = async (req, res) => {
}); });
logger.log("intellipay-postback-invoice-response-success", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-invoice-response-success", "DEBUG", req.user?.email, null, {
responseResults responseResults,
...logResponseMeta
}); });
res.sendStatus(200); res.sendStatus(200);
} }
} catch (error) { } catch (error) {
logger.log("intellipay-postback-error", "ERROR", req.user?.email, null, { logger.log("intellipay-postback-error", "ERROR", req.user?.email, null, {
error: error.message, message: error?.message,
stack: error.stack, ...logResponseMeta
iprequest: req.body
}); });
res.status(400).json({ successful: false, error: error.message }); res.status(400).json({ successful: false, error: error.message, ...logResponseMeta });
} }
}; };