Merged in release/2024-11-08 (pull request #1904)

Release/2024 11 08 IO-2921 IO-3025
This commit is contained in:
Allan Carr
2024-11-09 08:34:29 +00:00
3 changed files with 47 additions and 44 deletions

View File

@@ -180,9 +180,10 @@ services:
# - ./certs/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro # Mount the SSH public key # - ./certs/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro # Mount the SSH public key
# - ./upload:/home/user/upload # Mount a local directory for SFTP uploads # - ./upload:/home/user/upload # Mount a local directory for SFTP uploads
# environment: # environment:
# - SFTP_USERS=user:password:1001:100:upload # - SFTP_USERS=user:password:1000::upload
# command: > # command: >
# /bin/sh -c " # /bin/sh -c "
# chmod -R 007 /home/user/upload &&
# echo 'Match User user' >> /etc/ssh/sshd_config && # echo 'Match User user' >> /etc/ssh/sshd_config &&
# sed -i -e 's#ForceCommand internal-sftp#ForceCommand internal-sftp -d /upload#' /etc/ssh/sshd_config && # sed -i -e 's#ForceCommand internal-sftp#ForceCommand internal-sftp -d /upload#' /etc/ssh/sshd_config &&
# /usr/sbin/sshd -D # /usr/sbin/sshd -D

View File

@@ -45,12 +45,14 @@ exports.default = async (req, res) => {
res.sendStatus(401); res.sendStatus(401);
return; return;
} }
try {
//Query for the List of Bodyshop Clients.
logger.log("autohouse-start", "DEBUG", "api", null, null);
const { bodyshops } = await client.request(queries.GET_AUTOHOUSE_SHOPS);
const specificShopIds = req.body.bodyshopIds; // ['uuid];
// Send immediate response and continue processing.
res.status(200).send();
try {
logger.log("autohouse-start", "DEBUG", "api", null, null);
const { bodyshops } = await client.request(queries.GET_AUTOHOUSE_SHOPS); //Query for the List of Bodyshop Clients.
const specificShopIds = req.body.bodyshopIds; // ['uuid];
const { start, end, skipUpload } = req.body; //YYYY-MM-DD const { start, end, skipUpload } = req.body; //YYYY-MM-DD
const batchSize = 10; const batchSize = 10;
@@ -61,26 +63,28 @@ exports.default = async (req, res) => {
if (shopsToProcess.length === 0) { if (shopsToProcess.length === 0) {
logger.log("autohouse-shopsToProcess-empty", "DEBUG", "api", null, null); logger.log("autohouse-shopsToProcess-empty", "DEBUG", "api", null, null);
res.sendStatus(200);
return; return;
} }
const batchPromises = [];
for (let i = 0; i < shopsToProcess.length; i += batchSize) { for (let i = 0; i < shopsToProcess.length; i += batchSize) {
const batch = shopsToProcess.slice(i, i + batchSize); const batch = shopsToProcess.slice(i, i + batchSize);
await processBatch(batch, start, end); const batchPromise = (async () => {
await processBatch(batch, start, end);
if (skipUpload) { if (skipUpload) {
for (const xmlObj of allxmlsToUpload) { for (const xmlObj of allxmlsToUpload) {
fs.writeFileSync(`./logs/${xmlObj.filename}`, xmlObj.xml); fs.writeFileSync(`./logs/${xmlObj.filename}`, xmlObj.xml);
}
} else {
await uploadViaSFTP(allxmlsToUpload);
} }
} else { })();
await uploadViaSFTP(allxmlsToUpload); batchPromises.push(batchPromise);
}
} }
sendServerEmail({ await Promise.all(batchPromises);
await sendServerEmail({
subject: `Autohouse Report ${moment().format("MM-DD-YY")}`, subject: `Autohouse Report ${moment().format("MM-DD-YY")}`,
text: `Errors: ${allErrors.map((e) => JSON.stringify(e, null, 2))} text: `Errors:\n${JSON.stringify(allErrors, null, 2)}\n\nUploaded:\n${JSON.stringify(
Uploaded: ${JSON.stringify(
allxmlsToUpload.map((x) => ({ filename: x.filename, count: x.count, result: x.result })), allxmlsToUpload.map((x) => ({ filename: x.filename, count: x.count, result: x.result })),
null, null,
2 2
@@ -88,10 +92,8 @@ exports.default = async (req, res) => {
}); });
logger.log("autohouse-end", "DEBUG", "api", null, null); logger.log("autohouse-end", "DEBUG", "api", null, null);
res.sendStatus(200);
} catch (error) { } catch (error) {
logger.log("autohouse-shopsToProcess-error", "ERROR", "api", null, { error: error.message, stack: error.stack }); logger.log("autohouse-error", "ERROR", "api", null, { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message, stack: error.stack });
} }
}; };

View File

@@ -37,12 +37,14 @@ exports.default = async (req, res) => {
res.sendStatus(401); res.sendStatus(401);
return; return;
} }
try {
//Query for the List of Bodyshop Clients.
logger.log("chatter-start", "DEBUG", "api", null, null);
const { bodyshops } = await client.request(queries.GET_CHATTER_SHOPS);
const specificShopIds = req.body.bodyshopIds; // ['uuid];
// Send immediate response and continue processing.
res.status(200).send();
try {
logger.log("chatter-start", "DEBUG", "api", null, null);
const { bodyshops } = await client.request(queries.GET_CHATTER_SHOPS); //Query for the List of Bodyshop Clients.
const specificShopIds = req.body.bodyshopIds; // ['uuid];
const { start, end, skipUpload } = req.body; //YYYY-MM-DD const { start, end, skipUpload } = req.body; //YYYY-MM-DD
const batchSize = 10; const batchSize = 10;
@@ -53,26 +55,28 @@ exports.default = async (req, res) => {
if (shopsToProcess.length === 0) { if (shopsToProcess.length === 0) {
logger.log("chatter-shopsToProcess-empty", "DEBUG", "api", null, null); logger.log("chatter-shopsToProcess-empty", "DEBUG", "api", null, null);
res.sendStatus(200);
return; return;
} }
const batchPromises = [];
for (let i = 0; i < shopsToProcess.length; i += batchSize) { for (let i = 0; i < shopsToProcess.length; i += batchSize) {
const batch = shopsToProcess.slice(i, i + batchSize); const batch = shopsToProcess.slice(i, i + batchSize);
await processBatch(batch, start, end); const batchPromise = (async () => {
await processBatch(batch, start, end);
if (skipUpload) { if (skipUpload) {
for (const csvObj of allcsvsToUpload) { for (const csvObj of allcsvsToUpload) {
fs.writeFile(`./logs/${csvObj.filename}`, csvObj.csv); await fs.promises.writeFile(`./logs/${csvObj.filename}`, csvObj.csv);
}
} else {
await uploadViaSFTP(allcsvsToUpload);
} }
} else { })();
await uploadViaSFTP(allcsvsToUpload); batchPromises.push(batchPromise);
}
} }
sendServerEmail({ await Promise.all(batchPromises);
await sendServerEmail({
subject: `Chatter Report ${moment().format("MM-DD-YY")}`, subject: `Chatter Report ${moment().format("MM-DD-YY")}`,
text: `Errors: ${allErrors.map((e) => JSON.stringify(e, null, 2))} text: `Errors:\n${JSON.stringify(allErrors, null, 2)}\n\nUploaded:\n${JSON.stringify(
Uploaded: ${JSON.stringify(
allcsvsToUpload.map((x) => ({ filename: x.filename, count: x.count, result: x.result })), allcsvsToUpload.map((x) => ({ filename: x.filename, count: x.count, result: x.result })),
null, null,
2 2
@@ -80,10 +84,8 @@ exports.default = async (req, res) => {
}); });
logger.log("chatter-end", "DEBUG", "api", null, null); logger.log("chatter-end", "DEBUG", "api", null, null);
res.sendStatus(200);
} catch (error) { } catch (error) {
logger.log("chatter-shopsToProcess-error", "ERROR", "api", null, { error: error.message, stack: error.stack }); logger.log("chatter-error", "ERROR", "api", null, { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message, stack: error.stack });
} }
}; };
@@ -152,9 +154,7 @@ async function getPrivateKey() {
try { try {
const { SecretString, SecretBinary } = await client.send(command); const { SecretString, SecretBinary } = await client.send(command);
if (SecretString || SecretBinary) logger.log("chatter-retrieved-private-key", "DEBUG", "api", null, null); if (SecretString || SecretBinary) logger.log("chatter-retrieved-private-key", "DEBUG", "api", null, null);
const chatterPrivateKey = SecretString const chatterPrivateKey = SecretString ? SecretString : Buffer.from(SecretBinary, "base64").toString("ascii");
? SecretString
: Buffer.from(SecretBinary, "base64").toString("ascii");
return chatterPrivateKey; return chatterPrivateKey;
} catch (error) { } catch (error) {
logger.log("chatter-get-private-key", "ERROR", "api", null, { error: error.message, stack: error.stack }); logger.log("chatter-get-private-key", "ERROR", "api", null, { error: error.message, stack: error.stack });