oro-sdk 5.3.4 → 5.3.6
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/client.d.ts +27 -10
- package/dist/oro-sdk.cjs.development.js +688 -1539
- package/dist/oro-sdk.cjs.development.js.map +1 -1
- package/dist/oro-sdk.cjs.production.min.js +1 -1
- package/dist/oro-sdk.cjs.production.min.js.map +1 -1
- package/dist/oro-sdk.esm.js +688 -1539
- package/dist/oro-sdk.esm.js.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +40 -41
- package/src/helpers/patient-registration.ts +8 -8
- package/src/helpers/prescription-refill.ts +64 -63
- package/LICENSE +0 -21
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"version": "5.3.
|
2
|
+
"version": "5.3.6",
|
3
3
|
"main": "dist/index.js",
|
4
4
|
"typings": "dist/index.d.ts",
|
5
5
|
"files": [
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"form-data": "^4.0.0",
|
56
56
|
"formdata-node": "^4.3.1",
|
57
57
|
"idb-keyval": "^5.0.6",
|
58
|
-
"oro-sdk-apis": "3.2.
|
58
|
+
"oro-sdk-apis": "3.2.7",
|
59
59
|
"oro-toolbox": "0.0.6",
|
60
60
|
"uuid": "^8.3.2"
|
61
61
|
}
|
package/src/client.ts
CHANGED
@@ -94,7 +94,7 @@ export class OroClient {
|
|
94
94
|
public workflowClient: WorkflowService,
|
95
95
|
public diagnosisClient: DiagnosisService,
|
96
96
|
private authenticationCallback?: (err: Error) => void
|
97
|
-
) {}
|
97
|
+
) { }
|
98
98
|
|
99
99
|
/**
|
100
100
|
* clears the vaultIndex and cached metadata grants
|
@@ -407,18 +407,18 @@ export class OroClient {
|
|
407
407
|
}))
|
408
408
|
.map(
|
409
409
|
(e: IndexConsultLockbox) =>
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
410
|
+
({
|
411
|
+
uuid: e.uuid,
|
412
|
+
timestamp: e.timestamp,
|
413
|
+
uniqueHash: e.uniqueHash,
|
414
|
+
encryptedIndexEntry: CryptoRSA.jsonWithPubEncryptToBase64(
|
415
|
+
{
|
416
|
+
consultationId: e.consultationId,
|
417
|
+
grant: e.grant,
|
418
|
+
},
|
419
|
+
rsaPub
|
420
|
+
),
|
421
|
+
} as EncryptedIndexEntry)
|
422
422
|
)
|
423
423
|
break
|
424
424
|
}
|
@@ -553,7 +553,7 @@ export class OroClient {
|
|
553
553
|
documentType: DocumentType,
|
554
554
|
lockboxOwnerUuid?: Uuid,
|
555
555
|
previousDataUuid?: Uuid,
|
556
|
-
|
556
|
+
options: { withNotification?: boolean } = { withNotification: false }
|
557
557
|
): Promise<DataCreateResponse> {
|
558
558
|
if (!this.rsa) throw IncompleteAuthentication
|
559
559
|
|
@@ -572,7 +572,7 @@ export class OroClient {
|
|
572
572
|
},
|
573
573
|
lockboxOwnerUuid,
|
574
574
|
previousDataUuid,
|
575
|
-
|
575
|
+
options
|
576
576
|
)
|
577
577
|
}
|
578
578
|
|
@@ -585,7 +585,7 @@ export class OroClient {
|
|
585
585
|
* @param privateMeta the metadata that will be secured in the vault
|
586
586
|
* @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)
|
587
587
|
* @param previousDataUuid if it's a revision of existing data, specify the previous data uuid
|
588
|
-
* @param
|
588
|
+
* @param options if the insertion of data requires email notification
|
589
589
|
* @returns the data uuid
|
590
590
|
*/
|
591
591
|
public async createJsonData<T extends Metadata>(
|
@@ -595,7 +595,7 @@ export class OroClient {
|
|
595
595
|
privateMeta?: { [val: string]: any },
|
596
596
|
lockboxOwnerUuid?: Uuid,
|
597
597
|
previousDataUuid?: Uuid,
|
598
|
-
|
598
|
+
options: { withNotification?: boolean } = { withNotification: false }
|
599
599
|
): Promise<DataCreateResponse> {
|
600
600
|
if (!this.rsa) throw IncompleteAuthentication
|
601
601
|
|
@@ -608,7 +608,7 @@ export class OroClient {
|
|
608
608
|
publicMetadata: meta,
|
609
609
|
privateMetadata: encryptedPrivateMeta,
|
610
610
|
}
|
611
|
-
if (withNotification)
|
611
|
+
if (options.withNotification)
|
612
612
|
return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)
|
613
613
|
else return this.vaultClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)
|
614
614
|
}
|
@@ -620,7 +620,7 @@ export class OroClient {
|
|
620
620
|
* @param publicMetadata the public Metadata
|
621
621
|
* @param privateMetadata the private Metadata
|
622
622
|
* @param forceReplace set true when the insertion of data requires to replace the data when it exists already
|
623
|
-
* @param
|
623
|
+
* @param options if the insertion of data requires email notification
|
624
624
|
* @returns the data uuid
|
625
625
|
*/
|
626
626
|
public async getOrInsertJsonData<M extends Metadata>(
|
@@ -628,11 +628,10 @@ export class OroClient {
|
|
628
628
|
data: any,
|
629
629
|
publicMetadata: M,
|
630
630
|
privateMetadata: Metadata,
|
631
|
-
|
632
|
-
withNotification: boolean = false
|
631
|
+
options: { withNotification?: boolean, forceReplace?: boolean } = { withNotification: false, forceReplace: false }
|
633
632
|
): Promise<Uuid> {
|
634
633
|
let manifest = await this.vaultClient.lockboxManifestGet(lockboxUuid, publicMetadata)
|
635
|
-
if (!forceReplace && manifest.length > 0) {
|
634
|
+
if (!options.forceReplace && manifest.length > 0) {
|
636
635
|
console.log(`The data for ${JSON.stringify(publicMetadata)} already exist`)
|
637
636
|
return manifest[0].dataUuid
|
638
637
|
} else
|
@@ -643,8 +642,9 @@ export class OroClient {
|
|
643
642
|
publicMetadata,
|
644
643
|
privateMetadata,
|
645
644
|
undefined,
|
646
|
-
|
647
|
-
|
645
|
+
// if forceReplace and data already exist, then replace data. Otherwise insert it
|
646
|
+
options.forceReplace && manifest.length > 0 ? manifest[0].dataUuid : undefined,
|
647
|
+
{ withNotification: options.withNotification }
|
648
648
|
).catch((err) => {
|
649
649
|
console.error(`Error while upserting data ${JSON.stringify(publicMetadata)} data`, err)
|
650
650
|
throw err
|
@@ -671,7 +671,7 @@ export class OroClient {
|
|
671
671
|
privateMeta: { [val: string]: any },
|
672
672
|
lockboxOwnerUuid?: Uuid,
|
673
673
|
previousDataUuid?: Uuid,
|
674
|
-
|
674
|
+
options: { withNotification?: boolean } = { withNotification: false }
|
675
675
|
): Promise<DataCreateResponse> {
|
676
676
|
if (!this.rsa) throw IncompleteAuthentication
|
677
677
|
let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)
|
@@ -683,7 +683,7 @@ export class OroClient {
|
|
683
683
|
publicMetadata: meta,
|
684
684
|
privateMetadata: encryptedPrivateMeta,
|
685
685
|
}
|
686
|
-
if (withNotification)
|
686
|
+
if (options.withNotification)
|
687
687
|
return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)
|
688
688
|
else return this.vaultClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)
|
689
689
|
}
|
@@ -832,9 +832,9 @@ export class OroClient {
|
|
832
832
|
public async getPersonalInformationsFromConsultId(
|
833
833
|
consultationId: Uuid,
|
834
834
|
category: MetadataCategory.Personal | MetadataCategory.ChildPersonal | MetadataCategory.OtherPersonal,
|
835
|
-
forceRefresh = false
|
835
|
+
options: { forceRefresh: boolean } = { forceRefresh: false }
|
836
836
|
): Promise<LocalizedData<PopulatedWorkflowData>[]> {
|
837
|
-
return this.getMetaCategoryFromConsultId(consultationId, category,
|
837
|
+
return this.getMetaCategoryFromConsultId(consultationId, category, options)
|
838
838
|
}
|
839
839
|
|
840
840
|
/**
|
@@ -847,15 +847,15 @@ export class OroClient {
|
|
847
847
|
*/
|
848
848
|
public async getMedicalDataFromConsultId(
|
849
849
|
consultationId: Uuid,
|
850
|
-
forceRefresh = false
|
850
|
+
options: { forceRefresh: boolean } = { forceRefresh: false }
|
851
851
|
): Promise<LocalizedData<PopulatedWorkflowData>[]> {
|
852
|
-
return this.getMetaCategoryFromConsultId(consultationId, MetadataCategory.Medical,
|
852
|
+
return this.getMetaCategoryFromConsultId(consultationId, MetadataCategory.Medical, options)
|
853
853
|
}
|
854
854
|
|
855
855
|
private async getMetaCategoryFromConsultId(
|
856
856
|
consultationId: Uuid,
|
857
857
|
category: MetadataCategory,
|
858
|
-
forceRefresh = false
|
858
|
+
options: { forceRefresh: boolean } = { forceRefresh: false }
|
859
859
|
): Promise<LocalizedData<PopulatedWorkflowData>[]> {
|
860
860
|
let grants = await this.getGrants({ consultationId })
|
861
861
|
let workflowData: LocalizedData<PopulatedWorkflowData>[] = []
|
@@ -869,7 +869,7 @@ export class OroClient {
|
|
869
869
|
},
|
870
870
|
true,
|
871
871
|
grant.lockboxOwnerUuid,
|
872
|
-
|
872
|
+
options
|
873
873
|
)
|
874
874
|
|
875
875
|
// TODO: find another solution for backwards compatibility (those without the metadata consultationIds)
|
@@ -884,7 +884,7 @@ export class OroClient {
|
|
884
884
|
},
|
885
885
|
true,
|
886
886
|
grant.lockboxOwnerUuid,
|
887
|
-
|
887
|
+
options
|
888
888
|
)
|
889
889
|
).filter((entry) => !entry.metadata.consultationIds) // Keep only entries without associated consultationIds
|
890
890
|
}
|
@@ -987,7 +987,7 @@ export class OroClient {
|
|
987
987
|
filter: Metadata,
|
988
988
|
expandPrivateMetadata: boolean,
|
989
989
|
lockboxOwnerUuid?: Uuid,
|
990
|
-
forceRefresh: boolean = false
|
990
|
+
options: { forceRefresh: boolean } = { forceRefresh: false }
|
991
991
|
): Promise<LockboxManifest> {
|
992
992
|
let manifestKey = JSON.stringify({
|
993
993
|
lockboxUuid,
|
@@ -995,7 +995,7 @@ export class OroClient {
|
|
995
995
|
expandPrivateMetadata,
|
996
996
|
lockboxOwnerUuid,
|
997
997
|
})
|
998
|
-
if (!forceRefresh && this.cachedManifest[manifestKey]) return this.cachedManifest[manifestKey]
|
998
|
+
if (!options.forceRefresh && this.cachedManifest[manifestKey]) return this.cachedManifest[manifestKey]
|
999
999
|
|
1000
1000
|
return this.vaultClient.lockboxManifestGet(lockboxUuid, filter, lockboxOwnerUuid).then((manifest) => {
|
1001
1001
|
return Promise.all(
|
@@ -1096,11 +1096,10 @@ export class OroClient {
|
|
1096
1096
|
const identificationDataUuid = (
|
1097
1097
|
await this.getLockboxManifest(
|
1098
1098
|
lockboxUuid,
|
1099
|
-
|
1100
1099
|
filter,
|
1101
1100
|
false,
|
1102
1101
|
grant.lockboxOwnerUuid,
|
1103
|
-
true
|
1102
|
+
{ forceRefresh: true }
|
1104
1103
|
)
|
1105
1104
|
)[0].dataUuid
|
1106
1105
|
|
@@ -1253,7 +1252,7 @@ export class OroClient {
|
|
1253
1252
|
*/
|
1254
1253
|
public async getPatientConsultationData(
|
1255
1254
|
consultationId: Uuid,
|
1256
|
-
forceRefresh: boolean = false
|
1255
|
+
options: { forceRefresh: boolean } = { forceRefresh: false }
|
1257
1256
|
): Promise<PopulatedWorkflowData[]> {
|
1258
1257
|
//TODO: make use of getPatientDocumentsList instead of doing it manually here
|
1259
1258
|
return Promise.all(
|
@@ -1268,7 +1267,7 @@ export class OroClient {
|
|
1268
1267
|
},
|
1269
1268
|
true,
|
1270
1269
|
grant.lockboxOwnerUuid,
|
1271
|
-
|
1270
|
+
options
|
1272
1271
|
).then((manifest) =>
|
1273
1272
|
Promise.all(
|
1274
1273
|
manifest.map((e) =>
|
@@ -1373,7 +1372,7 @@ export class OroClient {
|
|
1373
1372
|
{ ...filters, consultationId },
|
1374
1373
|
expandPrivateMetadata,
|
1375
1374
|
grant.lockboxOwnerUuid,
|
1376
|
-
true
|
1375
|
+
{ forceRefresh: true }
|
1377
1376
|
).then((manifest) =>
|
1378
1377
|
Promise.all(
|
1379
1378
|
manifest.map(async (entry): Promise<Document> => {
|
@@ -1554,7 +1553,7 @@ export class OroClient {
|
|
1554
1553
|
contentType: 'application/json',
|
1555
1554
|
},
|
1556
1555
|
{},
|
1557
|
-
true
|
1556
|
+
{ forceReplace: true }
|
1558
1557
|
)
|
1559
1558
|
|
1560
1559
|
return updatedIdentity
|
@@ -168,10 +168,10 @@ export async function registerPatient(
|
|
168
168
|
oroClient,
|
169
169
|
onProgress
|
170
170
|
? {
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
171
|
+
onProgress,
|
172
|
+
currentStep,
|
173
|
+
stepsTotalNum,
|
174
|
+
}
|
175
175
|
: undefined
|
176
176
|
).catch((err) => {
|
177
177
|
console.error('[SDK: registration] Some errors happened during image upload', err)
|
@@ -339,8 +339,8 @@ async function storePatientData(
|
|
339
339
|
consultationId, // TODO: deprecated. Will finally only be in privateMetadata
|
340
340
|
},
|
341
341
|
{ consultationId },
|
342
|
-
|
343
|
-
|
342
|
+
{ withNotification: true },
|
343
|
+
// the only data that needs to include an email notification
|
344
344
|
)
|
345
345
|
),
|
346
346
|
getWorkflowDataByCategory(workflow, MetadataCategory.Medical).then((data) =>
|
@@ -439,11 +439,11 @@ async function storeImageAliases(
|
|
439
439
|
Math.round(
|
440
440
|
((progress.currentStep + 1) / progress.stepsTotalNum -
|
441
441
|
progress.currentStep / progress.stepsTotalNum) *
|
442
|
-
|
442
|
+
100
|
443
443
|
) / 100
|
444
444
|
progress.onProgress(
|
445
445
|
progress.currentStep / progress.stepsTotalNum +
|
446
|
-
|
446
|
+
progressStepValue * (storedImagesNum / totalImagesNum),
|
447
447
|
'store_images',
|
448
448
|
{
|
449
449
|
storedImagesNum,
|
@@ -43,84 +43,84 @@ export function getRefillAnswersAsWorkflow(
|
|
43
43
|
if (pharmacy) selectedAnswers.push({ ['pharmacy']: JSON.stringify(pharmacy) })
|
44
44
|
|
45
45
|
return {
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
id: '32573a20-6f1d-49be-9ad3-b87c58074979',
|
47
|
+
createdAt: '2022-10-03T00:00:00.000Z',
|
48
|
+
culDeSacs: [],
|
49
|
+
hidePlanRules: [],
|
50
|
+
pages: [
|
51
51
|
{
|
52
|
-
|
53
|
-
|
52
|
+
title: 'Prescription Refill',
|
53
|
+
groups: [
|
54
54
|
{
|
55
|
-
|
56
|
-
|
55
|
+
type: 'field-group',
|
56
|
+
fieldsAndGroups: [
|
57
57
|
{
|
58
|
-
|
59
|
-
|
58
|
+
type: 'field',
|
59
|
+
id: 'isTreatmentWorking',
|
60
60
|
},
|
61
61
|
{
|
62
|
-
|
63
|
-
|
62
|
+
type: 'field',
|
63
|
+
id: 'hasSideEffects',
|
64
64
|
},
|
65
65
|
{
|
66
|
-
|
67
|
-
|
66
|
+
type: 'field',
|
67
|
+
id: 'youPharmacy',
|
68
68
|
},
|
69
69
|
{
|
70
|
-
|
71
|
-
|
72
|
-
}
|
73
|
-
]
|
74
|
-
}
|
70
|
+
type: 'field',
|
71
|
+
id: 'youAddress',
|
72
|
+
},
|
73
|
+
],
|
74
|
+
},
|
75
75
|
],
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
questions: {
|
77
|
+
isTreatmentWorking: {
|
78
|
+
label: 'Is the treatment working for you?',
|
79
|
+
kind: 'radio',
|
80
|
+
inline: true,
|
81
|
+
inlineLabel: false,
|
82
|
+
metaCategory: MetadataCategory.Refill,
|
83
|
+
answers: {
|
84
|
+
'73bec6eb-0310-4787-af3c-ac9c291737b2': {
|
85
|
+
text: 'Yes',
|
86
|
+
},
|
87
|
+
'e193951f-986f-4db3-bede-903045a1804a': {
|
88
|
+
text: 'No',
|
86
89
|
},
|
87
|
-
|
88
|
-
"text": "No"
|
89
|
-
}
|
90
|
-
}
|
90
|
+
},
|
91
91
|
},
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
hasSideEffects: {
|
93
|
+
label: 'Are there any side effects',
|
94
|
+
kind: 'radio',
|
95
|
+
inline: true,
|
96
|
+
inlineLabel: false,
|
97
|
+
metaCategory: MetadataCategory.Refill,
|
98
|
+
answers: {
|
99
|
+
'1b87ad22-d316-4fac-9c7f-8f4ccb841aed': {
|
100
|
+
text: 'Yes',
|
101
101
|
},
|
102
|
-
|
103
|
-
|
104
|
-
}
|
105
|
-
}
|
102
|
+
'ab7f5a41-c351-4f5d-a568-e38f9f200e9a': {
|
103
|
+
text: 'No',
|
104
|
+
},
|
105
|
+
},
|
106
|
+
},
|
107
|
+
youPharmacy: {
|
108
|
+
kind: 'online-pharmacy-picker',
|
109
|
+
label: 'Which pharmacy do you want the prescription sent to?',
|
110
|
+
metaCategory: MetadataCategory.Refill,
|
111
|
+
minorLabel: ' (Optional)',
|
112
|
+
summaryLabel: 'Your pharmacy',
|
106
113
|
},
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
"minorLabel": " (Optional)",
|
112
|
-
"summaryLabel": "Your pharmacy"
|
114
|
+
youAddress: {
|
115
|
+
kind: 'place-address',
|
116
|
+
label: 'Address',
|
117
|
+
metaCategory: MetadataCategory.Refill,
|
113
118
|
},
|
114
|
-
|
115
|
-
|
116
|
-
"label": "Address",
|
117
|
-
"metaCategory": MetadataCategory.Refill
|
118
|
-
}
|
119
|
-
}
|
120
|
-
}
|
119
|
+
},
|
120
|
+
},
|
121
121
|
],
|
122
|
-
|
123
|
-
selectedAnswers
|
122
|
+
locale: 'en',
|
123
|
+
selectedAnswers,
|
124
124
|
}
|
125
125
|
}
|
126
126
|
|
@@ -156,7 +156,8 @@ export async function createRefill(
|
|
156
156
|
documentType: DocumentType.PopulatedWorkflowData,
|
157
157
|
consultationIds: [newConsult.uuid],
|
158
158
|
},
|
159
|
-
{}
|
159
|
+
{},
|
160
|
+
{ withNotification: true }
|
160
161
|
)
|
161
162
|
.catch((err) => {
|
162
163
|
console.error('[SDK: prescription refill] Some errors happened during refill data upload', err)
|
package/LICENSE
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2021 ORO Health Inc.
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
-
SOFTWARE.
|