diff --git a/backend/env.json b/backend/env.json index fb00048..327b4c4 100644 --- a/backend/env.json +++ b/backend/env.json @@ -38,11 +38,10 @@ "default": "admin" }, - "REMS_ADMIN_BASE": { + "REMS_ADMIN_FHIR_URL": { "type": "string", - "default": "http://localhost:8090" + "default": "http://localhost:8090/4_0_0" }, - "HTTPS_KEY_PATH": { "type": "string", "default": "server.key" diff --git a/backend/package-lock.json b/backend/package-lock.json index 00e6eb5..ba611e3 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -297,9 +297,9 @@ }, "dependencies": { "fast-xml-parser": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", - "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "optional": true, "requires": { "strnum": "^1.0.5" @@ -2099,9 +2099,9 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, "cookie-signature": { "version": "1.0.6", @@ -2567,16 +2567,16 @@ } }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -2604,25 +2604,6 @@ "vary": "~1.1.2" }, "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2635,17 +2616,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } } } }, @@ -2827,9 +2797,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "form-data": { "version": "4.0.0", @@ -4924,4 +4894,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/backend/package.json b/backend/package.json index 2b4614b..5b8c448 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,7 +8,7 @@ "body-parser": "^1.20.1", "body-parser-xml": "^2.0.3", "cors": "^2.8.5", - "express": "^4.18.2", + "express": "^4.19.2", "fast-xml-parser": "^4.3.2", "mongoose": "^6.11.4", "var": "^0.4.0", diff --git a/backend/src/database/schemas/doctorOrderSchemas.js b/backend/src/database/schemas/doctorOrderSchemas.js index 1c00b25..e95ff52 100644 --- a/backend/src/database/schemas/doctorOrderSchemas.js +++ b/backend/src/database/schemas/doctorOrderSchemas.js @@ -19,17 +19,23 @@ export const orderSchema = new mongoose.Schema({ rxDate: String, drugPrice: Number, drugNdcCode: String, + drugRxnormCode: String, quantities: String, total: Number, pickupDate: String, dispenseStatus: String, metRequirements: [ { - stakeholderId: String, - completed: Boolean, - metRequirementId: String, - requirementName: String, - requirementDescription: String + name: String, + resource: { + status: String, + moduleUri: String, + resourceType: String, + note: [{ text: String }], + subject: { + reference: String + } + } } ] }); diff --git a/backend/src/routes/doctorOrders.js b/backend/src/routes/doctorOrders.js index da3d422..0cc151f 100644 --- a/backend/src/routes/doctorOrders.js +++ b/backend/src/routes/doctorOrders.js @@ -72,37 +72,78 @@ router.post('/api/addRx', async (req, res) => { */ router.patch('/api/updateRx/:id', async (req, res) => { try { - const dontUpdateStatusBool = req.query.dontUpdateStatus; + const doNotUpdateStatusBool = req.query.doNotUpdateStatus; // Finding by id const order = await doctorOrder.findById(req.params.id).exec(); - console.log('Found doctor order by id!'); + console.log('Found doctor order by id! --- ', order); + + const body = { + resourceType: 'Parameters', + parameter: [ + { + name: 'patient', + resource: { + resourceType: 'Patient', + id: order.prescriberOrderNumber, + name: [ + { + family: order.patientLastName, + given: order.patientName.split(' '), + use: 'official' + } + ], + birthDate: order.patientDOB + } + }, + { + name: 'medication', + resource: { + resourceType: 'Medication', + id: order.prescriberOrderNumber, + code: { + coding: [ + { + system: 'http://www.nlm.nih.gov/research/umls/rxnorm', + code: order.drugRxnormCode, + display: order.drugNames + } + ] + } + } + } + ] + }; // Reaching out to REMS Admin finding by pt name and drug name - // '/etasu/met/patient/:patientFirstName/:patientLastName/:patientDOB/drug/:drugName', - - const remsBase = env.REMS_ADMIN_BASE; - const url = - remsBase + - '/etasu/met/patient/' + - order.patientFirstName + - '/' + - order.patientLastName + - '/' + - order.patientDOB + - '/drug/' + - order.simpleDrugName; - const response = await axios.get(url); + const remsBase = env.REMS_ADMIN_FHIR_URL; + + const newUrl = remsBase + '/GuidanceResponse/$rems-etasu'; + + const response = await axios.post(newUrl, body, { + headers: { + 'content-type': 'application/json' + } + }); console.log('Retrieved order'); + const responseResource = response.data.parameter[0].resource; + const params = []; + if (responseResource.contained && responseResource.contained[0]) { + for (const param of responseResource.contained[0]['parameter']) { + params.push(param); + } + } + + const status = responseResource.status === 'success' ? 'Approved' : 'Pending'; // Saving and updating const newOrder = await doctorOrder.findOneAndUpdate( { _id: req.params.id }, { dispenseStatus: - dontUpdateStatusBool || order.dispenseStatus === 'Picked Up' + doNotUpdateStatusBool || order.dispenseStatus === 'Picked Up' ? order.dispenseStatus - : response.data.status, - metRequirements: response.data.metRequirements + : status, + metRequirements: params }, { new: true @@ -233,6 +274,7 @@ function parseNCPDPScript(newRx) { drugNames: newRx.Message.Body.NewRx.MedicationPrescribed.DrugDescription, simpleDrugName: newRx.Message.Body.NewRx.MedicationPrescribed.DrugDescription.split(' ')[0], drugNdcCode: newRx.Message.Body.NewRx.MedicationPrescribed.DrugCoded.ProductCode.Code, + drugRxnormCode: newRx.Message.Body.NewRx.MedicationPrescribed.DrugCoded.DrugDBCode.Code, rxDate: newRx.Message.Body.NewRx.MedicationPrescribed.WrittenDate.Date, drugPrice: 200, // Add later? quantities: newRx.Message.Body.NewRx.MedicationPrescribed.Quantity.Value, diff --git a/backend/test/simple.test.ts b/backend/test/simple.test.ts deleted file mode 100644 index 7b1de11..0000000 --- a/backend/test/simple.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import router from '../src/routes/doctorOrders'; - -describe('help', () => { - it.skip('should fail', () => { - throw 'Errrrr'; - }); -}); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8dba2d6..6209fde 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5991,12 +5991,12 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -6004,7 +6004,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -6552,9 +6552,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -8572,16 +8572,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -8874,9 +8874,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -15304,9 +15304,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -17930,9 +17930,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", diff --git a/frontend/public/index.html b/frontend/public/index.html index 66a1edc..d2569de 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -33,7 +33,7 @@ This HTML file is a template. If you open it directly in the browser, you will see an empty page. - You can add webfonts, meta tags, or analytics to this file. + You can add web fonts, meta tags, or analytics to this file. The build step will place the bundled scripts into the
tag. To begin the development, run `npm start` or `yarn start`. diff --git a/frontend/src/App.css b/frontend/src/App.css index 3627fc7..9300233 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,8 +1,8 @@ .App { text-align: center; - background-color:#0A192A; + background-color: #0a192a; padding: 20px; - margin-bottom:20px; + margin-bottom: 20px; } .App-logo { @@ -43,33 +43,31 @@ .NavButtons { list-style: none; text-decoration: none; - margin-left:5px; + margin-left: 5px; } .App h1 { - color:white; + color: white; line-height: 1.3; letter-spacing: 0.00938em; - font-family: "Roboto","Helvetica","Arial",sans-serif; + font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif; } .logo { -grid-area:main; -text-align: left; -margin-right: auto; -display: inline-flex; -box-sizing: unset; + grid-area: main; + text-align: left; + margin-right: auto; + display: inline-flex; + box-sizing: unset; } .links { - grid-area:right; + grid-area: right; margin-left: auto; margin-top: 25px; } -.containerg{ +.containerg { display: grid; grid-template-areas: ' main right'; } - - diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 4657c97..8109587 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { render, screen } from '@testing-library/react'; import App from './App'; diff --git a/frontend/src/views/DoctorOrders/DoctorOrders.css b/frontend/src/views/DoctorOrders/DoctorOrders.css deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/src/views/DoctorOrders/DoctorOrders.test.tsx b/frontend/src/views/DoctorOrders/DoctorOrders.test.tsx index eed8370..1f6e0e0 100644 --- a/frontend/src/views/DoctorOrders/DoctorOrders.test.tsx +++ b/frontend/src/views/DoctorOrders/DoctorOrders.test.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { render, screen } from '@testing-library/react'; import DoctorOrders from './DoctorOrders'; diff --git a/frontend/src/views/DoctorOrders/DoctorOrders.tsx b/frontend/src/views/DoctorOrders/DoctorOrders.tsx index 4237ed3..189561d 100644 --- a/frontend/src/views/DoctorOrders/DoctorOrders.tsx +++ b/frontend/src/views/DoctorOrders/DoctorOrders.tsx @@ -1,7 +1,6 @@ import { Box, Tab, Tabs } from '@mui/material'; import { Container } from '@mui/system'; import React from 'react'; -import './DoctorOrders.css'; import NewOrders from './NewOrders/NewOrders'; import PickedUpOrders from './PickedUpOrders/PickedUpOrders'; import VerifiedOrders from './VerifiedOrders/VerifiedOrders'; @@ -44,17 +43,17 @@ export default function DoctorOrders() {