@icure/api 8.0.8 → 8.0.10

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 (270) hide show
  1. package/icc-api/model/models.d.ts +1 -0
  2. package/icc-api/model/models.js +1 -0
  3. package/icc-api/model/models.js.map +1 -1
  4. package/icc-x-api/crypto/BaseExchangeDataManager.js +1 -1
  5. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  6. package/icc-x-api/crypto/BaseExchangeKeysManager.js +7 -3
  7. package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
  8. package/icc-x-api/crypto/ExchangeDataManager.js +3 -2
  9. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  10. package/icc-x-api/crypto/KeyRecovery.js +6 -5
  11. package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
  12. package/icc-x-api/crypto/RSA.d.ts +4 -1
  13. package/icc-x-api/crypto/RSA.js +6 -1
  14. package/icc-x-api/crypto/RSA.js.map +1 -1
  15. package/icc-x-api/crypto/SecureDelegationsManager.js +2 -1
  16. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  17. package/icc-x-api/crypto/ShamirKeysManager.js +8 -9
  18. package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
  19. package/icc-x-api/crypto/TransferKeysManager.js +4 -3
  20. package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
  21. package/icc-x-api/crypto/UserEncryptionKeysManager.js +4 -4
  22. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  23. package/icc-x-api/crypto/UserSignatureKeysManager.js +9 -5
  24. package/icc-x-api/crypto/UserSignatureKeysManager.js.map +1 -1
  25. package/icc-x-api/crypto/utils.d.ts +13 -4
  26. package/icc-x-api/crypto/utils.js +27 -9
  27. package/icc-x-api/crypto/utils.js.map +1 -1
  28. package/icc-x-api/icc-accesslog-x-api.js +16 -14
  29. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  30. package/icc-x-api/icc-calendar-item-x-api.d.ts +2 -2
  31. package/icc-x-api/icc-calendar-item-x-api.js +17 -17
  32. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  33. package/icc-x-api/icc-classification-x-api.js +12 -11
  34. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  35. package/icc-x-api/icc-contact-x-api.d.ts +2 -2
  36. package/icc-x-api/icc-contact-x-api.js +23 -20
  37. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  38. package/icc-x-api/icc-data-owner-x-api.js +1 -1
  39. package/icc-x-api/icc-data-owner-x-api.js.map +1 -1
  40. package/icc-x-api/icc-document-x-api.js +17 -16
  41. package/icc-x-api/icc-document-x-api.js.map +1 -1
  42. package/icc-x-api/icc-form-x-api.js +13 -12
  43. package/icc-x-api/icc-form-x-api.js.map +1 -1
  44. package/icc-x-api/icc-helement-x-api.js +18 -16
  45. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  46. package/icc-x-api/icc-icure-maintenance-x-api.js +4 -3
  47. package/icc-x-api/icc-icure-maintenance-x-api.js.map +1 -1
  48. package/icc-x-api/icc-invoice-x-api.js +12 -11
  49. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  50. package/icc-x-api/icc-maintenance-task-x-api.js +11 -11
  51. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  52. package/icc-x-api/icc-message-x-api.js +14 -14
  53. package/icc-x-api/icc-message-x-api.js.map +1 -1
  54. package/icc-x-api/icc-patient-x-api.js +28 -27
  55. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  56. package/icc-x-api/icc-receipt-x-api.js +11 -10
  57. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  58. package/icc-x-api/icc-recovery-x-api.js +3 -2
  59. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  60. package/icc-x-api/icc-time-table-x-api.js +9 -8
  61. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  62. package/icc-x-api/icc-topic-x-api.js +13 -13
  63. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  64. package/icc-x-api/storage/IcureStorageFacade.js +4 -1
  65. package/icc-x-api/storage/IcureStorageFacade.js.map +1 -1
  66. package/icc-x-api/utils/EntityWithDelegationTypeName.d.ts +17 -1
  67. package/icc-x-api/utils/EntityWithDelegationTypeName.js +33 -15
  68. package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
  69. package/package.json +1 -1
  70. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
  71. package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
  72. package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
  73. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  74. package/test/icc-api/api/IccDocumentApi.js +208 -0
  75. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  76. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  77. package/test/icc-api/api/IccGroupApi.js +50 -0
  78. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  79. package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
  80. package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
  81. package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
  82. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  83. package/test/icc-api/api/IccRoleApi.js +34 -0
  84. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  85. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  86. package/test/icc-api/api/IccUserApi.js +96 -0
  87. package/test/icc-api/api/IccUserApi.js.map +1 -0
  88. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  89. package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
  90. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  91. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  92. package/test/icc-api/model/modelHelpersTest.js +45 -0
  93. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  94. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  95. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  96. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  97. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  98. package/test/icc-x-api/auth/jwt-concurrency-test.js +113 -0
  99. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  100. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  101. package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
  102. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  103. package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
  104. package/test/icc-x-api/autofix-anonymity-test.js +108 -0
  105. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
  106. package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
  107. package/test/icc-x-api/confidential-entities-test.js +110 -0
  108. package/test/icc-x-api/confidential-entities-test.js.map +1 -0
  109. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
  110. package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
  111. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
  112. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
  113. package/test/icc-x-api/crud/entities-crud-test-interface.js +422 -0
  114. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
  115. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
  116. package/test/icc-x-api/crypto/anonymous-delegations-test.js +588 -0
  117. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
  118. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  119. package/test/icc-x-api/crypto/concurrency.js +35 -0
  120. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  121. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  122. package/test/icc-x-api/crypto/crypto-utils.js +80 -0
  123. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  124. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  125. package/test/icc-x-api/crypto/cryptoTest.js +302 -0
  126. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  127. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  128. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
  129. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  130. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
  131. package/test/icc-x-api/crypto/exchange-data-manager-test.js +690 -0
  132. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
  133. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  134. package/test/icc-x-api/crypto/full-crypto-test.js +457 -0
  135. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  136. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
  137. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +266 -0
  138. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
  139. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.d.ts +1 -0
  140. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +393 -0
  141. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +1 -0
  142. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.d.ts +1 -0
  143. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js +213 -0
  144. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js.map +1 -0
  145. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  146. package/test/icc-x-api/crypto/shamir.js +166 -0
  147. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  148. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  149. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
  150. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  151. package/test/icc-x-api/crypto/signature-keys-manager-test.d.ts +1 -0
  152. package/test/icc-x-api/crypto/signature-keys-manager-test.js +44 -0
  153. package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +1 -0
  154. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
  155. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
  156. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
  157. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  158. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  159. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  160. package/test/icc-x-api/filters/filters.d.ts +1 -0
  161. package/test/icc-x-api/filters/filters.js +49 -0
  162. package/test/icc-x-api/filters/filters.js.map +1 -0
  163. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  164. package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
  165. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  166. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  167. package/test/icc-x-api/icc-auth-api.js +47 -0
  168. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  169. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  170. package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
  171. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  172. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  173. package/test/icc-x-api/icc-contact-x-api.js +279 -0
  174. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  175. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  176. package/test/icc-x-api/icc-form-x-api.js +98 -0
  177. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  178. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  179. package/test/icc-x-api/icc-helement-x-api-test.js +153 -0
  180. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  181. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  182. package/test/icc-x-api/icc-invoice-x-api.js +99 -0
  183. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  184. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  185. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +221 -0
  186. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  187. package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
  188. package/test/icc-x-api/icc-message-x-api.js +328 -0
  189. package/test/icc-x-api/icc-message-x-api.js.map +1 -0
  190. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  191. package/test/icc-x-api/icc-patient-x-api-test.js +158 -0
  192. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  193. package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
  194. package/test/icc-x-api/icc-recovery-x-api.js +170 -0
  195. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
  196. package/test/icc-x-api/icc-time-table-x-api.d.ts +1 -0
  197. package/test/icc-x-api/icc-time-table-x-api.js +100 -0
  198. package/test/icc-x-api/icc-time-table-x-api.js.map +1 -0
  199. package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
  200. package/test/icc-x-api/icc-topic-x-api.js +269 -0
  201. package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
  202. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  203. package/test/icc-x-api/icc-user-x-api-test.js +99 -0
  204. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  205. package/test/icc-x-api/patient-user.d.ts +2 -0
  206. package/test/icc-x-api/patient-user.js +104 -0
  207. package/test/icc-x-api/patient-user.js.map +1 -0
  208. package/test/icc-x-api/storage/storage.d.ts +1 -0
  209. package/test/icc-x-api/storage/storage.js +48 -0
  210. package/test/icc-x-api/storage/storage.js.map +1 -0
  211. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  212. package/test/icc-x-api/test-api-no-parent.js +79 -0
  213. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  214. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  215. package/test/icc-x-api/test-legacy-data-support.js +376 -0
  216. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  217. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  218. package/test/icc-x-api/utils/graph-test.js +54 -0
  219. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  220. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
  221. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
  222. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
  223. package/test/support/CSM-185.d.ts +1 -0
  224. package/test/support/CSM-185.js +124 -0
  225. package/test/support/CSM-185.js.map +1 -0
  226. package/test/support/CSM-243.d.ts +1 -0
  227. package/test/support/CSM-243.js +120 -0
  228. package/test/support/CSM-243.js.map +1 -0
  229. package/test/support/CSM-87.d.ts +0 -0
  230. package/test/support/CSM-87.js +21 -0
  231. package/test/support/CSM-87.js.map +1 -0
  232. package/test/support/CSM-93.d.ts +1 -0
  233. package/test/support/CSM-93.js +112 -0
  234. package/test/support/CSM-93.js.map +1 -0
  235. package/test/utils/FakeDataOwnerApi.d.ts +32 -0
  236. package/test/utils/FakeDataOwnerApi.js +136 -0
  237. package/test/utils/FakeDataOwnerApi.js.map +1 -0
  238. package/test/utils/FakeEncryptionKeysManager.d.ts +35 -0
  239. package/test/utils/FakeEncryptionKeysManager.js +87 -0
  240. package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
  241. package/test/utils/FakeExchangeDataApi.d.ts +30 -0
  242. package/test/utils/FakeExchangeDataApi.js +74 -0
  243. package/test/utils/FakeExchangeDataApi.js.map +1 -0
  244. package/test/utils/FakeExchangeDataManager.d.ts +40 -0
  245. package/test/utils/FakeExchangeDataManager.js +89 -0
  246. package/test/utils/FakeExchangeDataManager.js.map +1 -0
  247. package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
  248. package/test/utils/FakeExchangeDataMapManager.js +38 -0
  249. package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
  250. package/test/utils/FakeGenericApi.d.ts +16 -0
  251. package/test/utils/FakeGenericApi.js +65 -0
  252. package/test/utils/FakeGenericApi.js.map +1 -0
  253. package/test/utils/FakeSignatureKeysManager.d.ts +16 -0
  254. package/test/utils/FakeSignatureKeysManager.js +54 -0
  255. package/test/utils/FakeSignatureKeysManager.js.map +1 -0
  256. package/test/utils/TestApi.d.ts +3 -0
  257. package/test/utils/TestApi.js +30 -0
  258. package/test/utils/TestApi.js.map +1 -0
  259. package/test/utils/TestCollectionUtils.d.ts +1 -0
  260. package/test/utils/TestCollectionUtils.js +109 -0
  261. package/test/utils/TestCollectionUtils.js.map +1 -0
  262. package/test/utils/TestCryptoStrategies.d.ts +42 -0
  263. package/test/utils/TestCryptoStrategies.js +80 -0
  264. package/test/utils/TestCryptoStrategies.js.map +1 -0
  265. package/test/utils/TestStorage.d.ts +23 -0
  266. package/test/utils/TestStorage.js +61 -0
  267. package/test/utils/TestStorage.js.map +1 -0
  268. package/test/utils/test_utils.d.ts +76 -0
  269. package/test/utils/test_utils.js +419 -0
  270. package/test/utils/test_utils.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-topic-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-topic-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport initApi = TestUtils.initApi\nimport { XHR } from '../../icc-api/api/XHR'\nimport XHRError = XHR.XHRError\nimport { FilterChainTopic } from '../../icc-api/model/FilterChainTopic'\nimport { TopicByHcPartyFilter } from '../../icc-x-api/filters/TopicByHcPartyFilter'\nimport { TopicByParticipantFilter } from '../../icc-x-api/filters/TopicByParticipantFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { Message } from '../../icc-api/model/Message'\nimport { IccTopicApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-topic-x-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n 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 }\n\n it('An HCP should be able to create a topic with participants', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n }).timeout(10_000)\n\n it('An HCP should be able to create an encrypted topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const baseTopicApi = new IccTopicApi(env!.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n expect(retrievedByHcp.description).to.not.be.undefined\n\n const notDecryptedTopic = await baseTopicApi.getTopic(createdTopic.id!)\n expect(notDecryptedTopic).to.not.deep.equal(createdTopic)\n expect(notDecryptedTopic.description).to.be.undefined\n expect(notDecryptedTopic.encryptedSelf).to.not.be.undefined\n }).timeout(10_000)\n\n it('An HCP should be able to create a topic with no participants and add participants later', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.getTopic(createdTopic.id!)\n expect.fail('Should not be able to get topic')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n\n await topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId!, topicRole: TopicRole.PARTICIPANT }, createdTopic)\n\n const retrievedByHcpAfterAddParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterAddParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant)\n expect(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!, hcpUser2.healthcarePartyId!)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser2.healthcarePartyId!]).to.equal(TopicRole.PARTICIPANT)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser.healthcarePartyId!]).to.equal(TopicRole.OWNER)\n }).timeout(10_000)\n\n it('A participant should not be able to remove another participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId! }, createdTopic.id!)\n expect.fail('Should not be able to remove participant')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n }).timeout(10_000)\n\n it('A participant should be able to remove himself but still able to get topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n\n const retrievedByHcpAfterRemoveParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant)\n }).timeout(10_000)\n\n it('An owner should be able to remove a participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const topicWithRemovedParticipant = await topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n expect(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!)\n\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant)\n }).timeout(10_000)\n\n it('A participant should be able to filter topics using TopicByHcPartyFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByHcPartyFilter({\n hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n }).timeout(60_000)\n\n it('A participant should be able to filter topics using TopicByParticipantFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByParticipantFilter({\n participantId: hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n }).timeout(10_000)\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateTopic = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: SubscriptionOptions, eventListener: (healthcareElement: Message) => Promise<void>) =>\n topicApiForHcp.subscribeToTopicEvents(\n eventTypes,\n new TopicByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n })\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Topic)).to.be.true\n }\n\n it('CREATE Topic without options', async () => {\n await subscribeAndCreateTopic({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Topic with options', async () => {\n await subscribeAndCreateTopic(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,99 @@
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(createdUser);
59
+ }));
60
+ (0, test_utils_1.itNoLite)('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
+ const authProvider = SmartAuthProvider_1.SmartAuthProvider.initialise(authApi, credentials.user, {
75
+ getSecret: (acceptedSecrets, previousAttempts) => __awaiter(void 0, void 0, void 0, function* () {
76
+ if (acceptedSecrets.includes(SmartAuthProvider_1.AuthSecretType.LONG_LIVED_TOKEN)) {
77
+ longLivedTokenRequested = true;
78
+ return { value: userToken, secretType: SmartAuthProvider_1.AuthSecretType.LONG_LIVED_TOKEN };
79
+ }
80
+ else if (acceptedSecrets.includes(SmartAuthProvider_1.AuthSecretType.SHORT_LIVED_TOKEN)) {
81
+ shortLivedTokenRequested = true;
82
+ yield masterApi.userApi.getToken(userWithLongToken.id, 'tmp', 300, '123456');
83
+ return { value: '123456', secretType: SmartAuthProvider_1.AuthSecretType.SHORT_LIVED_TOKEN };
84
+ }
85
+ else
86
+ chai_1.assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN');
87
+ }),
88
+ });
89
+ const userApi = userApiWithProvider(authProvider);
90
+ (0, chai_1.expect)((yield userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev);
91
+ (0, chai_1.expect)(longLivedTokenRequested).to.be.true;
92
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.false;
93
+ const newPw = (0, crypto_2.randomUUID)();
94
+ const userWithNewPw = yield userApi.modifyUser(Object.assign(Object.assign({}, userWithLongToken), { passwordHash: newPw }));
95
+ (0, chai_1.expect)(userWithNewPw.rev).to.not.equal(userWithLongToken.rev);
96
+ (0, chai_1.expect)(shortLivedTokenRequested).to.be.true;
97
+ }));
98
+ });
99
+ //# 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":";;;;;;;;;;;AAAA,oDAAoI;AACpI,iCAA8B;AAC9B,mDAA0C;AAC1C,8CAA0C;AAC1C,mDAAmE;AACnE,+CAAiH;AACjH,mCAAkC;AAClC,+BAAqC;AACrC,mDAA+C;AAC/C,+BAAiC;AACjC,IAAO,aAAa,GAAG,sBAAS,CAAC,aAAa,CAAA;AAC9C,8EAA6G;AAC7G,mCAAmC;AACnC,2CAAsD;AAEtD,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,IAAI,GAAa,CAAA;AACjB,IAAI,OAAmB,CAAA;AAEvB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,cAAM,EAAC;;YACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACpB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;YACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YAClD,OAAO,GAAG,IAAI,oBAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,oCAAwB,EAAE,EAAE,KAAK,CAAC,CAAA;QACnF,CAAC;KAAA,CAAC,CAAA;IAEF,SAAS,mBAAmB,CAAC,YAAoC;QAC/D,OAAO,IAAI,uBAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,oBAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,oCAAwB,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;IACjI,CAAC;IAED,EAAE,CAAC,iDAAiD,EAAE,GAAS,EAAE;QAC/D,QAAQ;QACR,MAAM,GAAG,GAAG,MAAM,IAAA,iBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,yBAAY,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC,yBAAY,CAAC,CAAC,QAAQ,EAAE,oBAAM,CAAC,CAAA;QACrI,MAAM,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;IACpC,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAS,EAAE;QAClD,MAAM,UAAU,GAAG,IAAI,4BAAgB,CAAC,kBAAgB,CAAC,CAAA;QACzD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,CAAA;QAEjD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;QAEpC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAC9C,IAAI,WAAI,CAAC;YACP,EAAE,EAAE,IAAA,SAAI,GAAE;YACV,IAAI,EAAE,QAAQ,UAAU,CAAC,UAAU,EAAE,EAAE;YACvC,KAAK,EAAE,QAAQ,UAAU,CAAC,UAAU,EAAE,EAAE;YACxC,KAAK,EAAE,QAAQ,UAAU,CAAC,UAAU,EAAE,YAAY;YAClD,WAAW,EAAE,WAAW;SACzB,CAAC,CACH,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;QAEhE,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC5C,CAAC,CAAA,CAAC,CAAA;IAEF,IAAA,qBAAQ,EACN,wOAAwO,EACxO,GAAS,EAAE;QACT,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;QACvD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;QACtD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;QAC1C,MAAM,SAAS,GAAG,IAAA,mBAAU,GAAE,CAAA;QAC9B,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,iCACvD,WAAW,KACd,oBAAoB,EAAE;gBACpB,uBAAuB,EAAE;oBACvB,KAAK,EAAE,SAAS;oBAChB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;oBACxB,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;iBAC3B;aACF,IACD,CAAA;QACF,IAAI,uBAAuB,GAAG,KAAK,CAAA;QACnC,IAAI,wBAAwB,GAAG,KAAK,CAAA;QACpC,MAAM,YAAY,GAAG,qCAAiB,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE;YAC3E,SAAS,EAAE,CAAO,eAAiC,EAAE,gBAAqC,EAAE,EAAE;gBAC5F,IAAI,eAAe,CAAC,QAAQ,CAAC,kCAAc,CAAC,gBAAgB,CAAC,EAAE;oBAC7D,uBAAuB,GAAG,IAAI,CAAA;oBAC9B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,kCAAc,CAAC,gBAAgB,EAAE,CAAA;iBACzE;qBAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,kCAAc,CAAC,iBAAiB,CAAC,EAAE;oBACrE,wBAAwB,GAAG,IAAI,CAAA;oBAC/B,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;oBAC7E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,kCAAc,CAAC,iBAAiB,EAAE,CAAA;iBACzE;;oBAAM,aAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;YAC5E,CAAC,CAAA;SACF,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAA;QACjD,IAAA,aAAM,EAAC,CAAC,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC5E,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;QAC1C,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAA;QAE5C,MAAM,KAAK,GAAG,IAAA,mBAAU,GAAE,CAAA;QAC1B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,iCAAM,iBAAiB,KAAE,YAAY,EAAE,KAAK,IAAG,CAAA;QAE7F,IAAA,aAAM,EAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC7D,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;IAC7C,CAAC,CAAA,CACF,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, hcp1Username, itNoLite, 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 { AuthenticationProvider, CryptoPrimitives, IccUserXApi, NoAuthenticationProvider } 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 { AuthSecretDetails, AuthSecretType, 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(createdUser)\n })\n\n itNoLite(\n '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',\n 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 const authProvider = SmartAuthProvider.initialise(authApi, credentials.user, {\n getSecret: async (acceptedSecrets: AuthSecretType[], previousAttempts: 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 })\n const userApi = userApiWithProvider(authProvider)\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 )\n})\n"]}
@@ -0,0 +1,2 @@
1
+ import 'isomorphic-fetch';
2
+ import 'mocha';
@@ -0,0 +1,104 @@
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_x_api_1 = require("../../icc-x-api");
16
+ const icc_api_1 = require("../../icc-api");
17
+ const User_1 = require("../../icc-api/model/User");
18
+ const node_compat_1 = require("../../node-compat");
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 TestApi_1 = require("../utils/TestApi");
23
+ const RSA_1 = require("../../icc-x-api/crypto/RSA");
24
+ const chaiAsPromised = require("chai-as-promised");
25
+ const EntityShareRequest_1 = require("../../icc-api/model/requests/EntityShareRequest");
26
+ const types_1 = require("@icure/test-setup/types");
27
+ const AuthenticationProvider_1 = require("../../icc-x-api/auth/AuthenticationProvider");
28
+ var initApi = test_utils_1.TestUtils.initApi;
29
+ var RequestedPermissionEnum = EntityShareRequest_1.EntityShareRequest.RequestedPermissionEnum;
30
+ (0, chai_1.use)(chaiAsPromised);
31
+ (0, test_utils_1.setLocalStorage)(fetch);
32
+ let env;
33
+ let api;
34
+ let hcpUser;
35
+ const FULL_WRITE = RequestedPermissionEnum.FULL_WRITE;
36
+ describe('Patient', () => {
37
+ (0, mocha_1.before)(function () {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ this.timeout(600000);
40
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
41
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
42
+ api = yield initApi(env, test_utils_1.hcp1Username);
43
+ hcpUser = yield api.userApi.getCurrentUser();
44
+ });
45
+ });
46
+ it('should be capable of creating a patient from scratch', () => __awaiter(void 0, void 0, void 0, function* () {
47
+ 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));
48
+ const patient = yield rawPatientApiForHcp.createPatient(new Patient_1.Patient({ id: api.cryptoApi.primitives.randomUuid(), firstName: 'Tasty', lastName: 'Test' }));
49
+ const pwd = api.cryptoApi.primitives.randomUuid();
50
+ const tmpUser = yield api.userApi.createUser(new User_1.User({
51
+ id: api.cryptoApi.primitives.randomUuid(),
52
+ login: api.cryptoApi.primitives.randomUuid(),
53
+ passwordHash: pwd,
54
+ patientId: patient.id,
55
+ }));
56
+ const rsa = new RSA_1.RSAUtils(node_compat_1.crypto);
57
+ const keyPair = yield rsa.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
58
+ const { publicKey, privateKey } = keyPair;
59
+ const publicKeyHex = (0, icc_x_api_1.ua2hex)(yield rsa.exportKey(publicKey, 'spki'));
60
+ const rawPatientApi = new icc_api_1.IccPatientApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(tmpUser.id, pwd));
61
+ yield rawPatientApi.modifyPatient(new Patient_1.Patient(Object.assign(Object.assign({}, patient), { publicKey: publicKeyHex })));
62
+ // TODO some of these operations may be forbidden by the backend in future versions...
63
+ const { userApi, patientApi, cryptoApi } = yield (0, TestApi_1.TestApi)(env.iCureUrl, tmpUser.id, pwd, node_compat_1.crypto, keyPair);
64
+ const user = yield userApi.getCurrentUser();
65
+ let me = yield patientApi.getPatientWithUser(user, user.patientId);
66
+ const mySecretIds = yield patientApi.decryptSecretIdsOf(me);
67
+ const myEncryptionKeys = yield patientApi.getEncryptionKeysOf(me);
68
+ (0, chai_1.expect)(mySecretIds).to.have.length(1);
69
+ (0, chai_1.expect)(myEncryptionKeys).to.have.length(1);
70
+ me = yield patientApi.shareWith(hcpUser.healthcarePartyId, me, mySecretIds, { requestedPermissions: FULL_WRITE });
71
+ const expectedNote = 'This will be encrypted';
72
+ yield patientApi.modifyPatientWithUser(user, new Patient_1.Patient(Object.assign(Object.assign({}, me), { note: expectedNote })));
73
+ const pat2 = yield api.patientApi.getPatientWithUser(hcpUser, patient.id);
74
+ (0, chai_1.expect)(!!pat2);
75
+ (0, chai_1.expect)(pat2.note).to.equal(expectedNote);
76
+ })).timeout(60000);
77
+ it('should be capable of logging in and encryption', () => __awaiter(void 0, void 0, void 0, function* () {
78
+ const { userApi } = yield initApi(env, test_utils_1.patUsername);
79
+ const rawPatientApi = new icc_api_1.IccPatientApi(env.iCureUrl, {}, new AuthenticationProvider_1.BasicAuthenticationProvider(env.dataOwnerDetails[test_utils_1.patUsername].user, env.dataOwnerDetails[test_utils_1.patUsername].password));
80
+ const user = yield userApi.getCurrentUser();
81
+ const patient = yield rawPatientApi.getPatient(user.patientId);
82
+ const { calendarItemApi, patientApi, cryptoApi } = yield initApi(env, test_utils_1.patUsername);
83
+ const patNote = 'Secret note';
84
+ const pat = yield patientApi.modifyPatientWithUser(user, Object.assign(Object.assign({}, (yield patientApi.getPatientWithUser(user, user.patientId))), { note: patNote }));
85
+ const ciTitle = 'Secret title';
86
+ const ciDetails = 'Important and private information';
87
+ const ci = yield calendarItemApi.createCalendarItemWithHcParty(user, yield calendarItemApi.newInstancePatient(user, patient, { patientId: patient.id, title: ciTitle, details: ciDetails }));
88
+ if (!(0, test_utils_1.isLiteTest)()) {
89
+ yield (0, chai_1.expect)(api.patientApi.getPatientWithUser(hcpUser, patient.id)).to.be.rejected;
90
+ yield (0, chai_1.expect)(api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)).to.be.rejected;
91
+ }
92
+ yield patientApi.shareWith(hcpUser.healthcarePartyId, pat, yield patientApi.decryptSecretIdsOf(pat), { requestedPermissions: FULL_WRITE });
93
+ yield calendarItemApi.shareWith(hcpUser.healthcarePartyId, ci, { requestedPermissions: FULL_WRITE });
94
+ yield api.cryptoApi.forceReload();
95
+ const pat3 = yield api.patientApi.getPatientWithUser(hcpUser, patient.id);
96
+ const ci3 = yield api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id);
97
+ (0, chai_1.expect)(pat3).to.not.be.null;
98
+ (0, chai_1.expect)(pat3.note).to.equal(patNote);
99
+ (0, chai_1.expect)(ci3).to.not.be.null;
100
+ (0, chai_1.expect)(ci3.title).to.equal(ciTitle);
101
+ (0, chai_1.expect)(ci3.details).to.equal(ciDetails);
102
+ })).timeout(60000);
103
+ });
104
+ //# sourceMappingURL=patient-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patient-user.js","sourceRoot":"","sources":["../../../test/icc-x-api/patient-user.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { expect, use as chaiUse } from 'chai'\nimport 'mocha'\nimport { Apis, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { IccPatientApi } from '../../icc-api'\nimport { User } from '../../icc-api/model/User'\nimport { crypto } from '../../node-compat'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { before } from 'mocha'\nimport { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { TestApi } from '../utils/TestApi'\nimport { RSAUtils } from '../../icc-x-api/crypto/RSA'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport initApi = TestUtils.initApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\nchaiUse(chaiAsPromised)\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet api: Apis\nlet hcpUser: User\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\n\ndescribe('Patient', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n api = await initApi(env, hcp1Username)\n hcpUser = await api.userApi.getCurrentUser()\n })\n\n it('should be capable of creating a patient from scratch', async () => {\n const rawPatientApiForHcp = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password)\n )\n const patient = await rawPatientApiForHcp.createPatient(\n new Patient({ id: api.cryptoApi.primitives.randomUuid(), firstName: 'Tasty', lastName: 'Test' })\n )\n const pwd = api.cryptoApi.primitives.randomUuid()\n const tmpUser = await api.userApi.createUser(\n new User({\n id: api.cryptoApi.primitives.randomUuid(),\n login: api.cryptoApi.primitives.randomUuid(),\n passwordHash: pwd,\n patientId: patient.id,\n })\n )\n\n const rsa = new RSAUtils(crypto)\n const keyPair = await rsa.generateKeyPair(ShaVersion.Sha256)\n const { publicKey, privateKey } = keyPair\n const publicKeyHex = ua2hex(await rsa.exportKey(publicKey, 'spki'))\n const rawPatientApi = new IccPatientApi(env.iCureUrl, {}, new BasicAuthenticationProvider(tmpUser.id!, pwd))\n await rawPatientApi.modifyPatient(new Patient({ ...patient, publicKey: publicKeyHex }))\n\n // TODO some of these operations may be forbidden by the backend in future versions...\n const { userApi, patientApi, cryptoApi } = await TestApi(env.iCureUrl, tmpUser.id!, pwd!, crypto, keyPair)\n const user = await userApi.getCurrentUser()\n let me: Patient = await patientApi.getPatientWithUser(user, user.patientId!)\n const mySecretIds = await patientApi.decryptSecretIdsOf(me)\n const myEncryptionKeys = await patientApi.getEncryptionKeysOf(me)\n expect(mySecretIds).to.have.length(1)\n expect(myEncryptionKeys).to.have.length(1)\n\n me = await patientApi.shareWith(hcpUser.healthcarePartyId!, me, mySecretIds, { requestedPermissions: FULL_WRITE })\n const expectedNote = 'This will be encrypted'\n await patientApi.modifyPatientWithUser(user, new Patient({ ...me, note: expectedNote }))\n\n const pat2 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n expect(!!pat2)\n expect(pat2.note).to.equal(expectedNote)\n }).timeout(60000)\n\n it('should be capable of logging in and encryption', async () => {\n const { userApi } = await initApi(env, patUsername)\n const rawPatientApi = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[patUsername].user, env.dataOwnerDetails[patUsername].password)\n )\n\n const user = await userApi.getCurrentUser()\n const patient = await rawPatientApi.getPatient(user.patientId!)\n\n const { calendarItemApi, patientApi, cryptoApi } = await initApi(env, patUsername)\n\n const patNote = 'Secret note'\n const pat = await patientApi.modifyPatientWithUser(user, {\n ...(await patientApi.getPatientWithUser(user, user.patientId!)),\n note: patNote,\n })\n const ciTitle = 'Secret title'\n const ciDetails = 'Important and private information'\n const ci = await calendarItemApi.createCalendarItemWithHcParty(\n user,\n await calendarItemApi.newInstancePatient(user, patient, { patientId: patient.id, title: ciTitle, details: ciDetails })\n )\n\n if (!isLiteTest()) {\n await expect(api.patientApi.getPatientWithUser(hcpUser, patient.id!)).to.be.rejected\n await expect(api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)).to.be.rejected\n }\n\n await patientApi.shareWith(hcpUser.healthcarePartyId!, pat!, await patientApi.decryptSecretIdsOf(pat!), { requestedPermissions: FULL_WRITE })\n await calendarItemApi.shareWith(hcpUser.healthcarePartyId!, ci!, { requestedPermissions: FULL_WRITE })\n await api.cryptoApi.forceReload()\n const pat3 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n const ci3 = await api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)\n expect(pat3).to.not.be.null\n expect(pat3.note).to.equal(patNote)\n expect(ci3).to.not.be.null\n expect(ci3.title).to.equal(ciTitle)\n expect(ci3.details).to.equal(ciDetails)\n }).timeout(60000)\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,48 @@
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 chai_1 = require("chai");
13
+ const icc_x_api_1 = require("../../../icc-x-api");
14
+ const os_1 = require("os");
15
+ require("isomorphic-fetch");
16
+ const util_1 = require("util");
17
+ global.localStorage = new (require('node-localstorage').LocalStorage)((0, os_1.tmpdir)(), 5 * 1024 * 1024 * 1024);
18
+ global.fetch = fetch;
19
+ global.Storage = '';
20
+ global.TextDecoder = util_1.TextDecoder;
21
+ global.TextEncoder = util_1.TextEncoder;
22
+ const testStorage = new icc_x_api_1.LocalStorageImpl();
23
+ describe('Test LocalStorageFacade abstraction', () => {
24
+ it('should store and retrieve a keypair', () => __awaiter(void 0, void 0, void 0, function* () {
25
+ const key = 'key';
26
+ const keyPair = {
27
+ publicKey: 'publicKey',
28
+ privateKey: 'privateKey', // pragma: allowlist secret
29
+ };
30
+ yield testStorage.setItem(key, JSON.stringify(keyPair));
31
+ (0, chai_1.expect)(yield testStorage.getItem(key)).to.eq(JSON.stringify(keyPair));
32
+ }));
33
+ it('should store and retrieve a string', () => __awaiter(void 0, void 0, void 0, function* () {
34
+ const key = 'key';
35
+ const value = 'value';
36
+ yield testStorage.setItem(key, value);
37
+ (0, chai_1.expect)(yield testStorage.getItem(key)).to.eq(value);
38
+ }));
39
+ it('should remove a key', () => __awaiter(void 0, void 0, void 0, function* () {
40
+ const key = 'key';
41
+ const value = 'value';
42
+ yield testStorage.setItem(key, value);
43
+ (0, chai_1.expect)(yield testStorage.getItem(key)).to.eq(value);
44
+ yield testStorage.removeItem(key);
45
+ (0, chai_1.expect)(yield testStorage.getItem(key)).to.be.undefined;
46
+ }));
47
+ });
48
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../test/icc-x-api/storage/storage.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA6B;AAC7B,kDAAqD;AACrD,2BAA2B;AAC3B,4BAAyB;AACzB,+BACC;AAAC,MAAc,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,IAAA,WAAM,GAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAChH;AAAC,MAAc,CAAC,KAAK,GAAG,KAAK,CAC7B;AAAC,MAAc,CAAC,OAAO,GAAG,EAAE,CAC5B;AAAC,MAAc,CAAC,WAAW,GAAG,kBAAW,CACzC;AAAC,MAAc,CAAC,WAAW,GAAG,kBAAW,CAAA;AAC1C,MAAM,WAAW,GAAG,IAAI,4BAAgB,EAAE,CAAA;AAE1C,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,qCAAqC,EAAE,GAAS,EAAE;QACnD,MAAM,GAAG,GAAG,KAAK,CAAA;QACjB,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,YAAY,EAAE,2BAA2B;SACtD,CAAA;QACD,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QACvD,IAAA,aAAM,EAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACvE,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAS,EAAE;QAClD,MAAM,GAAG,GAAG,KAAK,CAAA;QACjB,MAAM,KAAK,GAAG,OAAO,CAAA;QACrB,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrC,IAAA,aAAM,EAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAS,EAAE;QACnC,MAAM,GAAG,GAAG,KAAK,CAAA;QACjB,MAAM,KAAK,GAAG,OAAO,CAAA;QACrB,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrC,IAAA,aAAM,EAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACjC,IAAA,aAAM,EAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;IACxD,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { expect } from 'chai'\nimport { LocalStorageImpl } from '../../../icc-x-api'\nimport { tmpdir } from 'os'\nimport 'isomorphic-fetch'\nimport { TextDecoder, TextEncoder } from 'util'\n;(global as any).localStorage = new (require('node-localstorage').LocalStorage)(tmpdir(), 5 * 1024 * 1024 * 1024)\n;(global as any).fetch = fetch\n;(global as any).Storage = ''\n;(global as any).TextDecoder = TextDecoder\n;(global as any).TextEncoder = TextEncoder\nconst testStorage = new LocalStorageImpl()\n\ndescribe('Test LocalStorageFacade abstraction', () => {\n it('should store and retrieve a keypair', async () => {\n const key = 'key'\n const keyPair = {\n publicKey: 'publicKey',\n privateKey: 'privateKey', // pragma: allowlist secret\n }\n await testStorage.setItem(key, JSON.stringify(keyPair))\n expect(await testStorage.getItem(key)).to.eq(JSON.stringify(keyPair))\n })\n\n it('should store and retrieve a string', async () => {\n const key = 'key'\n const value = 'value'\n await testStorage.setItem(key, value)\n expect(await testStorage.getItem(key)).to.eq(value)\n })\n\n it('should remove a key', async () => {\n const key = 'key'\n const value = 'value'\n await testStorage.setItem(key, value)\n expect(await testStorage.getItem(key)).to.eq(value)\n await testStorage.removeItem(key)\n expect(await testStorage.getItem(key)).to.be.undefined\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,79 @@
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 mocha_1 = require("mocha");
13
+ const test_utils_1 = require("../utils/test_utils");
14
+ const types_1 = require("@icure/test-setup/types");
15
+ const icc_x_api_1 = require("../../icc-x-api");
16
+ const TestCryptoStrategies_1 = require("../utils/TestCryptoStrategies");
17
+ const crypto_1 = require("crypto");
18
+ const TestStorage_1 = require("../utils/TestStorage");
19
+ const chai_1 = require("chai");
20
+ require("isomorphic-fetch");
21
+ var initMasterApi = test_utils_1.TestUtils.initMasterApi;
22
+ (0, chai_1.use)(require('chai-as-promised'));
23
+ (0, test_utils_1.setLocalStorage)(fetch);
24
+ let env;
25
+ let api;
26
+ let user;
27
+ let login;
28
+ let keypair;
29
+ describe('A user without access to parent data', () => {
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
+ const initialisationApi = yield initMasterApi(env);
36
+ const initialisationUser = yield initialisationApi.userApi.getCurrentUser();
37
+ const childHcp = yield initialisationApi.healthcarePartyApi.createHealthcareParty({
38
+ id: initialisationApi.cryptoApi.primitives.randomUuid(),
39
+ name: 'Some hcp',
40
+ parentId: initialisationUser.healthcarePartyId,
41
+ });
42
+ login = `childUser-${initialisationApi.cryptoApi.primitives.randomUuid()}`;
43
+ const childUser = yield initialisationApi.userApi.createUser({
44
+ id: initialisationApi.cryptoApi.primitives.randomUuid(),
45
+ healthcarePartyId: childHcp.id,
46
+ login,
47
+ passwordHash: 'LetMeInForReal',
48
+ });
49
+ keypair = yield initialisationApi.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
50
+ api = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: childUser.login, password: 'LetMeInForReal' }, new TestCryptoStrategies_1.TestCryptoStrategies(keypair), crypto_1.webcrypto, fetch, {
51
+ storage: new TestStorage_1.TestStorage(),
52
+ keyStorage: new TestStorage_1.TestKeyStorage(),
53
+ disableParentKeysInitialisation: true,
54
+ });
55
+ user = yield api.userApi.getCurrentUser();
56
+ });
57
+ });
58
+ it('should not be able to initialise the api without disabling parent keys initialisation', () => __awaiter(void 0, void 0, void 0, function* () {
59
+ yield (0, chai_1.expect)(icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: login, password: 'LetMeInForReal' }, new TestCryptoStrategies_1.TestCryptoStrategies(keypair), crypto_1.webcrypto, fetch, {
60
+ storage: new TestStorage_1.TestStorage(),
61
+ keyStorage: new TestStorage_1.TestKeyStorage(),
62
+ })).to.be.rejected;
63
+ }));
64
+ it('should still be able to create and retrieve his data', () => __awaiter(void 0, void 0, void 0, function* () {
65
+ const patient = yield api.patientApi.createPatientWithUser(user, yield api.patientApi.newInstance(user, {
66
+ firstName: 'Tasty',
67
+ lastName: 'Test',
68
+ note: 'Secret',
69
+ }));
70
+ (0, chai_1.expect)(patient.note).to.equal('Secret');
71
+ const he = yield api.healthcareElementApi.createHealthElementWithUser(user, yield api.healthcareElementApi.newInstance(user, patient, {
72
+ note: 'Secret 2',
73
+ }));
74
+ (0, chai_1.expect)(he.note).to.equal('Secret 2');
75
+ (0, chai_1.expect)(he.secretForeignKeys).to.have.length(1);
76
+ (0, chai_1.expect)(he.secretForeignKeys).to.have.members(yield api.patientApi.decryptSecretIdsOf(patient));
77
+ }));
78
+ });
79
+ //# sourceMappingURL=test-api-no-parent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-api-no-parent.js","sourceRoot":"","sources":["../../../test/icc-x-api/test-api-no-parent.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\nimport { getEnvironmentInitializer, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { Apis, IcureApi, ShaVersion } from '../../icc-x-api'\nimport { User } from '../../icc-api/model/User'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { webcrypto } from 'crypto'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport initMasterApi = TestUtils.initMasterApi\n\nchaiUse(require('chai-as-promised'))\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet api: Apis\nlet user: User\nlet login: string\nlet keypair: KeyPair<CryptoKey>\n\ndescribe('A user without access to parent data', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n const initialisationApi = await initMasterApi(env)\n const initialisationUser = await initialisationApi.userApi.getCurrentUser()\n const childHcp = await initialisationApi.healthcarePartyApi.createHealthcareParty({\n id: initialisationApi.cryptoApi.primitives.randomUuid(),\n name: 'Some hcp',\n parentId: initialisationUser.healthcarePartyId,\n })\n login = `childUser-${initialisationApi.cryptoApi.primitives.randomUuid()}`\n const childUser = await initialisationApi.userApi.createUser({\n id: initialisationApi.cryptoApi.primitives.randomUuid(),\n healthcarePartyId: childHcp.id,\n login,\n passwordHash: 'LetMeInForReal',\n })\n keypair = await initialisationApi.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n api = await IcureApi.initialise(\n env.iCureUrl,\n { username: childUser.login!, password: 'LetMeInForReal' },\n new TestCryptoStrategies(keypair),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n disableParentKeysInitialisation: true,\n }\n )\n user = await api.userApi.getCurrentUser()\n })\n\n it('should not be able to initialise the api without disabling parent keys initialisation', async () => {\n await expect(\n IcureApi.initialise(env.iCureUrl, { username: login, password: 'LetMeInForReal' }, new TestCryptoStrategies(keypair), webcrypto as any, fetch, {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n })\n ).to.be.rejected\n })\n\n it('should still be able to create and retrieve his data', async () => {\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, {\n firstName: 'Tasty',\n lastName: 'Test',\n note: 'Secret',\n })\n )\n expect(patient.note).to.equal('Secret')\n const he = await api.healthcareElementApi.createHealthElementWithUser(\n user,\n await api.healthcareElementApi.newInstance(user, patient, {\n note: 'Secret 2',\n })\n )\n expect(he.note).to.equal('Secret 2')\n expect(he.secretForeignKeys).to.have.length(1)\n expect(he.secretForeignKeys).to.have.members(await api.patientApi.decryptSecretIdsOf(patient))\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';