From a49b3f6496d6b98394ddd774a807a29633f55f9e Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Wed, 14 May 2025 17:56:15 -0700 Subject: [PATCH 1/5] IO-3190 Add nulll coalesce and check for non-intake events. --- .../job-at-change/schedule-event.component.jsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/components/job-at-change/schedule-event.component.jsx b/client/src/components/job-at-change/schedule-event.component.jsx index f37290fbc..6f7780ba8 100644 --- a/client/src/components/job-at-change/schedule-event.component.jsx +++ b/client/src/components/job-at-change/schedule-event.component.jsx @@ -66,7 +66,7 @@ export function ScheduleEventComponent({ const [popOverVisible, setPopOverVisible] = useState(false); const [getJobDetails] = useLazyQuery(GET_JOB_BY_PK_QUICK_INTAKE, { - variables: { id: event.job.id }, + variables: { id: event.job?.id }, onCompleted: (data) => { if (data?.jobs_by_pk) { const totalHours = @@ -83,6 +83,7 @@ export function ScheduleEventComponent({ }); } }, + fetchPolicy: "network-only" }); @@ -409,8 +410,10 @@ export function ScheduleEventComponent({ open={popOverVisible} onOpenChange={setPopOverVisible} onClick={(e) => { - getJobDetails(); - e.stopPropagation(); + if (event.job?.id) { + e.stopPropagation(); + getJobDetails(); + } }} getPopupContainer={(trigger) => trigger.parentNode} trigger="click" From 9ab41308e722e1d29b84a608a87700742c9b7cdf Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 15 May 2025 12:53:41 -0700 Subject: [PATCH 2/5] IO-3066 add EMS upload functionality. --- server/data/data.js | 3 ++- server/data/emsUpload.js | 22 ++++++++++++++++++++++ server/routes/miscellaneousRoutes.js | 3 +++ server/utils/s3.js | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 server/data/emsUpload.js diff --git a/server/data/data.js b/server/data/data.js index efd662c13..e89d041b9 100644 --- a/server/data/data.js +++ b/server/data/data.js @@ -4,4 +4,5 @@ exports.chatter = require("./chatter").default; exports.claimscorp = require("./claimscorp").default; exports.kaizen = require("./kaizen").default; exports.usageReport = require("./usageReport").default; -exports.podium = require("./podium").default; \ No newline at end of file +exports.podium = require("./podium").default; +exports.emsUpload = require("./emsUpload").default; \ No newline at end of file diff --git a/server/data/emsUpload.js b/server/data/emsUpload.js new file mode 100644 index 000000000..417454ae4 --- /dev/null +++ b/server/data/emsUpload.js @@ -0,0 +1,22 @@ +const moment = require("moment-timezone"); +const logger = require("../utils/logger"); +const s3Client = require("../utils/s3"); // Using the S3 client utilities with LocalStack support + +const emsUpload = async (req, res) => { + try { + const { bodyshopid, ciecaid, clm_no, ownr_ln } = req.body; + const presignedUrl = await s3Client.getPresignedUrl({ + bucketName: process.env.S3_EMS_UPLOAD_BUCKET, + key: `${bodyshopid}/${ciecaid}-${clm_no}-${ownr_ln}-${moment().format("YYYY-MM-DD--HH-mm-ss")}.zip` + }); + res.status(200).json({ presignedUrl }); + } catch (error) { + logger.log("usage-report-email-error", "ERROR", req?.user?.email, null, { + error: error.message, + stack: error.stack + }); + res.status(500).json({ error: error.message, stack: error.stack }); + } +}; + +exports.default = emsUpload; \ No newline at end of file diff --git a/server/routes/miscellaneousRoutes.js b/server/routes/miscellaneousRoutes.js index 40666302f..b0360d488 100644 --- a/server/routes/miscellaneousRoutes.js +++ b/server/routes/miscellaneousRoutes.js @@ -138,6 +138,9 @@ router.post("/canvastest", validateFirebaseIdTokenMiddleware, canvastest); // Alert Check router.post("/alertcheck", eventAuthorizationMiddleware, alertCheck); +//EMS Upload +router.post("/emsupload", validateFirebaseIdTokenMiddleware, data.emsUpload); + // Redis Cache Routes router.post("/bodyshop-cache", eventAuthorizationMiddleware, updateBodyshopCache); diff --git a/server/utils/s3.js b/server/utils/s3.js index 8b9251e03..2ba1f0d47 100644 --- a/server/utils/s3.js +++ b/server/utils/s3.js @@ -9,6 +9,7 @@ const { const { defaultProvider } = require("@aws-sdk/credential-provider-node"); const { InstanceRegion } = require("./instanceMgr"); const { isString, isEmpty } = require("lodash"); +const { getSignedUrl } = require("@aws-sdk/s3-request-presigner"); const createS3Client = () => { const S3Options = { @@ -95,6 +96,17 @@ const createS3Client = () => { throw error; } }; + + const getPresignedUrl = async ({ bucketName, key }) => { + const command = new PutObjectCommand({ + Bucket: bucketName, + Key: key, + StorageClass: "INTELLIGENT_TIERING" + }); + const presignedUrl = await getSignedUrl(s3Client, command, { expiresIn: 360 }); + return presignedUrl; + } + return { uploadFileToS3, downloadFileFromS3, @@ -102,8 +114,12 @@ const createS3Client = () => { deleteFileFromS3, copyFileInS3, fileExistsInS3, + getPresignedUrl, ...s3Client }; }; + + + module.exports = createS3Client(); From 8b89e2eb9df891f2b9637e86ff86a84721e9f86e Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Thu, 15 May 2025 15:27:59 -0700 Subject: [PATCH 3/5] IO-3210 Podium Datapump Signed-off-by: Allan Carr --- server/data/podium.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/data/podium.js b/server/data/podium.js index 69dfd3226..9f6327ef4 100644 --- a/server/data/podium.js +++ b/server/data/podium.js @@ -185,7 +185,7 @@ async function uploadViaSFTP(csvObj) { await sftp.connect(ftpSetup); try { - csvObj.result = await sftp.put(Buffer.from(csvObj.xml), `${csvObj.filename}`); + csvObj.result = await sftp.put(Buffer.from(csvObj.csv), `${csvObj.filename}`); logger.log("podium-sftp-upload", "DEBUG", "api", csvObj.bodyshopid, { imexshopid: csvObj.imexshopid, filename: csvObj.filename, From 61276bb2d116194c34e6c49b48cbe2d35f1877a1 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 15 May 2025 15:35:56 -0700 Subject: [PATCH 4/5] IO-2328 change querystring versions. --- package-lock.json | 74 ++++++++++++++--------------------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06038085f..902aa54a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "node-persist": "^4.0.4", "nodemailer": "^6.10.0", "phone": "^3.1.58", - "query-string": "^9.1.2", + "query-string": "7.1.3", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", "skia-canvas": "^2.0.2", @@ -5853,12 +5853,12 @@ } }, "node_modules/decode-uri-component": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", - "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=0.10" } }, "node_modules/decompress-response": { @@ -7102,15 +7102,12 @@ } }, "node_modules/filter-obj": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/finalhandler": { @@ -8132,24 +8129,6 @@ "node": ">=10" } }, - "node_modules/intuit-oauth/node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/intuit-oauth/node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/intuit-oauth/node_modules/query-string": { "version": "6.14.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", @@ -8168,15 +8147,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/intuit-oauth/node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ioredis": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", @@ -10348,17 +10318,18 @@ } }, "node_modules/query-string": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.2.tgz", - "integrity": "sha512-s3UlTyjxRux4KjwWaJsjh1Mp8zoCkSGKirbD9H89pEM9UOZsfpRZpdfzvsy2/mGlLfC3NnYVpy2gk7jXITHEtA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", "license": "MIT", "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11496,15 +11467,12 @@ } }, "node_modules/split-on-first": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/sprintf-js": { diff --git a/package.json b/package.json index ce5dcaa0c..742d8ab28 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "node-persist": "^4.0.4", "nodemailer": "^6.10.0", "phone": "^3.1.58", - "query-string": "^9.1.2", + "query-string": "7.1.3", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", "skia-canvas": "^2.0.2", From 392988ae1133c271bfa519931bdd84d39cd479c5 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 15 May 2025 15:46:45 -0700 Subject: [PATCH 5/5] Io-3066 resolve typo. --- server/data/emsUpload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/data/emsUpload.js b/server/data/emsUpload.js index 417454ae4..a59f0d385 100644 --- a/server/data/emsUpload.js +++ b/server/data/emsUpload.js @@ -11,7 +11,7 @@ const emsUpload = async (req, res) => { }); res.status(200).json({ presignedUrl }); } catch (error) { - logger.log("usage-report-email-error", "ERROR", req?.user?.email, null, { + logger.log("ems-upload-presign-error", "ERROR", req?.user?.email, null, { error: error.message, stack: error.stack });