@icure/api 7.1.34 → 7.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/icc-api/api/IccAuthApi.d.ts +1 -0
  2. package/icc-api/api/IccAuthApi.js +1 -0
  3. package/icc-api/api/IccAuthApi.js.map +1 -1
  4. package/icc-x-api/index.d.ts +22 -29
  5. package/icc-x-api/index.js +60 -38
  6. package/icc-x-api/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  9. package/test/icc-api/api/IccDocumentApi.js +200 -0
  10. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  11. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  12. package/test/icc-api/api/IccGroupApi.js +50 -0
  13. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  14. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  15. package/test/icc-api/api/IccRoleApi.js +34 -0
  16. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  17. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  18. package/test/icc-api/api/IccUserApi.js +80 -0
  19. package/test/icc-api/api/IccUserApi.js.map +1 -0
  20. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  21. package/test/icc-api/e2e/IccCalendarItemApi.js +45 -0
  22. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  23. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  24. package/test/icc-api/model/modelHelpersTest.js +45 -0
  25. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  26. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  27. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  28. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  29. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  30. package/test/icc-x-api/auth/jwt-concurrency-test.js +113 -0
  31. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  32. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  33. package/test/icc-x-api/auth/smart-auth-provider-test.js +222 -0
  34. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  35. package/test/icc-x-api/crypto/KeyManager-test.d.ts +1 -0
  36. package/test/icc-x-api/crypto/KeyManager-test.js +225 -0
  37. package/test/icc-x-api/crypto/KeyManager-test.js.map +1 -0
  38. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  39. package/test/icc-x-api/crypto/concurrency.js +35 -0
  40. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  41. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  42. package/test/icc-x-api/crypto/crypto-utils.js +80 -0
  43. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  44. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  45. package/test/icc-x-api/crypto/cryptoTest.js +275 -0
  46. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  47. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  48. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +132 -0
  49. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  50. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  51. package/test/icc-x-api/crypto/full-crypto-test.js +458 -0
  52. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  53. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  54. package/test/icc-x-api/crypto/shamir.js +156 -0
  55. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  56. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  57. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +75 -0
  58. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  59. package/test/icc-x-api/data-compatibility-test-7to6.d.ts +1 -0
  60. package/test/icc-x-api/data-compatibility-test-7to6.js +343 -0
  61. package/test/icc-x-api/data-compatibility-test-7to6.js.map +1 -0
  62. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  63. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  64. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  65. package/test/icc-x-api/filters/filters.d.ts +1 -0
  66. package/test/icc-x-api/filters/filters.js +49 -0
  67. package/test/icc-x-api/filters/filters.js.map +1 -0
  68. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  69. package/test/icc-x-api/icc-accesslog-x-api.js +121 -0
  70. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  71. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  72. package/test/icc-x-api/icc-auth-api.js +46 -0
  73. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  74. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  75. package/test/icc-x-api/icc-calendar-item-x-api.js +146 -0
  76. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  77. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  78. package/test/icc-x-api/icc-contact-x-api.js +311 -0
  79. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  80. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  81. package/test/icc-x-api/icc-form-x-api.js +331 -0
  82. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  83. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  84. package/test/icc-x-api/icc-helement-x-api-test.js +158 -0
  85. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  86. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  87. package/test/icc-x-api/icc-invoice-x-api.js +115 -0
  88. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  89. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  90. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +230 -0
  91. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  92. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  93. package/test/icc-x-api/icc-patient-x-api-test.js +169 -0
  94. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  95. package/test/icc-x-api/icc-time-table-x-api.d.ts +1 -0
  96. package/test/icc-x-api/icc-time-table-x-api.js +110 -0
  97. package/test/icc-x-api/icc-time-table-x-api.js.map +1 -0
  98. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  99. package/test/icc-x-api/icc-user-x-api-test.js +108 -0
  100. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  101. package/test/icc-x-api/icureapi-group-test.d.ts +1 -0
  102. package/test/icc-x-api/icureapi-group-test.js +130 -0
  103. package/test/icc-x-api/icureapi-group-test.js.map +1 -0
  104. package/test/icc-x-api/patient-user.d.ts +2 -0
  105. package/test/icc-x-api/patient-user.js +117 -0
  106. package/test/icc-x-api/patient-user.js.map +1 -0
  107. package/test/icc-x-api/storage/storage.d.ts +1 -0
  108. package/test/icc-x-api/storage/storage.js +50 -0
  109. package/test/icc-x-api/storage/storage.js.map +1 -0
  110. package/test/icc-x-api/subscription-apis.d.ts +2 -0
  111. package/test/icc-x-api/subscription-apis.js +498 -0
  112. package/test/icc-x-api/subscription-apis.js.map +1 -0
  113. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  114. package/test/icc-x-api/test-api-no-parent.js +79 -0
  115. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  116. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  117. package/test/icc-x-api/test-legacy-data-support.js +231 -0
  118. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  119. package/test/icc-x-api/utils/crypto-utils-test.d.ts +1 -0
  120. package/test/icc-x-api/utils/crypto-utils-test.js +586 -0
  121. package/test/icc-x-api/utils/crypto-utils-test.js.map +1 -0
  122. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  123. package/test/icc-x-api/utils/graph-test.js +54 -0
  124. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  125. package/test/support/CSM-185.d.ts +1 -0
  126. package/test/support/CSM-185.js +120 -0
  127. package/test/support/CSM-185.js.map +1 -0
  128. package/test/support/CSM-87.d.ts +0 -0
  129. package/test/support/CSM-87.js +21 -0
  130. package/test/support/CSM-87.js.map +1 -0
  131. package/test/support/CSM-93.d.ts +1 -0
  132. package/test/support/CSM-93.js +111 -0
  133. package/test/support/CSM-93.js.map +1 -0
  134. package/test/utils/TestApi.d.ts +3 -0
  135. package/test/utils/TestApi.js +27 -0
  136. package/test/utils/TestApi.js.map +1 -0
  137. package/test/utils/TestCollectionUtils.d.ts +1 -0
  138. package/test/utils/TestCollectionUtils.js +109 -0
  139. package/test/utils/TestCollectionUtils.js.map +1 -0
  140. package/test/utils/TestCryptoStrategies.d.ts +37 -0
  141. package/test/utils/TestCryptoStrategies.js +72 -0
  142. package/test/utils/TestCryptoStrategies.js.map +1 -0
  143. package/test/utils/TestStorage.d.ts +31 -0
  144. package/test/utils/TestStorage.js +88 -0
  145. package/test/utils/TestStorage.js.map +1 -0
  146. package/test/utils/test_utils.d.ts +60 -0
  147. package/test/utils/test_utils.js +313 -0
  148. package/test/utils/test_utils.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-patient-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-patient-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\n\nimport 'isomorphic-fetch'\n\nimport { Patient } from '../../icc-api/model/Patient'\nimport { assert, expect } from 'chai'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, hcp3Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { ua2b64 } from '../../icc-x-api'\nimport exp = require('constants')\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('icc-x-patient-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('CreatePatientWithUser Success for HCP', async () => {\n // Given\n const {\n userApi: userApiForHcp,\n dataOwnerApi: dataOwnerApiForHcp,\n patientApi: patientApiForHcp,\n cryptoApi: cryptoApiForHcp,\n } = await initApi(env, hcp1Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const patientToCreate = await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n\n // When\n const createdPatient = await patientApiForHcp.createPatientWithUser(hcpUser, patientToCreate)\n\n // Then\n const readPatient = await patientApiForHcp.getPatientWithUser(hcpUser, createdPatient.id!)\n assert(readPatient != null)\n assert(readPatient.id != null)\n assert(readPatient.note == patientToCreate.note)\n assert(readPatient.firstName == patientToCreate.firstName)\n assert(readPatient.lastName == patientToCreate.lastName)\n assert(readPatient.delegations![hcpUser.healthcarePartyId!].length > 0)\n assert(readPatient.encryptionKeys![hcpUser.healthcarePartyId!].length > 0)\n })\n\n it('Merge patients should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const api3 = await initApi(env!, hcp3Username)\n const user3 = await api3.userApi.getCurrentUser()\n const mergedFirstName = 'Gigio'\n const mergedLastName = 'Bagigio'\n const mergedAlias = 'Luigio'\n const mergedNote = 'A secret note'\n const patientFrom = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: mergedFirstName,\n lastName: 'From',\n note: 'A',\n },\n { additionalDelegates: { [user2.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientFromSecretIds = await api1.patientApi.decryptSecretIdsOf(patientFrom)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n const patientInto = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: 'Into',\n lastName: mergedLastName,\n note: 'B',\n },\n { additionalDelegates: { [user3.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientIntoSecretIds = await api1.patientApi.decryptSecretIdsOf(patientInto)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n expect(patientIntoSecretIds[0]).to.not.equal(patientFromSecretIds[0])\n const mergedInto = {\n ...patientInto,\n firstName: mergedFirstName,\n lastName: mergedLastName,\n alias: mergedAlias,\n note: mergedNote,\n }\n const mergedPatient = await api1.patientApi.mergePatients(patientFrom, mergedInto)\n expect(mergedPatient.firstName).to.equal(mergedFirstName)\n expect(mergedPatient.lastName).to.equal(mergedLastName)\n expect(mergedPatient.alias).to.equal(mergedAlias)\n expect(mergedPatient.note).to.equal(mergedNote)\n expect(await api1.patientApi.decryptSecretIdsOf(mergedPatient)).to.have.members([...patientFromSecretIds, ...patientIntoSecretIds])\n const retrievedByDelegateWithAccessToInto = await api3.patientApi.getPatientWithUser(user3, patientInto.id!)\n expect(retrievedByDelegateWithAccessToInto.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToInto.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToInto.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToInto.note).to.equal(mergedNote)\n expect(await api3.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToInto)).to.have.members(patientIntoSecretIds)\n const retrievedByDelegateWithAccessToFrom = await api2.patientApi.getPatientWithUser(user2, patientInto.id!)\n expect(retrievedByDelegateWithAccessToFrom.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToFrom.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToFrom.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToFrom.note).to.be.undefined // No access to new encryption key yet\n expect(await api2.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToFrom)).to.have.members(patientFromSecretIds)\n })\n\n it('Share with should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const encryptedField = 'Something encrypted'\n const entity = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio', note: encryptedField })\n )\n expect(entity.note).to.be.equal(encryptedField)\n const secretIds = await api1.patientApi.decryptSecretIdsOf(entity)\n await api2.patientApi\n .getPatientWithUser(user2, entity.id)\n .then(() => {\n throw new Error('Should not be able to get the entity')\n })\n .catch(() => {\n /* expected */\n })\n await api1.patientApi.shareWith(user2.healthcarePartyId!, entity, secretIds)\n const retrieved = await api2.patientApi.getPatientWithUser(user2, entity.id)\n expect(retrieved.note).to.be.equal(encryptedField)\n expect(await api2.patientApi.decryptSecretIdsOf(retrieved)).to.have.members(secretIds)\n })\n\n it('newInstance should honor non-default values unless they are undefined', async () => {\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patientUndefinedId = await api.patientApi.newInstance(user, { id: undefined })\n const customId = 'customId'\n const patientCustomId = await api.patientApi.newInstance(user, { id: customId })\n const patientWithUndefinedId = await api.patientApi.newInstance(user, undefined)\n expect(patientUndefinedId.id).to.not.be.undefined\n expect(patientWithUndefinedId.id).to.not.be.undefined\n expect(patientCustomId.id).to.equal(customId)\n })\n\n it('Patient picture should be automatically decoded from base64 on initialisation.', async () => {\n const pictureAB = randomBytes(100)\n const pictureBase64 = ua2b64(pictureAB)\n const patient = new Patient({ picture: pictureBase64 })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('Creating a new Patient instance using a patient with decoded picture should not lose the picture data', async () => {\n const pictureAB = randomBytes(100)\n const patient = new Patient({ picture: new Uint8Array(pictureAB) })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('A Patient with picture data should be created and retrieved correctly', async () => {\n const pictureAB = randomBytes(100)\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, { firstName: 'Giovanni', lastName: 'Giorgio', picture: new Uint8Array(pictureAB) })\n )\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("isomorphic-fetch");
13
+ const mocha_1 = require("mocha");
14
+ const test_utils_1 = require("../utils/test_utils");
15
+ var initApi = test_utils_1.TestUtils.initApi;
16
+ const crypto_1 = require("crypto");
17
+ const TimeTable_1 = require("../../icc-api/model/TimeTable");
18
+ const Code_1 = require("../../icc-api/model/Code");
19
+ const TimeTableItem_1 = require("../../icc-api/model/TimeTableItem");
20
+ const TimeTableHour_1 = require("../../icc-api/model/TimeTableHour");
21
+ const chai_1 = require("chai");
22
+ const types_1 = require("@icure/test-setup/types");
23
+ (0, test_utils_1.setLocalStorage)(fetch);
24
+ let env;
25
+ function instanceTimeTableFor(timeTableApi, user) {
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ return timeTableApi.newInstance(user, new TimeTable_1.TimeTable({
28
+ id: (0, crypto_1.randomUUID)(),
29
+ tags: [
30
+ new Code_1.Code({
31
+ id: 'ICURE|MY-CODE|1',
32
+ code: 'MY-CODE',
33
+ type: 'ICURE',
34
+ version: '1',
35
+ }),
36
+ ],
37
+ name: 'Main TimeTable',
38
+ startTime: 20221101000,
39
+ endTime: 20221128000,
40
+ items: [
41
+ new TimeTableItem_1.TimeTableItem({
42
+ id: (0, crypto_1.randomUUID)(),
43
+ rrule: 'RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=10',
44
+ days: ['monday', 'tuesday', 'thursday'],
45
+ hours: [
46
+ new TimeTableHour_1.TimeTableHour({
47
+ startHour: 1000,
48
+ endHour: 1800,
49
+ }),
50
+ ],
51
+ }),
52
+ ],
53
+ }));
54
+ });
55
+ }
56
+ describe('icc-x-time-table-api Tests', () => {
57
+ (0, mocha_1.before)(function () {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ this.timeout(600000);
60
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
61
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
62
+ });
63
+ });
64
+ it('Create TimeTable Success', () => __awaiter(void 0, void 0, void 0, function* () {
65
+ // Given
66
+ const { userApi: userApiForHcp, timetableApi: timeTableApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
67
+ const hcpUser = yield userApiForHcp.getCurrentUser();
68
+ const baseTimeTable = yield instanceTimeTableFor(timeTableApiForHcp, hcpUser);
69
+ (0, chai_1.expect)(Object.keys(baseTimeTable.delegations).length).to.equals(1);
70
+ // TODO old test, now we want to always create encryption keys on all entities, right?
71
+ // expect(baseTimeTable.encryptionKeys).to.be.undefined
72
+ // When
73
+ const createdTimeTable = yield timeTableApiForHcp.createTimeTable(baseTimeTable);
74
+ // Then
75
+ (0, chai_1.expect)(createdTimeTable.id).to.equals(baseTimeTable.id);
76
+ (0, chai_1.expect)(createdTimeTable.name).to.equals(baseTimeTable.name);
77
+ (0, chai_1.expect)(createdTimeTable.startTime).to.equals(baseTimeTable.startTime);
78
+ (0, chai_1.expect)(createdTimeTable.items.length).to.equals(1);
79
+ }));
80
+ it('Share with should work as expected', () => __awaiter(void 0, void 0, void 0, function* () {
81
+ const api1 = yield initApi(env, test_utils_1.hcp1Username);
82
+ const user1 = yield api1.userApi.getCurrentUser();
83
+ const api2 = yield initApi(env, test_utils_1.hcp2Username);
84
+ const user2 = yield api2.userApi.getCurrentUser();
85
+ const entity = (yield api1.timetableApi.createTimeTable(yield api1.timetableApi.newInstance(user1, {})));
86
+ yield api2.timetableApi
87
+ .getTimeTable(entity.id)
88
+ .then(() => {
89
+ throw new Error('Should not be able to get the entity');
90
+ })
91
+ .catch(() => {
92
+ /* expected */
93
+ });
94
+ yield api1.timetableApi.shareWith(user2.healthcarePartyId, entity);
95
+ const retrieved = yield api2.timetableApi.getTimeTable(entity.id);
96
+ (0, chai_1.expect)(retrieved.id).to.equal(entity.id);
97
+ }));
98
+ it('newInstance should honor non-default values unless they are undefined', () => __awaiter(void 0, void 0, void 0, function* () {
99
+ const api = yield initApi(env, test_utils_1.hcp1Username);
100
+ const user = yield api.userApi.getCurrentUser();
101
+ const timeTableUndefinedId = yield api.timetableApi.newInstance(user, { id: undefined });
102
+ const customId = 'customId';
103
+ const timeTableCustomId = yield api.timetableApi.newInstance(user, { id: customId });
104
+ const timeTableWithUndefinedInit = yield api.timetableApi.newInstance(user, undefined);
105
+ (0, chai_1.expect)(timeTableUndefinedId.id).to.not.be.undefined;
106
+ (0, chai_1.expect)(timeTableWithUndefinedInit.id).to.not.be.undefined;
107
+ (0, chai_1.expect)(timeTableCustomId.id).to.equal(customId);
108
+ }));
109
+ });
110
+ //# sourceMappingURL=icc-time-table-x-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-time-table-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-time-table-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\n\nimport { before } from 'mocha'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { IccTimeTableXApi } from '../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { TimeTable } from '../../icc-api/model/TimeTable'\nimport { Code } from '../../icc-api/model/Code'\nimport { TimeTableItem } from '../../icc-api/model/TimeTableItem'\nimport { TimeTableHour } from '../../icc-api/model/TimeTableHour'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { PropertyStub } from '../../icc-api/model/PropertyStub'\nimport { PropertyTypeStub } from '../../icc-api/model/PropertyTypeStub'\nimport { TypedValueObject } from '../../icc-api/model/TypedValueObject'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\nasync function instanceTimeTableFor(timeTableApi: IccTimeTableXApi, user: User): Promise<TimeTable> {\n return timeTableApi.newInstance(\n user,\n new TimeTable({\n id: randomUUID(),\n tags: [\n new Code({\n id: 'ICURE|MY-CODE|1',\n code: 'MY-CODE',\n type: 'ICURE',\n version: '1',\n }),\n ],\n name: 'Main TimeTable',\n startTime: 20221101000,\n endTime: 20221128000,\n items: [\n new TimeTableItem({\n id: randomUUID(),\n rrule: 'RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=10',\n days: ['monday', 'tuesday', 'thursday'],\n hours: [\n new TimeTableHour({\n startHour: 1000,\n endHour: 1800,\n }),\n ],\n }),\n ],\n })\n )\n}\n\ndescribe('icc-x-time-table-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('Create TimeTable Success', async () => {\n // Given\n const { userApi: userApiForHcp, timetableApi: timeTableApiForHcp } = await initApi(env, hcp1Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const baseTimeTable = await instanceTimeTableFor(timeTableApiForHcp, hcpUser)\n expect(Object.keys(baseTimeTable.delegations!).length).to.equals(1)\n // TODO old test, now we want to always create encryption keys on all entities, right?\n // expect(baseTimeTable.encryptionKeys).to.be.undefined\n\n // When\n const createdTimeTable = await timeTableApiForHcp.createTimeTable(baseTimeTable)\n\n // Then\n expect(createdTimeTable.id).to.equals(baseTimeTable.id)\n expect(createdTimeTable.name).to.equals(baseTimeTable.name)\n expect(createdTimeTable.startTime).to.equals(baseTimeTable.startTime)\n expect(createdTimeTable.items!.length).to.equals(1)\n })\n\n it('Share with should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const entity = (await api1.timetableApi.createTimeTable(await api1.timetableApi.newInstance(user1, {})))!\n await api2.timetableApi\n .getTimeTable(entity.id!)\n .then(() => {\n throw new Error('Should not be able to get the entity')\n })\n .catch(() => {\n /* expected */\n })\n await api1.timetableApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.timetableApi.getTimeTable(entity.id!)\n expect(retrieved.id).to.equal(entity.id)\n })\n\n it('newInstance should honor non-default values unless they are undefined', async () => {\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const timeTableUndefinedId = await api.timetableApi.newInstance(user, { id: undefined })\n const customId = 'customId'\n const timeTableCustomId = await api.timetableApi.newInstance(user, { id: customId })\n const timeTableWithUndefinedInit = await api.timetableApi.newInstance(user, undefined as any)\n expect(timeTableUndefinedId.id).to.not.be.undefined\n expect(timeTableWithUndefinedInit.id).to.not.be.undefined\n expect(timeTableCustomId.id).to.equal(customId)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("../utils/test_utils");
13
+ const mocha_1 = require("mocha");
14
+ const node_compat_1 = require("../../node-compat");
15
+ const TestApi_1 = require("../utils/TestApi");
16
+ const types_1 = require("@icure/test-setup/types");
17
+ const icc_x_api_1 = require("../../icc-x-api");
18
+ const crypto_1 = require("crypto");
19
+ const chai_1 = require("chai");
20
+ const User_1 = require("../../icc-api/model/User");
21
+ const uuid_1 = require("uuid");
22
+ var initMasterApi = test_utils_1.TestUtils.initMasterApi;
23
+ const SmartAuthProvider_1 = require("../../icc-x-api/auth/SmartAuthProvider");
24
+ const crypto_2 = require("crypto");
25
+ const icc_api_1 = require("../../icc-api");
26
+ (0, test_utils_1.setLocalStorage)(fetch);
27
+ let env;
28
+ let authApi;
29
+ describe('icc-x-user-api Tests', () => {
30
+ (0, mocha_1.before)(function () {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ this.timeout(600000);
33
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
34
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
35
+ authApi = new icc_api_1.IccAuthApi(env.iCureUrl, {}, new icc_x_api_1.NoAuthenticationProvider(), fetch);
36
+ });
37
+ });
38
+ function userApiWithProvider(authProvider) {
39
+ return new icc_x_api_1.IccUserXApi(env.iCureUrl, {}, authProvider, new icc_api_1.IccAuthApi(env.iCureUrl, {}, new icc_x_api_1.NoAuthenticationProvider(), fetch));
40
+ }
41
+ it('Can instantiate an API and get the current user', () => __awaiter(void 0, void 0, void 0, function* () {
42
+ // Given
43
+ const api = yield (0, TestApi_1.TestApi)(env.iCureUrl, env.dataOwnerDetails[test_utils_1.hcp1Username].user, env.dataOwnerDetails[test_utils_1.hcp1Username].password, node_compat_1.crypto);
44
+ yield api.userApi.getCurrentUser();
45
+ }));
46
+ it('Can get an user by its phoneNumber', () => __awaiter(void 0, void 0, void 0, function* () {
47
+ const primitives = new icc_x_api_1.CryptoPrimitives(crypto_1.webcrypto);
48
+ const phoneNumber = `+${primitives.randomUuid()}`;
49
+ const api = yield initMasterApi(env);
50
+ const createdUser = yield api.userApi.createUser(new User_1.User({
51
+ id: (0, uuid_1.v4)(),
52
+ name: `user-${primitives.randomUuid()}`,
53
+ login: `user-${primitives.randomUuid()}`,
54
+ email: `user-${primitives.randomUuid()}@icure.com`,
55
+ mobilePhone: phoneNumber,
56
+ }));
57
+ const user = yield api.userApi.getUserByPhoneNumber(phoneNumber);
58
+ (0, chai_1.expect)(user).to.be.deep.equal(Object.assign(Object.assign({}, createdUser), { systemMetadata: user.systemMetadata }));
59
+ }));
60
+ it('Should automatically ask for a more powerful secret to perform elevated-security operations if the available secret/token is not good enough. When a new token is created during this process, the modifyUser does not fail with a 409', () => __awaiter(void 0, void 0, void 0, function* () {
61
+ const { credentials, api } = yield (0, test_utils_1.createNewHcpApi)(env);
62
+ const initialUser = yield api.userApi.getCurrentUser();
63
+ const masterApi = yield initMasterApi(env);
64
+ const userToken = (0, crypto_2.randomUUID)();
65
+ const userWithLongToken = yield masterApi.userApi.modifyUser(Object.assign(Object.assign({}, initialUser), { authenticationTokens: {
66
+ 'test-long-lived-token': {
67
+ token: userToken,
68
+ creationTime: Date.now(),
69
+ validity: 60 * 60 * 24 * 7,
70
+ },
71
+ } }));
72
+ let longLivedTokenRequested = false;
73
+ let shortLivedTokenRequested = false;
74
+ let getSecret = (acceptedSecrets, previousAttempts) => __awaiter(void 0, void 0, void 0, function* () {
75
+ if (acceptedSecrets.includes(icc_x_api_1.AuthSecretType.LONG_LIVED_TOKEN)) {
76
+ longLivedTokenRequested = true;
77
+ return { value: userToken, secretType: icc_x_api_1.AuthSecretType.LONG_LIVED_TOKEN };
78
+ }
79
+ else if (acceptedSecrets.includes(icc_x_api_1.AuthSecretType.SHORT_LIVED_TOKEN)) {
80
+ shortLivedTokenRequested = true;
81
+ yield masterApi.userApi.getToken(userWithLongToken.id, 'tmp', 300, '123456');
82
+ return { value: '123456', secretType: icc_x_api_1.AuthSecretType.SHORT_LIVED_TOKEN };
83
+ }
84
+ else
85
+ chai_1.assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN');
86
+ });
87
+ const userApi = userApiWithProvider(SmartAuthProvider_1.SmartAuthProvider.initialise(authApi, credentials.user, { getSecret }));
88
+ (0, chai_1.expect)((yield userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev);
89
+ (0, chai_1.expect)(longLivedTokenRequested).to.be.true;
90
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.false;
91
+ const newPw = (0, crypto_2.randomUUID)();
92
+ const userWithNewPw = yield userApi.modifyUser(Object.assign(Object.assign({}, userWithLongToken), { passwordHash: newPw }));
93
+ (0, chai_1.expect)(userWithNewPw.rev).to.not.equal(userWithLongToken.rev);
94
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.true;
95
+ longLivedTokenRequested = false;
96
+ shortLivedTokenRequested = false;
97
+ const otherUserApi = userApiWithProvider(SmartAuthProvider_1.SmartAuthProvider.initialise(authApi, credentials.user, { getSecret }));
98
+ (0, chai_1.expect)((yield otherUserApi.getCurrentUser()).rev).to.equal(userWithNewPw.rev);
99
+ (0, chai_1.expect)(longLivedTokenRequested).to.be.true;
100
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.false;
101
+ const newerPw = (0, crypto_2.randomUUID)();
102
+ const userInGroupWithNewPw = yield otherUserApi.modifyUserInGroup(initialUser.groupId, Object.assign(Object.assign({}, userWithNewPw), { passwordHash: newerPw }));
103
+ (0, chai_1.expect)(userInGroupWithNewPw.rev).to.not.equal(userWithNewPw.rev);
104
+ (0, chai_1.expect)(longLivedTokenRequested).to.be.true;
105
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.true;
106
+ }));
107
+ });
108
+ //# sourceMappingURL=icc-user-x-api-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-user-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-user-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, hcp1Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport { crypto } from '../../node-compat'\nimport { TestApi } from '../utils/TestApi'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport {\n AuthenticationProvider,\n AuthSecretDetails,\n AuthSecretType,\n BasicAuthenticationProvider,\n CryptoPrimitives,\n IccUserXApi,\n NoAuthenticationProvider,\n} from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { assert, expect } from 'chai'\nimport { User } from '../../icc-api/model/User'\nimport { v4 as uuid } from 'uuid'\nimport initMasterApi = TestUtils.initMasterApi\nimport { SmartAuthProvider } from '../../icc-x-api/auth/SmartAuthProvider'\nimport { randomUUID } from 'crypto'\nimport { IccAuthApi, IccUserApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet authApi: IccAuthApi\n\ndescribe('icc-x-user-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n authApi = new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch)\n })\n\n function userApiWithProvider(authProvider: AuthenticationProvider): IccUserApi {\n return new IccUserXApi(env.iCureUrl, {}, authProvider, new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch))\n }\n\n it('Can instantiate an API and get the current user', async () => {\n // Given\n const api = await TestApi(env.iCureUrl, env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password, crypto)\n await api.userApi.getCurrentUser()\n })\n\n it('Can get an user by its phoneNumber', async () => {\n const primitives = new CryptoPrimitives(webcrypto as any)\n const phoneNumber = `+${primitives.randomUuid()}`\n\n const api = await initMasterApi(env)\n\n const createdUser = await api.userApi.createUser(\n new User({\n id: uuid(),\n name: `user-${primitives.randomUuid()}`,\n login: `user-${primitives.randomUuid()}`,\n email: `user-${primitives.randomUuid()}@icure.com`,\n mobilePhone: phoneNumber,\n })\n )\n\n const user = await api.userApi.getUserByPhoneNumber(phoneNumber)\n\n expect(user).to.be.deep.equal({\n ...createdUser,\n systemMetadata: user.systemMetadata,\n })\n })\n\n it('Should automatically ask for a more powerful secret to perform elevated-security operations if the available secret/token is not good enough. When a new token is created during this process, the modifyUser does not fail with a 409', async () => {\n const { credentials, api } = await createNewHcpApi(env)\n const initialUser = await api.userApi.getCurrentUser()\n const masterApi = await initMasterApi(env)\n const userToken = randomUUID()\n const userWithLongToken = await masterApi.userApi.modifyUser({\n ...initialUser,\n authenticationTokens: {\n 'test-long-lived-token': {\n token: userToken,\n creationTime: Date.now(),\n validity: 60 * 60 * 24 * 7,\n },\n },\n })\n let longLivedTokenRequested = false\n let shortLivedTokenRequested = false\n\n let getSecret = async (acceptedSecrets: AuthSecretType[], previousAttempts: AuthSecretDetails[]): Promise<AuthSecretDetails> => {\n if (acceptedSecrets.includes(AuthSecretType.LONG_LIVED_TOKEN)) {\n longLivedTokenRequested = true\n return { value: userToken, secretType: AuthSecretType.LONG_LIVED_TOKEN }\n } else if (acceptedSecrets.includes(AuthSecretType.SHORT_LIVED_TOKEN)) {\n shortLivedTokenRequested = true\n await masterApi.userApi.getToken(userWithLongToken.id!, 'tmp', 300, '123456')\n return { value: '123456', secretType: AuthSecretType.SHORT_LIVED_TOKEN }\n } else assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN')\n }\n const userApi = userApiWithProvider(SmartAuthProvider.initialise(authApi, credentials.user, { getSecret }))\n expect((await userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev)\n expect(longLivedTokenRequested).to.be.true\n expect(shortLivedTokenRequested).to.be.false\n\n const newPw = randomUUID()\n const userWithNewPw = await userApi.modifyUser({ ...userWithLongToken, passwordHash: newPw })\n\n expect(userWithNewPw.rev).to.not.equal(userWithLongToken.rev)\n expect(shortLivedTokenRequested).to.be.true\n\n longLivedTokenRequested = false\n shortLivedTokenRequested = false\n\n const otherUserApi = userApiWithProvider(SmartAuthProvider.initialise(authApi, credentials.user, { getSecret }))\n expect((await otherUserApi.getCurrentUser()).rev).to.equal(userWithNewPw.rev)\n\n expect(longLivedTokenRequested).to.be.true\n expect(shortLivedTokenRequested).to.be.false\n\n const newerPw = randomUUID()\n const userInGroupWithNewPw = await otherUserApi.modifyUserInGroup(initialUser.groupId!, { ...userWithNewPw, passwordHash: newerPw })\n\n expect(userInGroupWithNewPw.rev).to.not.equal(userWithNewPw.rev)\n\n expect(longLivedTokenRequested).to.be.true\n expect(shortLivedTokenRequested).to.be.true\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("../utils/test_utils");
13
+ const types_1 = require("@icure/test-setup/types");
14
+ const crypto_1 = require("crypto");
15
+ require("isomorphic-fetch");
16
+ const icc_x_api_1 = require("../../icc-x-api");
17
+ const CryptoPrimitives_1 = require("../../icc-x-api/crypto/CryptoPrimitives");
18
+ const icc_api_1 = require("../../icc-api");
19
+ const AuthenticationProvider_1 = require("../../icc-x-api/auth/AuthenticationProvider");
20
+ const chai_1 = require("chai");
21
+ const chaiAsPromised = require("chai-as-promised");
22
+ const TestCryptoStrategies_1 = require("../utils/TestCryptoStrategies");
23
+ const TestStorage_1 = require("../utils/TestStorage");
24
+ (0, chai_1.use)(chaiAsPromised);
25
+ (0, test_utils_1.setLocalStorage)(fetch);
26
+ describe('Icure api', function () {
27
+ let env;
28
+ const primitives = new CryptoPrimitives_1.CryptoPrimitives(crypto_1.webcrypto);
29
+ const userGroup1Id = primitives.randomUuid(); // Same username-pw as group 2
30
+ const userGroup2Id = primitives.randomUuid(); // Same username-pw as group 1
31
+ const userGroup3Id = primitives.randomUuid(); // Same username as group 1/2, different pw
32
+ const userLogin = `maria-${primitives.randomUuid()}@pompei.it`;
33
+ const userPw12 = `geppetto-${primitives.randomUuid()}`;
34
+ const userPw3 = `pinocchio-${primitives.randomUuid()}`;
35
+ let user1Id;
36
+ let user2Id;
37
+ let user3Id;
38
+ const hcp1Id = primitives.randomUuid();
39
+ const hcp2Id = primitives.randomUuid();
40
+ const hcp3Id = primitives.randomUuid();
41
+ let dataOwner1Pair;
42
+ let dataOwner2Pair;
43
+ let dataOwner3Pair;
44
+ before(function () {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ this.timeout(600000);
47
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
48
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
49
+ const api = yield icc_x_api_1.IcureBasicApi.initialise(env.iCureUrl, { username: 'john', password: 'LetMeIn' }, fetch);
50
+ function newGroupWithHcpUser(groupId, groupPrefix, userLogin, userPw, hcpId) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ yield api.groupApi.createGroup(groupId, `${groupPrefix}-${primitives.randomUuid()}`, primitives.randomUuid(), undefined, undefined, undefined, undefined, undefined, {});
53
+ const res = yield api.healthcarePartyApi.registerHealthcareParty(groupId, undefined, userPw, false, {
54
+ id: hcpId,
55
+ name: `${groupPrefix}-hcp-${primitives.randomUuid()}`,
56
+ addresses: [
57
+ {
58
+ telecoms: [
59
+ {
60
+ telecomType: 'email',
61
+ telecomNumber: userLogin,
62
+ },
63
+ ],
64
+ },
65
+ ],
66
+ });
67
+ (0, chai_1.expect)(res.userId).to.not.be.undefined;
68
+ return res.userId;
69
+ });
70
+ }
71
+ user1Id = yield newGroupWithHcpUser(userGroup1Id, 'group1', userLogin, userPw12, hcp1Id);
72
+ user2Id = yield newGroupWithHcpUser(userGroup2Id, 'group2', userLogin, userPw12, hcp2Id);
73
+ user3Id = yield newGroupWithHcpUser(userGroup3Id, 'group3', userLogin, userPw3, hcp3Id);
74
+ dataOwner1Pair = yield primitives.RSA.generateKeyPair();
75
+ dataOwner2Pair = yield primitives.RSA.generateKeyPair();
76
+ dataOwner3Pair = yield primitives.RSA.generateKeyPair();
77
+ console.log(`Waiting for user to be replicated - ${userLogin}`);
78
+ yield (0, icc_x_api_1.retry)(() => __awaiter(this, void 0, void 0, function* () {
79
+ yield new icc_api_1.IccUserApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(`${userGroup1Id}/${user1Id}`, userPw12), fetch).getCurrentUser();
80
+ yield new icc_api_1.IccUserApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(`${userGroup2Id}/${user2Id}`, userPw12), fetch).getCurrentUser();
81
+ yield new icc_api_1.IccUserApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(`${userGroup3Id}/${user3Id}`, userPw3), fetch).getCurrentUser();
82
+ }), 10, 5000, 1);
83
+ console.log('Users created');
84
+ });
85
+ });
86
+ it('if a user has only one group should be initialised on that group', () => __awaiter(this, void 0, void 0, function* () {
87
+ const api = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: userLogin, password: userPw3 }, new TestCryptoStrategies_1.TestCryptoStrategies(dataOwner3Pair), crypto_1.webcrypto, fetch, {
88
+ storage: new TestStorage_1.TestStorage(),
89
+ keyStorage: new TestStorage_1.TestKeyStorage(),
90
+ });
91
+ (0, chai_1.expect)((yield api.userApi.getCurrentUser()).id).to.equal(user3Id);
92
+ }));
93
+ it('if a user has more than one group should be initialised on different groups depending on the parameters passed values, and the api should be switchable to the other group after initialisation', () => __awaiter(this, void 0, void 0, function* () {
94
+ var _a, _b;
95
+ const storage = new TestStorage_1.TestStorage();
96
+ const keyStorage = new TestStorage_1.TestKeyStorage();
97
+ const api1 = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: userLogin, password: userPw12 }, new TestCryptoStrategies_1.TestCryptoStrategies(dataOwner1Pair), crypto_1.webcrypto, fetch, {
98
+ storage,
99
+ keyStorage,
100
+ groupSelector: (groups) => __awaiter(this, void 0, void 0, function* () {
101
+ (0, chai_1.expect)(groups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id]);
102
+ return userGroup1Id;
103
+ }),
104
+ });
105
+ (0, chai_1.expect)((yield api1.userApi.getCurrentUser()).id).to.equal(user1Id);
106
+ const key1PubHex = (0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(dataOwner1Pair.publicKey, 'spki'));
107
+ (0, chai_1.expect)(Object.keys(api1.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key1PubHex.slice(-32)]);
108
+ const api2 = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: userLogin, password: userPw12 }, new TestCryptoStrategies_1.TestCryptoStrategies(dataOwner2Pair), crypto_1.webcrypto, fetch, {
109
+ storage,
110
+ keyStorage,
111
+ groupSelector: (groups) => __awaiter(this, void 0, void 0, function* () {
112
+ (0, chai_1.expect)(groups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id]);
113
+ return userGroup2Id;
114
+ }),
115
+ });
116
+ (0, chai_1.expect)((yield api2.userApi.getCurrentUser()).id).to.equal(user2Id);
117
+ const key2PubHex = (0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(dataOwner2Pair.publicKey, 'spki'));
118
+ (0, chai_1.expect)(Object.keys(api2.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key2PubHex.slice(-32)]);
119
+ const api1GroupsInfo = yield api1.getGroupsInfo();
120
+ (0, chai_1.expect)(api1GroupsInfo.availableGroups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id]);
121
+ (0, chai_1.expect)((_a = api1GroupsInfo.currentGroup) === null || _a === void 0 ? void 0 : _a.groupId).to.equal(userGroup1Id);
122
+ const api1SwitchedTo2 = yield api1.switchGroup(userGroup2Id);
123
+ (0, chai_1.expect)((yield api1SwitchedTo2.userApi.getCurrentUser()).id).to.equal(user2Id);
124
+ (0, chai_1.expect)(Object.keys(api1SwitchedTo2.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key2PubHex.slice(-32)]);
125
+ const api1switchedTo2GroupsInfo = yield api1SwitchedTo2.getGroupsInfo();
126
+ (0, chai_1.expect)(api1switchedTo2GroupsInfo.availableGroups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id]);
127
+ (0, chai_1.expect)((_b = api1switchedTo2GroupsInfo.currentGroup) === null || _b === void 0 ? void 0 : _b.groupId).to.equal(userGroup2Id);
128
+ }));
129
+ });
130
+ //# sourceMappingURL=icureapi-group-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icureapi-group-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icureapi-group-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport {IcureApi, IcureBasicApi, retry, ua2hex} from '../../icc-x-api'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { IccUserApi } from '../../icc-api'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport { expect, use as chaiUse } from 'chai'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nchaiUse(chaiAsPromised)\n\nsetLocalStorage(fetch)\n\ndescribe('Icure api', function () {\n let env: TestVars\n const primitives = new CryptoPrimitives(webcrypto as any)\n const userGroup1Id: string = primitives.randomUuid() // Same username-pw as group 2\n const userGroup2Id: string = primitives.randomUuid() // Same username-pw as group 1\n const userGroup3Id: string = primitives.randomUuid() // Same username as group 1/2, different pw\n const userLogin: string = `maria-${primitives.randomUuid()}@pompei.it`\n const userPw12: string = `geppetto-${primitives.randomUuid()}`\n const userPw3: string = `pinocchio-${primitives.randomUuid()}`\n let user1Id: string\n let user2Id: string\n let user3Id: string\n const hcp1Id: string = primitives.randomUuid()\n const hcp2Id: string = primitives.randomUuid()\n const hcp3Id: string = primitives.randomUuid()\n let dataOwner1Pair: KeyPair<CryptoKey>\n let dataOwner2Pair: KeyPair<CryptoKey>\n let dataOwner3Pair: KeyPair<CryptoKey>\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n const api = await IcureBasicApi.initialise(env.iCureUrl, { username: 'john', password: 'LetMeIn'}, fetch)\n async function newGroupWithHcpUser(groupId: string, groupPrefix: string, userLogin: string, userPw: string, hcpId: string): Promise<string> {\n await api.groupApi.createGroup(\n groupId,\n `${groupPrefix}-${primitives.randomUuid()}`,\n primitives.randomUuid(),\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n {}\n )\n const res = await api.healthcarePartyApi.registerHealthcareParty(groupId, undefined, userPw, false, {\n id: hcpId,\n name: `${groupPrefix}-hcp-${primitives.randomUuid()}`,\n addresses: [\n {\n telecoms: [\n {\n telecomType: 'email',\n telecomNumber: userLogin,\n },\n ],\n },\n ],\n })\n expect(res.userId).to.not.be.undefined\n return res.userId!\n }\n user1Id = await newGroupWithHcpUser(userGroup1Id, 'group1', userLogin, userPw12, hcp1Id)\n user2Id = await newGroupWithHcpUser(userGroup2Id, 'group2', userLogin, userPw12, hcp2Id)\n user3Id = await newGroupWithHcpUser(userGroup3Id, 'group3', userLogin, userPw3, hcp3Id)\n dataOwner1Pair = await primitives.RSA.generateKeyPair()\n dataOwner2Pair = await primitives.RSA.generateKeyPair()\n dataOwner3Pair = await primitives.RSA.generateKeyPair()\n console.log(`Waiting for user to be replicated - ${userLogin}`)\n await retry(\n async () => {\n await new IccUserApi(env.iCureUrl, {}, new BasicAuthenticationProvider(`${userGroup1Id}/${user1Id}`, userPw12), fetch).getCurrentUser()\n await new IccUserApi(env.iCureUrl, {}, new BasicAuthenticationProvider(`${userGroup2Id}/${user2Id}`, userPw12), fetch).getCurrentUser()\n await new IccUserApi(env.iCureUrl, {}, new BasicAuthenticationProvider(`${userGroup3Id}/${user3Id}`, userPw3), fetch).getCurrentUser()\n },\n 10,\n 5_000,\n 1\n )\n console.log('Users created')\n })\n\n it('if a user has only one group should be initialised on that group', async () => {\n const api = await IcureApi.initialise(\n env.iCureUrl,\n { username: userLogin, password: userPw3 },\n new TestCryptoStrategies(dataOwner3Pair),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n expect((await api.userApi.getCurrentUser()).id).to.equal(user3Id)\n })\n\n it('if a user has more than one group should be initialised on different groups depending on the parameters passed values, and the api should be switchable to the other group after initialisation', async () => {\n const storage = new TestStorage()\n const keyStorage = new TestKeyStorage()\n const api1 = await IcureApi.initialise(\n env.iCureUrl,\n { username: userLogin, password: userPw12 },\n new TestCryptoStrategies(dataOwner1Pair),\n webcrypto as any,\n fetch,\n {\n storage,\n keyStorage,\n groupSelector: async (groups) => {\n expect(groups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id])\n return userGroup1Id\n },\n }\n )\n expect((await api1.userApi.getCurrentUser()).id).to.equal(user1Id)\n const key1PubHex = ua2hex(await primitives.RSA.exportKey(dataOwner1Pair.publicKey, 'spki'))\n expect(Object.keys(api1.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key1PubHex.slice(-32)])\n const api2 = await IcureApi.initialise(\n env.iCureUrl,\n { username: userLogin, password: userPw12 },\n new TestCryptoStrategies(dataOwner2Pair),\n webcrypto as any,\n fetch,\n {\n storage,\n keyStorage,\n groupSelector: async (groups) => {\n expect(groups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id])\n return userGroup2Id\n },\n }\n )\n expect((await api2.userApi.getCurrentUser()).id).to.equal(user2Id)\n const key2PubHex = ua2hex(await primitives.RSA.exportKey(dataOwner2Pair.publicKey, 'spki'))\n expect(Object.keys(api2.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key2PubHex.slice(-32)])\n const api1GroupsInfo = await api1.getGroupsInfo()\n expect(api1GroupsInfo.availableGroups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id])\n expect(api1GroupsInfo.currentGroup?.groupId).to.equal(userGroup1Id)\n const api1SwitchedTo2 = await api1.switchGroup(userGroup2Id)\n expect((await api1SwitchedTo2.userApi.getCurrentUser()).id).to.equal(user2Id)\n expect(Object.keys(api1SwitchedTo2.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.members([key2PubHex.slice(-32)])\n const api1switchedTo2GroupsInfo = await api1SwitchedTo2.getGroupsInfo()\n expect(api1switchedTo2GroupsInfo.availableGroups.map((x) => x.groupId)).to.have.members([userGroup1Id, userGroup2Id])\n expect(api1switchedTo2GroupsInfo.currentGroup?.groupId).to.equal(userGroup2Id)\n })\n})\n"]}
@@ -0,0 +1,2 @@
1
+ import 'isomorphic-fetch';
2
+ import 'mocha';
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("isomorphic-fetch");
13
+ const chai_1 = require("chai");
14
+ require("mocha");
15
+ const icc_api_1 = require("../../icc-api");
16
+ const User_1 = require("../../icc-api/model/User");
17
+ const node_compat_1 = require("../../node-compat");
18
+ const icc_x_api_1 = require("../../icc-x-api");
19
+ const Patient_1 = require("../../icc-api/model/Patient");
20
+ const mocha_1 = require("mocha");
21
+ const test_utils_1 = require("../utils/test_utils");
22
+ const AuthenticationProvider_1 = require("../../icc-x-api/auth/AuthenticationProvider");
23
+ var initApi = test_utils_1.TestUtils.initApi;
24
+ const TestApi_1 = require("../utils/TestApi");
25
+ const RSA_1 = require("../../icc-x-api/crypto/RSA");
26
+ const types_1 = require("@icure/test-setup/types");
27
+ (0, test_utils_1.setLocalStorage)(fetch);
28
+ let env;
29
+ let api;
30
+ let hcpUser;
31
+ describe('Patient', () => {
32
+ (0, mocha_1.before)(function () {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ this.timeout(600000);
35
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
36
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
37
+ api = yield initApi(env, test_utils_1.hcp1Username);
38
+ hcpUser = yield api.userApi.getCurrentUser();
39
+ });
40
+ });
41
+ it('should be capable of creating a patient from scratch', () => __awaiter(void 0, void 0, void 0, function* () {
42
+ var _a, _b, _c, _d;
43
+ const rawPatientApiForHcp = new icc_api_1.IccPatientApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(env.dataOwnerDetails[test_utils_1.hcp1Username].user, env.dataOwnerDetails[test_utils_1.hcp1Username].password));
44
+ const patient = yield rawPatientApiForHcp.createPatient(new Patient_1.Patient({ id: api.cryptoApi.primitives.randomUuid(), firstName: 'Tasty', lastName: 'Test' }));
45
+ const pwd = api.cryptoApi.primitives.randomUuid();
46
+ const tmpUser = yield api.userApi.createUser(new User_1.User({
47
+ id: api.cryptoApi.primitives.randomUuid(),
48
+ login: api.cryptoApi.primitives.randomUuid(),
49
+ passwordHash: pwd,
50
+ patientId: patient.id,
51
+ }));
52
+ const rsa = new RSA_1.RSAUtils(node_compat_1.crypto);
53
+ const keyPair = yield rsa.generateKeyPair();
54
+ const { publicKey, privateKey } = keyPair;
55
+ const publicKeyHex = (0, icc_x_api_1.ua2hex)(yield rsa.exportKey(publicKey, 'spki'));
56
+ const rawPatientApi = new icc_api_1.IccPatientApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(tmpUser.id, pwd));
57
+ yield rawPatientApi.modifyPatient(Object.assign(Object.assign({}, patient), { publicKey: publicKeyHex }));
58
+ const { userApi, patientApi, cryptoApi } = yield (0, TestApi_1.TestApi)(env.iCureUrl, tmpUser.id, pwd, node_compat_1.crypto, keyPair);
59
+ const user = yield userApi.getCurrentUser();
60
+ let me = yield patientApi.getPatientWithUser(user, user.patientId);
61
+ let updatedRev = me.rev;
62
+ updatedRev = (_b = (_a = (yield cryptoApi.exchangeKeys.getOrCreateEncryptionExchangeKeysTo(user.patientId)).updatedDelegator) === null || _a === void 0 ? void 0 : _a.stub.rev) !== null && _b !== void 0 ? _b : updatedRev;
63
+ me = updatedRev == me.rev ? me : yield patientApi.getPatientWithUser(user, user.patientId);
64
+ (0, chai_1.expect)((yield patientApi.getPatientWithUser(user, user.patientId)).rev).to.equal(me.rev);
65
+ updatedRev =
66
+ (_d = (_c = (yield cryptoApi.exchangeKeys.getOrCreateEncryptionExchangeKeysTo(hcpUser.healthcarePartyId)).updatedDelegator) === null || _c === void 0 ? void 0 : _c.stub.rev) !== null && _d !== void 0 ? _d : updatedRev;
67
+ me = updatedRev == me.rev ? me : yield patientApi.getPatientWithUser(user, user.patientId);
68
+ (0, chai_1.expect)((yield patientApi.getPatientWithUser(user, user.patientId)).rev).to.equal(me.rev);
69
+ const mySecretIds = yield cryptoApi.entities.secretIdsOf(me);
70
+ const myEncryptionKeys = yield cryptoApi.entities.encryptionKeysOf(me);
71
+ (0, chai_1.expect)(mySecretIds).to.have.length(1);
72
+ (0, chai_1.expect)(myEncryptionKeys).to.have.length(1);
73
+ me = (yield patientApi.modifyPatientWithUser(user, yield cryptoApi.entities.entityWithExtendedEncryptedMetadata(me, hcpUser.healthcarePartyId, mySecretIds, myEncryptionKeys, [], [])));
74
+ yield patientApi.modifyPatientWithUser(user, new Patient_1.Patient(Object.assign(Object.assign({}, me), { note: 'This is secret' })));
75
+ const pat2 = yield api.patientApi.getPatientWithUser(hcpUser, patient.id);
76
+ (0, chai_1.expect)(pat2 != null);
77
+ (0, chai_1.expect)(pat2.note != null);
78
+ })).timeout(60000);
79
+ it('should be capable of logging in and encryption', () => __awaiter(void 0, void 0, void 0, function* () {
80
+ const { userApi, calendarItemApi, patientApi } = yield initApi(env, test_utils_1.patUsername);
81
+ const user = yield userApi.getCurrentUser();
82
+ const patNote = 'Secret note';
83
+ const retrievedPat = yield patientApi.getPatientWithUser(user, user.patientId);
84
+ const pat = yield patientApi.modifyPatientWithUser(user, Object.assign(Object.assign({}, retrievedPat), { note: patNote }));
85
+ (0, chai_1.expect)(pat.note).to.equal(patNote);
86
+ const ciTitle = 'Secret title';
87
+ const ciDetails = 'Important and private information';
88
+ const ci = yield calendarItemApi.createCalendarItemWithHcParty(user, yield calendarItemApi.newInstancePatient(user, pat, { patientId: pat.id, title: ciTitle, details: ciDetails }));
89
+ let failed = false;
90
+ try {
91
+ yield api.patientApi.getPatientWithUser(hcpUser, pat.id);
92
+ }
93
+ catch (_e) {
94
+ failed = true;
95
+ }
96
+ (0, chai_1.expect)(failed).to.be.true;
97
+ failed = false;
98
+ try {
99
+ yield api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id);
100
+ }
101
+ catch (_f) {
102
+ failed = true;
103
+ }
104
+ (0, chai_1.expect)(failed).to.be.true;
105
+ yield patientApi.shareWith(hcpUser.healthcarePartyId, pat, yield patientApi.decryptSecretIdsOf(pat));
106
+ yield calendarItemApi.shareWith(hcpUser.healthcarePartyId, ci);
107
+ yield api.cryptoApi.forceReload();
108
+ const pat3 = yield api.patientApi.getPatientWithUser(hcpUser, pat.id);
109
+ const ci3 = yield api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id);
110
+ (0, chai_1.expect)(pat3).to.not.be.null;
111
+ (0, chai_1.expect)(pat3.note).to.equal(patNote);
112
+ (0, chai_1.expect)(ci3).to.not.be.null;
113
+ (0, chai_1.expect)(ci3.title).to.equal(ciTitle);
114
+ (0, chai_1.expect)(ci3.details).to.equal(ciDetails);
115
+ })).timeout(60000);
116
+ });
117
+ //# sourceMappingURL=patient-user.js.map