@@ -7,6 +7,12 @@ interface User {
77 errors ?: string [ ]
88}
99
10+ const BENE_DENIED_ACCESS = "access_denied"
11+ const FE_MSG_ACCESS_DENIED = "Beneficiary denied app access to their data"
12+ const ERR_QUERY_EOB = "Error when querying the patient's EOB!"
13+ const ERR_MISSING_AUTH_CODE = "Response was missing access code!"
14+ const ERR_MISSING_STATE = "State is required when using PKCE"
15+
1016const app = express ( ) ;
1117
1218const bb = new BlueButton ( ) ;
@@ -20,6 +26,12 @@ const authData = bb.generateAuthData();
2026const loggedInUser : User = {
2127} ;
2228
29+ // helper to clean up cached eob data
30+ function clearBB2Data ( ) {
31+ loggedInUser . authToken = undefined ;
32+ loggedInUser . eobData = { } ;
33+ }
34+
2335// AuthorizationToken holds access grant info:
2436// access token, expire in, expire at, token type, scope, refreh token, etc.
2537// it is associated with current logged in user in real app,
@@ -35,13 +47,20 @@ app.get("/api/authorize/authurl", (req: Request, res: Response) => {
3547// auth flow: oauth2 call back
3648app . get ( "/api/bluebutton/callback" , async ( req : Request , res : Response ) => {
3749 if ( typeof req . query . error === "string" ) {
38- res . json ( { message : req . query . error } ) ;
50+ // clear all cached claims eob data since the bene has denied access
51+ // for the application
52+ clearBB2Data ( ) ;
53+ let errMsg = req . query . error ;
54+ if ( req . query . error === BENE_DENIED_ACCESS ) {
55+ errMsg = FE_MSG_ACCESS_DENIED ;
56+ }
57+ loggedInUser . eobData = { "message" : errMsg } ;
58+ process . stdout . write ( errMsg + '\n' ) ;
3959 } else {
4060 if (
4161 typeof req . query . code === "string" &&
4262 typeof req . query . state === "string"
4363 ) {
44- // let results;
4564 try {
4665 authToken = await bb . getAuthorizationToken (
4766 authData ,
@@ -54,64 +73,22 @@ app.get("/api/bluebutton/callback", async (req: Request, res: Response) => {
5473 // access token can expire, SDK automatically refresh access token when that happens.
5574 const eobResults = await bb . getExplanationOfBenefitData ( authToken ) ;
5675 authToken = eobResults . token ; // in case authToken got refreshed during fhir call
57- // const patientResults = await bb.getPatientData(authToken);
58- // authToken = patientResults.token;
59- // const coverageResults = await bb.getCoverageData(authToken);
60- // authToken = coverageResults.token;
61- // const profileResults = await bb.getProfileData(authToken);
62- // authToken = profileResults.token;
63-
64- // nav pages if needed for eob, patient, coverage
65- // client code can preemptively refresh tokens by calling refreshAuthToken(authToken)
66- // console.log(
67- // "============= preemptively do oauth token refresh before fetch EOB ================="
68- // );
69-
70- // console.log("============= authToken =================");
71-
72- // authToken = await bb.refreshAuthToken(authToken);
73-
74- // console.log(authToken);
7576
7677 loggedInUser . authToken = authToken ;
77- // console.log("============= EOB PAGES =================");
7878
7979 loggedInUser . eobData = eobResults . response ?. data ;
80- // const eobs = await bb.getPages(eobbundle, authToken);
81- // for (let i = 0; i < eobs.pages.length; i++) {
82- // fs.writeFileSync(`eob_p${i}.json`, JSON.stringify(eobs.pages[i]));
83- // }
84-
85- // authToken = eobs.token;
86-
87- // console.log("=============PATIENT=================");
88- // const ptbundle = patientResults.response?.data;
89- // const pts = await bb.getPages(ptbundle, authToken);
90- // authToken = pts.token;
91-
92- // console.log("=============COVERAGE=================");
93- // const coveragebundle = coverageResults.response?.data;
94- // const coverages = await bb.getPages(coveragebundle, authToken);
95- // authToken = coverages.token;
96-
97- // console.log("=============PROFILE=================");
98- // const pfbundle = profileResults.response?.data;
99- // const pfs = await bb.getPages(pfbundle, authToken);
100- // authToken = pfs.token;
101-
102- // results = {
103- // eob: eobs.pages,
104- // patient: pts.pages,
105- // coverage: coverages.pages,
106- // profile: pfs.pages,
107- // };
10880 } catch ( e ) {
109- console . log ( e ) ;
81+ loggedInUser . eobData = { } ;
82+ process . stdout . write ( ERR_QUERY_EOB + '\n' ) ;
83+ process . stdout . write ( "Exception: " + e + '\n' ) ;
11084 }
111- // res.json(results);
11285 } else {
113- //res.json({ message: "Missing AC in callback." });
114- console . log ( "Missing AC in callback." ) ;
86+ clearBB2Data ( ) ;
87+ process . stdout . write ( ERR_MISSING_AUTH_CODE + '\n' ) ;
88+ process . stdout . write ( "OR" + '\n' ) ;
89+ process . stdout . write ( ERR_MISSING_STATE + '\n' ) ;
90+ process . stdout . write ( "AUTH CODE: " + req . query . code + '\n' ) ;
91+ process . stdout . write ( "STATE: " + req . query . state + '\n' ) ;
11592 }
11693 }
11794 const fe_redirect_url =
0 commit comments