From 157c3d51051011fe00af37fa3b94b1940b905b88 Mon Sep 17 00:00:00 2001 From: Rachael Serur Date: Fri, 1 Jun 2018 13:29:42 -0400 Subject: [PATCH 1/4] WIP --- server/main.js | 25 ++++++++++++++++++++++-- server/package.json | 1 + server/yarn.lock | 40 ++++++++++++++++++++++++++++++++++++++- src/App.jsx.js | 46 +++++++++++++++++++++++++++++++++++++++------ 4 files changed, 103 insertions(+), 9 deletions(-) diff --git a/server/main.js b/server/main.js index 15afdc62..13d9dd25 100644 --- a/server/main.js +++ b/server/main.js @@ -1,5 +1,7 @@ const express = require('express'); const fhirKitClient = require('fhir-kit-client'); +const bodyParser = require('body-parser'); +const { URL } = require('url'); const config = { baseUrl: 'https://sb-fhir-stu3.smarthealthit.org/smartstu3/open/' }; const client = new fhirKitClient(config); @@ -12,11 +14,14 @@ if (process.env.NODE_ENV === 'production') { app.use(express.static('build')); } +app.use(bodyParser.urlencoded({ extended: false })); +app.use(bodyParser.json()); + app.get('/api/patient', (req, res) => { if (req.query.name) { client.search({ resourceType: 'Patient', - searchParams: { name: req.query.name } + searchParams: { name: req.query.name, _count: 4 } }).then((response) => { const patients = response.entry ? response.entry.map((obj) => { return { @@ -27,7 +32,23 @@ app.get('/api/patient', (req, res) => { } }) : response; - res.status(200).json(patients); + const nextPageLink = response.link.find(link => link.relation === 'next'); + + const { searchParams } = new URL(nextPageLink.url); + + const results = { + total: response.total, + _getpages: searchParams._getpages, + _getpagesoffset: searchParams._getpagesoffset, + _count: searchParams._count, + patients: patients, + prevPageLink: response.link.find(link => link.relation.match(/^prev(ious)?$/)), + nextPageLink: response.link.find(link => link.relation === 'next'), + } + + console.log(results); + + res.status(200).json(results); }); } else { res.status(200).json({ patients: []}); diff --git a/server/package.json b/server/package.json index 4beb3c23..6a0fae36 100644 --- a/server/package.json +++ b/server/package.json @@ -10,6 +10,7 @@ "author": "", "license": "MIT", "dependencies": { + "body-parser": "^1.18.3", "express": "^4.16.3", "fhir-kit-client": "^0.2.2" } diff --git a/server/yarn.lock b/server/yarn.lock index 5ab1674b..b1073649 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -35,6 +35,21 @@ body-parser@1.18.2: raw-body "2.3.2" type-is "~1.6.15" +body-parser@^1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -172,7 +187,7 @@ http-errors@1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-errors@~1.6.2: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: @@ -185,6 +200,12 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -256,6 +277,10 @@ qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -269,10 +294,23 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" diff --git a/src/App.jsx.js b/src/App.jsx.js index 8c75ab4a..5f730bcd 100644 --- a/src/App.jsx.js +++ b/src/App.jsx.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import Patient from './Patient.jsx'; -import { Layout, Input, List, Card, Row, Col, Spin } from 'antd'; +import { Layout, Input, List, Card, Row, Col, Spin, Pagination } from 'antd'; import './App.css'; const { Header, Content } = Layout; @@ -23,17 +23,46 @@ class App extends Component { .then((response) => ( response.json() )) - .then((patients) => { - this.setState({ patients: patients, loading: false, searchResolved: true }) + .then((results) => { + this.setState({ + total: results.total, + patients: results.patients, + prevPageLink: results.prevPageLink, + nextPageLink: results.nextPageLink, + loading: false, + searchResolved: true + }); }) .catch((err) => { console.log(err); this.setState({ loading: false }); - }) + }); + } + + turnPage(page, pageSize) { + console.log(page); + console.log(pageSize); + // fetch(pageLink, { + // accept: 'application/json' + // }) + // .then((results) => { + // this.setState({ + // patients: results.patients + // }) + // }) + } + + itemRender(current, type, originalElement) { + if (type === 'prev') { + return Previous; + } else if (type === 'next') { + return Next; + } + return originalElement; } render() { - const { patients, loading, searchResolved } = this.state; + const { patients, loading, searchResolved, total } = this.state; return ( @@ -78,8 +107,13 @@ class App extends Component { )} /> + ) } - ); From 02cfdf4406ef28c6b602d975c148cbfd80e6e354 Mon Sep 17 00:00:00 2001 From: Rachael Serur Date: Thu, 7 Jun 2018 10:32:27 -0400 Subject: [PATCH 2/4] save bundle to client state --- server/main.js | 34 ++++++++++------- server/package.json | 3 +- server/yarn.lock | 37 +++++++++++++++++-- src/App.jsx.js | 89 +++++++++++++++++++++++++++------------------ 4 files changed, 109 insertions(+), 54 deletions(-) diff --git a/server/main.js b/server/main.js index 13d9dd25..47e3f6e0 100644 --- a/server/main.js +++ b/server/main.js @@ -32,24 +32,30 @@ app.get('/api/patient', (req, res) => { } }) : response; - const nextPageLink = response.link.find(link => link.relation === 'next'); - - const { searchParams } = new URL(nextPageLink.url); + res.status(200).json({ patients: patients, bundle: response, total: response.total }); + }); + } +}); - const results = { - total: response.total, - _getpages: searchParams._getpages, - _getpagesoffset: searchParams._getpagesoffset, - _count: searchParams._count, - patients: patients, - prevPageLink: response.link.find(link => link.relation.match(/^prev(ious)?$/)), - nextPageLink: response.link.find(link => link.relation === 'next'), - } +app.post('/api/patient', (req, res) => { + console.log(req); + client.pagination.initialize(req.body); - console.log(results); + if (req.query.name) { + client.pagination.goToPage(req.query.page) + .then((response) => { + const patients = response.entry.map((obj) => { + return { + id: obj.resource.id, + name: `${obj.resource.name[0].given} ${obj.resource.name[0].family}`, + gender: obj.resource.gender, + birthDate: obj.resource.birthDate + } + }); - res.status(200).json(results); + res.status(200).json({ patients: patients, bundle: response, total: response.total }); }); + } else { res.status(200).json({ patients: []}); } diff --git a/server/package.json b/server/package.json index 6a0fae36..25c3e322 100644 --- a/server/package.json +++ b/server/package.json @@ -12,6 +12,7 @@ "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.3", - "fhir-kit-client": "^0.2.2" + "express-session": "^1.15.6", + "fhir-kit-client": "file:../../fhir-kit-client" } } diff --git a/server/yarn.lock b/server/yarn.lock index b1073649..56f18d44 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -70,6 +70,10 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +crc@3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -110,6 +114,20 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" +express-session@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.6.tgz#47b4160c88f42ab70fe8a508e31cbff76757ab0a" + dependencies: + cookie "0.3.1" + cookie-signature "1.0.6" + crc "3.4.4" + debug "2.6.9" + depd "~1.1.1" + on-headers "~1.0.1" + parseurl "~1.3.2" + uid-safe "~2.1.5" + utils-merge "1.0.1" + express@^4.16.3: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" @@ -145,9 +163,8 @@ express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" -fhir-kit-client@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/fhir-kit-client/-/fhir-kit-client-0.2.2.tgz#0de8517383de94a196732647b305dc29f6ca97a2" +"fhir-kit-client@file:../../fhir-kit-client": + version "0.3.0" dependencies: axios "^0.18.0" debug "^3.1.0" @@ -258,6 +275,10 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -281,6 +302,10 @@ qs@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -361,6 +386,12 @@ type-is@~1.6.15, type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + dependencies: + random-bytes "~1.0.0" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" diff --git a/src/App.jsx.js b/src/App.jsx.js index 5f730bcd..1a9929cb 100644 --- a/src/App.jsx.js +++ b/src/App.jsx.js @@ -24,13 +24,15 @@ class App extends Component { response.json() )) .then((results) => { + this.setState({ - total: results.total, patients: results.patients, prevPageLink: results.prevPageLink, nextPageLink: results.nextPageLink, loading: false, - searchResolved: true + searchResolved: true, + bundle: results.bundle, + total: results.total }); }) .catch((err) => { @@ -39,17 +41,28 @@ class App extends Component { }); } - turnPage(page, pageSize) { - console.log(page); - console.log(pageSize); - // fetch(pageLink, { - // accept: 'application/json' - // }) - // .then((results) => { - // this.setState({ - // patients: results.patients - // }) - // }) + turnPage = (page, pageSize) => { + + fetch(`api/patient?page=${page}&page_size=${pageSize}`, { + body: JSON.stringify({ bundle: this.state.bundle }), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + accept: 'application/json', + method: 'POST', + mode: 'cors' + }) + .then((response) => ( + response.json() + )) + .then((results) => { + console.log(results); + // this.setState({ + // patients: results.patients, + // response: results.response + // }); + }) } itemRender(current, type, originalElement) { @@ -90,29 +103,33 @@ class App extends Component { ) : ( - ( - - - - - - )} - /> - + + + ( + + + + + + )} + /> + + + ) } From 55d947ded5ff9c2183d11600e2ac4a0e09de3eed Mon Sep 17 00:00:00 2001 From: Rachael Serur Date: Thu, 14 Jun 2018 13:53:31 -0400 Subject: [PATCH 3/4] turn page based on current bundle --- server/main.js | 9 ++++----- server/package.json | 3 +-- server/yarn.lock | 37 +++---------------------------------- src/App.jsx.js | 16 ++++++++-------- 4 files changed, 16 insertions(+), 49 deletions(-) diff --git a/server/main.js b/server/main.js index 47e3f6e0..61d68c40 100644 --- a/server/main.js +++ b/server/main.js @@ -38,20 +38,19 @@ app.get('/api/patient', (req, res) => { }); app.post('/api/patient', (req, res) => { - console.log(req); - client.pagination.initialize(req.body); + client.pagination.initialize(req.body.bundle); - if (req.query.name) { + if (req.query.page) { client.pagination.goToPage(req.query.page) .then((response) => { - const patients = response.entry.map((obj) => { + const patients = response.entry ? response.entry.map((obj) => { return { id: obj.resource.id, name: `${obj.resource.name[0].given} ${obj.resource.name[0].family}`, gender: obj.resource.gender, birthDate: obj.resource.birthDate } - }); + }) : response; res.status(200).json({ patients: patients, bundle: response, total: response.total }); }); diff --git a/server/package.json b/server/package.json index 25c3e322..6a0fae36 100644 --- a/server/package.json +++ b/server/package.json @@ -12,7 +12,6 @@ "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.3", - "express-session": "^1.15.6", - "fhir-kit-client": "file:../../fhir-kit-client" + "fhir-kit-client": "^0.2.2" } } diff --git a/server/yarn.lock b/server/yarn.lock index 56f18d44..b1073649 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -70,10 +70,6 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -crc@3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" - debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -114,20 +110,6 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -express-session@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.6.tgz#47b4160c88f42ab70fe8a508e31cbff76757ab0a" - dependencies: - cookie "0.3.1" - cookie-signature "1.0.6" - crc "3.4.4" - debug "2.6.9" - depd "~1.1.1" - on-headers "~1.0.1" - parseurl "~1.3.2" - uid-safe "~2.1.5" - utils-merge "1.0.1" - express@^4.16.3: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" @@ -163,8 +145,9 @@ express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" -"fhir-kit-client@file:../../fhir-kit-client": - version "0.3.0" +fhir-kit-client@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/fhir-kit-client/-/fhir-kit-client-0.2.2.tgz#0de8517383de94a196732647b305dc29f6ca97a2" dependencies: axios "^0.18.0" debug "^3.1.0" @@ -275,10 +258,6 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -302,10 +281,6 @@ qs@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" -random-bytes@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" - range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -386,12 +361,6 @@ type-is@~1.6.15, type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" -uid-safe@~2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" - dependencies: - random-bytes "~1.0.0" - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" diff --git a/src/App.jsx.js b/src/App.jsx.js index 1a9929cb..198ca79e 100644 --- a/src/App.jsx.js +++ b/src/App.jsx.js @@ -24,7 +24,6 @@ class App extends Component { response.json() )) .then((results) => { - this.setState({ patients: results.patients, prevPageLink: results.prevPageLink, @@ -41,9 +40,9 @@ class App extends Component { }); } - turnPage = (page, pageSize) => { + turnPage = (page, _pageSize) => { - fetch(`api/patient?page=${page}&page_size=${pageSize}`, { + fetch(`api/patient?page=${page}`, { body: JSON.stringify({ bundle: this.state.bundle }), headers: { 'Accept': 'application/json', @@ -57,11 +56,11 @@ class App extends Component { response.json() )) .then((results) => { - console.log(results); - // this.setState({ - // patients: results.patients, - // response: results.response - // }); + this.setState({ + patients: results.patients, + bundle: results.bundle, + total: results.total + }); }) } @@ -105,6 +104,7 @@ class App extends Component { ) : ( +

{ total ? (total + ' result(s)') : ''}

Date: Thu, 14 Jun 2018 17:06:23 -0400 Subject: [PATCH 4/4] Cleanup --- src/App.jsx.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/App.jsx.js b/src/App.jsx.js index 198ca79e..9ab1c45c 100644 --- a/src/App.jsx.js +++ b/src/App.jsx.js @@ -26,8 +26,6 @@ class App extends Component { .then((results) => { this.setState({ patients: results.patients, - prevPageLink: results.prevPageLink, - nextPageLink: results.nextPageLink, loading: false, searchResolved: true, bundle: results.bundle,