@icure/api 8.6.6 → 8.6.8

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 (60) hide show
  1. package/icc-api/api/IccAccesslogApi.d.ts +14 -0
  2. package/icc-api/api/IccAccesslogApi.js +31 -0
  3. package/icc-api/api/IccAccesslogApi.js.map +1 -1
  4. package/icc-api/api/IccFormApi.d.ts +8 -0
  5. package/icc-api/api/IccFormApi.js +21 -0
  6. package/icc-api/api/IccFormApi.js.map +1 -1
  7. package/icc-api/model/AbstractFilterAccessLog.d.ts +15 -0
  8. package/icc-api/model/AbstractFilterAccessLog.js +21 -0
  9. package/icc-api/model/AbstractFilterAccessLog.js.map +1 -0
  10. package/icc-api/model/ChapterParagraph.d.ts +16 -0
  11. package/icc-api/model/ChapterParagraph.js +21 -0
  12. package/icc-api/model/ChapterParagraph.js.map +1 -0
  13. package/icc-api/model/CryptoActorStub.d.ts +2 -0
  14. package/icc-api/model/CryptoActorStub.js.map +1 -1
  15. package/icc-api/model/Device.d.ts +1 -0
  16. package/icc-api/model/Device.js.map +1 -1
  17. package/icc-api/model/HealthcareParty.d.ts +1 -0
  18. package/icc-api/model/HealthcareParty.js.map +1 -1
  19. package/icc-api/model/Patient.d.ts +1 -0
  20. package/icc-api/model/Patient.js.map +1 -1
  21. package/icc-api/model/Reimbursement.d.ts +2 -0
  22. package/icc-api/model/Reimbursement.js.map +1 -1
  23. package/icc-x-api/crypto/CryptoStrategies.d.ts +2 -1
  24. package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
  25. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +2 -2
  26. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  27. package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -2
  28. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  29. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.d.ts +22 -0
  30. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js +24 -0
  31. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js.map +1 -0
  32. package/icc-x-api/filters/AccessLogByDateFilter.d.ts +20 -0
  33. package/icc-x-api/filters/AccessLogByDateFilter.js +24 -0
  34. package/icc-x-api/filters/AccessLogByDateFilter.js.map +1 -0
  35. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.d.ts +21 -0
  36. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js +24 -0
  37. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js.map +1 -0
  38. package/icc-x-api/icc-contact-x-api.js +3 -3
  39. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  40. package/icc-x-api/utils/crypto-utils.d.ts +2 -1
  41. package/icc-x-api/utils/crypto-utils.js +57 -6
  42. package/icc-x-api/utils/crypto-utils.js.map +1 -1
  43. package/package.json +1 -1
  44. package/test/icc-x-api/crypto/anonymous-delegations-test.js +1 -1
  45. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
  46. package/test/icc-x-api/crypto/cryptoTest.js +99 -1
  47. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
  48. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +3 -3
  49. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
  50. package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
  51. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
  52. package/test/icc-x-api/icc-form-x-api.js +51 -0
  53. package/test/icc-x-api/icc-form-x-api.js.map +1 -1
  54. package/test/icc-x-api/icc-user-x-api-test.js +1 -1
  55. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
  56. package/test/support/CSM-243.js +5 -5
  57. package/test/support/CSM-243.js.map +1 -1
  58. package/test/support/CSM-729.d.ts +1 -0
  59. package/test/support/CSM-729.js +225 -0
  60. package/test/support/CSM-729.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"entity-with-attachments-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/entity-with-attachments-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { getEnvironmentInitializer, hcp1Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport * as models from '../../icc-api/model/models'\nimport { User } from '../../icc-api/model/User'\nimport { Apis, ua2utf8, utf8_2ua } from '../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet apis: Apis\nlet user: User\n\ninterface EntityWithAttachmentApi<T> {\n createEntity(): Promise<T>\n encryptAndSetAttachment(entity: T, attachment: ArrayBuffer | Uint8Array): Promise<T>\n getAndDecryptAttachment(entity: T, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer>\n getEncryptedAttachment(entity: T): Promise<ArrayBuffer>\n}\n\nconst entityWithAttachmentApis = {\n docMainAttachment: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Document>>{\n async createEntity(): Promise<models.Document> {\n return apis.documentApi.createDocument(await apis.documentApi.newInstance(currentUser))\n },\n encryptAndSetAttachment(entity: models.Document, attachment: ArrayBuffer | Uint8Array): Promise<models.Document> {\n return apis.documentApi.encryptAndSetDocumentAttachment(entity, attachment)\n },\n getAndDecryptAttachment(entity: models.Document, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.documentApi.getAndDecryptDocumentAttachment(entity, validator)\n },\n getEncryptedAttachment(entity: models.Document): Promise<ArrayBuffer> {\n return apis.documentApi.getDocumentAttachment(entity.id!, 'unused')\n },\n },\n docSecondaryAttachment: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Document>>{\n async createEntity(): Promise<models.Document> {\n return apis.documentApi.createDocument(await apis.documentApi.newInstance(currentUser))\n },\n encryptAndSetAttachment(entity: models.Document, attachment: ArrayBuffer | Uint8Array): Promise<models.Document> {\n return apis.documentApi.encryptAndSetSecondaryDocumentAttachment(entity, 'secondary', attachment)\n },\n getAndDecryptAttachment(entity: models.Document, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.documentApi.getAndDecryptSecondaryDocumentAttachment(entity, 'secondary', validator)\n },\n getEncryptedAttachment(entity: models.Document): Promise<ArrayBuffer> {\n return apis.documentApi.getSecondaryAttachment(entity.id!, 'secondary')\n },\n },\n receipt: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Receipt>>{\n async createEntity(): Promise<models.Receipt> {\n return apis.receiptApi.createReceipt(await apis.receiptApi.newInstance(currentUser, {}))\n },\n async encryptAndSetAttachment(entity: models.Receipt, attachment: ArrayBuffer | Uint8Array): Promise<models.Receipt> {\n return apis.receiptApi.encryptAndSetReceiptAttachment(entity, 'tack', attachment)\n },\n getAndDecryptAttachment(entity: models.Receipt, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.receiptApi.getAndDecryptReceiptAttachment(entity, (entity.attachmentIds ?? {})['tack'], validator)\n },\n getEncryptedAttachment(entity: models.Receipt): Promise<ArrayBuffer> {\n return apis.receiptApi.getReceiptAttachment(entity.id!, (entity.attachmentIds ?? {})['tack'])\n },\n },\n}\n\nbefore(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n for (const [a, b] of Object.entries(env.dataOwnerDetails)) {\n console.log(a)\n console.log(b.password)\n console.log('')\n }\n apis = await initApi(env!, hcp1Username)\n user = await apis.userApi.getCurrentUser()\n})\n\ndescribe('Entity attachment update methods', async function () {\n Object.entries(entityWithAttachmentApis).forEach(([type, attachmentApiInitialiser]) => {\n it(`should automatically encrypt and decrypt attachments (${type})`, async () => {\n const attachmentApi = attachmentApiInitialiser(apis, user)\n const entity = await attachmentApi.createEntity()\n console.log(`entity id ${entity.id}`)\n const attachmentContent = 'This is some secret attachment'\n const entityWithEncrypted = await attachmentApi.encryptAndSetAttachment(entity, utf8_2ua(attachmentContent))\n const decryptedAttachment = await attachmentApi.getAndDecryptAttachment(entityWithEncrypted, async (d) => {\n try {\n return ua2utf8(d) === attachmentContent\n } catch {\n return false\n }\n })\n expect(ua2utf8(decryptedAttachment)).to.equal(attachmentContent)\n const encryptedAttachment = await attachmentApi.getEncryptedAttachment(entityWithEncrypted)\n let conversionFailed\n try {\n conversionFailed = ua2utf8(encryptedAttachment) !== attachmentContent\n } catch {\n conversionFailed = true\n }\n expect(conversionFailed).to.be.true\n const attachmentContent2 = 'This is an updated secret attachment'\n const entityWithEncrypted2 = await attachmentApi.encryptAndSetAttachment(entityWithEncrypted, utf8_2ua(attachmentContent2))\n const decryptedAttachment2 = await attachmentApi.getAndDecryptAttachment(entityWithEncrypted2, async (d) => {\n try {\n return ua2utf8(d) === attachmentContent2\n } catch {\n return false\n }\n })\n expect(ua2utf8(decryptedAttachment2)).to.equal(attachmentContent2)\n const encryptedAttachment2 = await attachmentApi.getEncryptedAttachment(entityWithEncrypted2)\n let conversionFailed2\n try {\n conversionFailed2 = ua2utf8(encryptedAttachment2) !== attachmentContent2\n } catch {\n conversionFailed2 = true\n }\n expect(conversionFailed2).to.be.true\n })\n })\n})\n"]}
1
+ {"version":3,"file":"entity-with-attachments-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/entity-with-attachments-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { getEnvironmentInitializer, hcp1Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport * as models from '../../icc-api/model/models'\nimport { User } from '../../icc-api/model/User'\nimport { Apis, ua2utf8, utf8_2ua } from '../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet apis: Apis\nlet user: User\n\ninterface EntityWithAttachmentApi<T> {\n createEntity(): Promise<T>\n encryptAndSetAttachment(entity: T, attachment: ArrayBuffer | Uint8Array): Promise<T>\n getAndDecryptAttachment(entity: T, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer>\n getEncryptedAttachment(entity: T): Promise<ArrayBuffer>\n}\n\nconst entityWithAttachmentApis = {\n docMainAttachment: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Document>>{\n async createEntity(): Promise<models.Document> {\n return apis.documentApi.createDocumentWithUser(currentUser, await apis.documentApi.newInstance(currentUser))\n },\n encryptAndSetAttachment(entity: models.Document, attachment: ArrayBuffer | Uint8Array): Promise<models.Document> {\n return apis.documentApi.encryptAndSetDocumentAttachment(entity, attachment)\n },\n getAndDecryptAttachment(entity: models.Document, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.documentApi.getAndDecryptDocumentAttachment(entity, validator)\n },\n getEncryptedAttachment(entity: models.Document): Promise<ArrayBuffer> {\n return apis.documentApi.getDocumentAttachment(entity.id!, 'unused')\n },\n },\n docSecondaryAttachment: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Document>>{\n async createEntity(): Promise<models.Document> {\n return apis.documentApi.createDocumentWithUser(currentUser, await apis.documentApi.newInstance(currentUser))\n },\n encryptAndSetAttachment(entity: models.Document, attachment: ArrayBuffer | Uint8Array): Promise<models.Document> {\n return apis.documentApi.encryptAndSetSecondaryDocumentAttachment(entity, 'secondary', attachment)\n },\n getAndDecryptAttachment(entity: models.Document, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.documentApi.getAndDecryptSecondaryDocumentAttachment(entity, 'secondary', validator)\n },\n getEncryptedAttachment(entity: models.Document): Promise<ArrayBuffer> {\n return apis.documentApi.getSecondaryAttachment(entity.id!, 'secondary')\n },\n },\n receipt: (apis: Apis, currentUser: User) =>\n <EntityWithAttachmentApi<models.Receipt>>{\n async createEntity(): Promise<models.Receipt> {\n return apis.receiptApi.createReceipt(await apis.receiptApi.newInstance(currentUser, {}))\n },\n async encryptAndSetAttachment(entity: models.Receipt, attachment: ArrayBuffer | Uint8Array): Promise<models.Receipt> {\n return apis.receiptApi.encryptAndSetReceiptAttachment(entity, 'tack', attachment)\n },\n getAndDecryptAttachment(entity: models.Receipt, validator: (decrypted: ArrayBuffer) => Promise<boolean>): Promise<ArrayBuffer> {\n return apis.receiptApi.getAndDecryptReceiptAttachment(entity, (entity.attachmentIds ?? {})['tack'], validator)\n },\n getEncryptedAttachment(entity: models.Receipt): Promise<ArrayBuffer> {\n return apis.receiptApi.getReceiptAttachment(entity.id!, (entity.attachmentIds ?? {})['tack'])\n },\n },\n}\n\nbefore(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n for (const [a, b] of Object.entries(env.dataOwnerDetails)) {\n console.log(a)\n console.log(b.password)\n console.log('')\n }\n apis = await initApi(env!, hcp1Username)\n user = await apis.userApi.getCurrentUser()\n})\n\ndescribe('Entity attachment update methods', async function () {\n Object.entries(entityWithAttachmentApis).forEach(([type, attachmentApiInitialiser]) => {\n it(`should automatically encrypt and decrypt attachments (${type})`, async () => {\n const attachmentApi = attachmentApiInitialiser(apis, user)\n const entity = await attachmentApi.createEntity()\n console.log(`entity id ${entity.id}`)\n const attachmentContent = 'This is some secret attachment'\n const entityWithEncrypted = await attachmentApi.encryptAndSetAttachment(entity, utf8_2ua(attachmentContent))\n const decryptedAttachment = await attachmentApi.getAndDecryptAttachment(entityWithEncrypted, async (d) => {\n try {\n return ua2utf8(d) === attachmentContent\n } catch {\n return false\n }\n })\n expect(ua2utf8(decryptedAttachment)).to.equal(attachmentContent)\n const encryptedAttachment = await attachmentApi.getEncryptedAttachment(entityWithEncrypted)\n let conversionFailed\n try {\n conversionFailed = ua2utf8(encryptedAttachment) !== attachmentContent\n } catch {\n conversionFailed = true\n }\n expect(conversionFailed).to.be.true\n const attachmentContent2 = 'This is an updated secret attachment'\n const entityWithEncrypted2 = await attachmentApi.encryptAndSetAttachment(entityWithEncrypted, utf8_2ua(attachmentContent2))\n const decryptedAttachment2 = await attachmentApi.getAndDecryptAttachment(entityWithEncrypted2, async (d) => {\n try {\n return ua2utf8(d) === attachmentContent2\n } catch {\n return false\n }\n })\n expect(ua2utf8(decryptedAttachment2)).to.equal(attachmentContent2)\n const encryptedAttachment2 = await attachmentApi.getEncryptedAttachment(entityWithEncrypted2)\n let conversionFailed2\n try {\n conversionFailed2 = ua2utf8(encryptedAttachment2) !== attachmentContent2\n } catch {\n conversionFailed2 = true\n }\n expect(conversionFailed2).to.be.true\n })\n })\n})\n"]}
@@ -180,6 +180,57 @@ describe('icc-form-x-api Tests', () => {
180
180
  const templatesInGroupAfterDelete = yield formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id);
181
181
  (0, chai_1.expect)(templatesInGroupAfterDelete.map((t) => t.id)).to.not.include(createdTemplate.id);
182
182
  }));
183
+ it('should find form templates by specialty in a group', () => __awaiter(void 0, void 0, void 0, function* () {
184
+ // Given
185
+ const { formApi, userApi } = yield initApi(env);
186
+ const currentUser = yield userApi.getCurrentUser();
187
+ const groupId = env.testGroupId;
188
+ const specialtyCode = 'SPECIALTY-' + (0, crypto_1.randomUUID)();
189
+ const otherSpecialtyCode = 'SPECIALTY-' + (0, crypto_1.randomUUID)();
190
+ const templatesToCreate = [
191
+ new FormTemplate_1.FormTemplate({
192
+ id: (0, crypto_1.randomUUID)(),
193
+ guid: (0, crypto_1.randomUUID)(),
194
+ author: currentUser.id,
195
+ name: 'Specialty Template 1',
196
+ specialty: new CodeStub_1.CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),
197
+ }),
198
+ new FormTemplate_1.FormTemplate({
199
+ id: (0, crypto_1.randomUUID)(),
200
+ guid: (0, crypto_1.randomUUID)(),
201
+ author: currentUser.id,
202
+ name: 'Specialty Template 2',
203
+ specialty: new CodeStub_1.CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),
204
+ }),
205
+ new FormTemplate_1.FormTemplate({
206
+ id: (0, crypto_1.randomUUID)(),
207
+ guid: (0, crypto_1.randomUUID)(),
208
+ author: currentUser.id,
209
+ name: 'Other Specialty Template',
210
+ specialty: new CodeStub_1.CodeStub({ code: otherSpecialtyCode, type: 'specialty', version: '1' }),
211
+ }),
212
+ ];
213
+ const createdTemplates = yield formApi.createFormTemplatesInGroup(groupId, templatesToCreate);
214
+ (0, chai_1.expect)(createdTemplates).to.have.lengthOf(3);
215
+ // When: find by specialty
216
+ const templatesBySpecialty = yield formApi.getFormTemplatesBySpecialtyInGroup(groupId, specialtyCode);
217
+ // Then: should return only the 2 templates with the matching specialty
218
+ (0, chai_1.expect)(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplates[0].id);
219
+ (0, chai_1.expect)(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplates[1].id);
220
+ (0, chai_1.expect)(templatesBySpecialty.map((t) => t.id)).to.not.include(createdTemplates[2].id);
221
+ // When: find by other specialty
222
+ const otherTemplates = yield formApi.getFormTemplatesBySpecialtyInGroup(groupId, otherSpecialtyCode);
223
+ // Then: should return only the 1 template with the other specialty
224
+ (0, chai_1.expect)(otherTemplates.map((t) => t.id)).to.include(createdTemplates[2].id);
225
+ (0, chai_1.expect)(otherTemplates.map((t) => t.id)).to.not.include(createdTemplates[0].id);
226
+ // When: find by non-existent specialty
227
+ const emptyResult = yield formApi.getFormTemplatesBySpecialtyInGroup(groupId, 'NONEXISTENT-' + (0, crypto_1.randomUUID)());
228
+ // Then: should return empty
229
+ (0, chai_1.expect)(emptyResult).to.have.lengthOf(0);
230
+ // Cleanup
231
+ const idsAndRevs = createdTemplates.map((t) => new IdWithRev_1.IdWithRev({ id: t.id, rev: t.rev }));
232
+ yield formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs);
233
+ }));
183
234
  });
184
235
  (0, test_utils_1.describeNoLite)('Form Templates Batch Operations in Group Tests', () => {
185
236
  it('should create, get, and modify multiple form templates in a group (batch)', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"icc-form-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-form-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 } from 'mocha'\nimport { IccPatientXApi, IccUserXApi } from '../../icc-x-api'\nimport { IccFormApi } from '../../icc-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { Form } from '../../icc-api/model/Form'\nimport { FormTemplate } from '../../icc-api/model/FormTemplate'\nimport { CodeStub } from '../../icc-api/model/CodeStub'\nimport { assert, expect } from 'chai'\nimport initApi = TestUtils.initApi\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport { IdWithRev } from '../../icc-api/model/IdWithRev'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('icc-form-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 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('Test', async () => {\n // Given\n const username = env.dataOwnerDetails[hcp1Username].user\n const password = env.dataOwnerDetails[hcp1Username].password\n\n const authProvider = new BasicAuthenticationProvider(username, password)\n\n const userApi = new IccUserXApi(env.iCureUrl, {}, authProvider, null as any, fetch)\n const formApi = new IccFormApi(env.iCureUrl, {}, authProvider, fetch)\n\n const currentUser = await userApi.getCurrentUser()\n })\n\n it('Test findBy', async () => {\n // Given\n const {\n userApi: userApiForHcp,\n dataOwnerApi: dataOwnerApiForHcp,\n patientApi: patientApiForHcp,\n cryptoApi: cryptoApiForHcp,\n dataOwnerApi: dateOwnerApiForHcp,\n formApi: formXApi,\n } = await initApi(env, hcp1Username)\n const hcpUser = await userApiForHcp.getCurrentUser()\n const patient = (await createPatient(patientApiForHcp, hcpUser)) as Patient\n\n const form = new Form({\n id: randomUUID(),\n created: new Date().getTime(),\n modified: new Date().getTime(),\n responsible: hcpUser.healthcarePartyId!,\n author: hcpUser.id,\n codes: [],\n tags: [],\n user: hcpUser.id,\n patient: patient.id,\n })\n const formToCreate = await formXApi.newInstance(hcpUser, patient, form)\n const createdForm = await formXApi.createForm(formToCreate)\n\n const foundItems: Form[] = (await formXApi.findBy(hcpUser.healthcarePartyId!, patient, false)) as Form[]\n const foundItemsUsingPost: Form[] = (await formXApi.findBy(hcpUser.healthcarePartyId!, patient, true)) as Form[]\n\n assert(foundItems.length == 1, 'Found items should be 1')\n assert(foundItems[0].id == createdForm.id, 'Found item should be the created one')\n\n assert(foundItemsUsingPost.length == 1, 'Found items using post should be 1')\n assert(foundItemsUsingPost[0].id == createdForm.id, 'Found item using post should be the created one')\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 samplePatient = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio' })\n )\n const entity = await api1.formApi.createForm(await api1.formApi.newInstance(user1, samplePatient))\n await api2.formApi\n .getForm(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.formApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.formApi.getForm(entity.id!)\n expect((await api2.formApi.decryptPatientIdOf(retrieved))[0]).to.equal(samplePatient.id)\n })\n\n it('Tests for Form Templates', async () => {\n // Given\n const { formApi, userApi } = await initApi(env, hcp1Username)\n const guid = randomUUID()\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n const user = await userApi.getCurrentUser()\n\n const formTemplateToCreate = new FormTemplate({\n id: randomUUID(),\n guid: guid,\n author: user.id,\n name: 'My Test Template',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Description of the template',\n })\n\n // Create\n const createdTemplate = await formApi.createFormTemplate(formTemplateToCreate)\n expect(createdTemplate.id).to.not.be.undefined\n expect(createdTemplate.guid).to.equal(guid)\n expect(createdTemplate.name).to.equal('My Test Template')\n\n // Get\n const retrievedTemplate = await formApi.getFormTemplate(createdTemplate.id!)\n expect(retrievedTemplate.id).to.equal(createdTemplate.id)\n\n // Find all\n const allTemplates = await formApi.findFormTemplates()\n expect(allTemplates.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Find by specialty\n const templatesBySpecialty = await formApi.findFormTemplatesBySpeciality(specialtyCode)\n expect(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplate.id)\n expect(templatesBySpecialty.length).to.be.greaterThan(0)\n\n // Get by GUID (using getFormTemplatesByGuid)\n const templatesByGuid = await formApi.getFormTemplatesByGuid(guid, specialtyCode)\n expect(templatesByGuid.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Update\n createdTemplate.name = 'Updated Name'\n const updatedTemplate = await formApi.updateFormTemplate(createdTemplate.id!, createdTemplate)\n expect(updatedTemplate.name).to.equal('Updated Name')\n\n // Delete\n await formApi.deleteFormTemplate(createdTemplate.id!)\n try {\n await formApi.getFormTemplate(createdTemplate.id!)\n assert.fail('Should have thrown an error')\n } catch (e) {\n // Expected\n }\n })\n\n describeNoLite('Form Templates in Group Tests', () => {\n it('should create, find, update and delete form templates in a group', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const guid = randomUUID()\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Use the existing test group ID\n const groupId = env.testGroupId\n\n const formTemplateToCreate = new FormTemplate({\n id: randomUUID(),\n guid: guid,\n author: currentUser.id,\n name: 'My Group Template',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Description of the group template',\n })\n\n // Create In Group\n const createdTemplate = await formApi.createFormTemplateInGroup(groupId, formTemplateToCreate)\n expect(createdTemplate.id).to.not.be.undefined\n expect(createdTemplate.guid).to.equal(guid)\n if (createdTemplate.group) {\n expect(createdTemplate.group.guid).to.equal(groupId)\n }\n\n // Get In Group\n const templatesInGroup = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n expect(templatesInGroup.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Update In Group\n createdTemplate.name = 'Updated Group Name'\n const updatedTemplate = await formApi.updateFormTemplateInGroup(groupId, createdTemplate.id!, createdTemplate)\n expect(updatedTemplate.name).to.equal('Updated Group Name')\n\n // Delete In Group\n await formApi.deleteFormTemplateInGroup(groupId, updatedTemplate.id!, updatedTemplate.rev!)\n\n // Verify deletion\n const templatesInGroupAfterDelete = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n expect(templatesInGroupAfterDelete.map((t) => t.id)).to.not.include(createdTemplate.id)\n })\n })\n\n describeNoLite('Form Templates Batch Operations in Group Tests', () => {\n it('should create, get, and modify multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create multiple templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'First batch template',\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Second batch template',\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 3',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Third batch template',\n }),\n ]\n\n // Create batch\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(3)\n expect(createdTemplates[0].name).to.equal('Batch Template 1')\n expect(createdTemplates[1].name).to.equal('Batch Template 2')\n expect(createdTemplates[2].name).to.equal('Batch Template 3')\n createdTemplates.forEach((template) => {\n expect(template.id).to.not.be.undefined\n expect(template.rev).to.not.be.undefined\n })\n\n // Get batch by IDs\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(\n groupId,\n createdTemplates.map((t) => t.id!)\n )\n expect(retrievedTemplates).to.have.lengthOf(3)\n expect(retrievedTemplates.map((t) => t.id)).to.have.members(createdTemplates.map((t) => t.id))\n\n // Modify batch\n const templatesForUpdate = createdTemplates.map((t, index) => ({\n ...t,\n name: `Updated Batch Template ${index + 1}`,\n }))\n const updatedTemplates = await formApi.modifyFormTemplatesInGroup(groupId, templatesForUpdate)\n expect(updatedTemplates).to.have.lengthOf(3)\n expect(updatedTemplates[0].name).to.equal('Updated Batch Template 1')\n expect(updatedTemplates[1].name).to.equal('Updated Batch Template 2')\n expect(updatedTemplates[2].name).to.equal('Updated Batch Template 3')\n\n // Clean up - delete batch\n const idsAndRevs = updatedTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs)\n expect(deleteResults).to.have.lengthOf(3)\n deleteResults.forEach((result) => {\n expect(result.id).to.not.be.undefined\n expect(result.rev).to.not.be.undefined\n })\n })\n\n it('should delete and undelete multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Delete Test Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Delete Test Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n ]\n\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(2)\n\n // Delete batch\n const idsAndRevs = createdTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs)\n expect(deleteResults).to.have.lengthOf(2)\n\n // Verify deletion - templates should not be in active list\n const allTemplates = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n const activeIds = allTemplates.map((t) => t.id)\n createdTemplates.forEach((t) => {\n expect(activeIds).to.not.include(t.id)\n })\n\n // Undelete batch - use the updated revisions from delete results\n const undeleteIdsAndRevs = deleteResults.map((result) => new IdWithRev({ id: result.id!, rev: result.rev! }))\n const undeletedTemplates = await formApi.undeleteFormTemplatesInGroup(groupId, undeleteIdsAndRevs)\n expect(undeletedTemplates).to.have.lengthOf(2)\n undeletedTemplates.forEach((template) => {\n expect(template.id).to.not.be.undefined\n expect(template.rev).to.not.be.undefined\n expect(template.deletionDate).to.be.undefined\n })\n\n // Verify undelete - templates should be back in active list\n const templatesAfterUndelete = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n const activeIdsAfterUndelete = templatesAfterUndelete.map((t) => t.id)\n undeletedTemplates.forEach((t) => {\n expect(activeIdsAfterUndelete).to.include(t.id)\n })\n\n // Final cleanup - delete again\n const finalIdsAndRevs = undeletedTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n await formApi.deleteFormTemplatesInGroup(groupId, finalIdsAndRevs)\n })\n\n it('should purge multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Purge Test Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Purge Test Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n ]\n\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(2)\n\n // First delete them (purge requires deletion first)\n const deleteIdsAndRevs = createdTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, deleteIdsAndRevs)\n expect(deleteResults).to.have.lengthOf(2)\n\n // Purge batch\n const purgeIdsAndRevs = deleteResults.map((result) => new IdWithRev({ id: result.id!, rev: result.rev! }))\n const purgeResults = await formApi.purgeFormTemplatesInGroup(groupId, purgeIdsAndRevs)\n expect(purgeResults).to.have.lengthOf(2)\n purgeResults.forEach((result) => {\n expect(result.id).to.not.be.undefined\n })\n\n // Verify purge - trying to get the templates should fail or return empty\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(\n groupId,\n createdTemplates.map((t) => t.id!)\n )\n expect(retrievedTemplates).to.have.lengthOf(0)\n })\n\n it('should handle empty batch operations gracefully', async () => {\n // Given\n const { formApi } = await initApi(env)\n const groupId = env.testGroupId\n\n // Test with empty arrays\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, [])\n expect(createdTemplates).to.have.lengthOf(0)\n\n const modifiedTemplates = await formApi.modifyFormTemplatesInGroup(groupId, [])\n expect(modifiedTemplates).to.have.lengthOf(0)\n\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(groupId, [])\n expect(retrievedTemplates).to.have.lengthOf(0)\n\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, [])\n expect(deleteResults).to.have.lengthOf(0)\n\n const undeleteResults = await formApi.undeleteFormTemplatesInGroup(groupId, [])\n expect(undeleteResults).to.have.lengthOf(0)\n\n const purgeResults = await formApi.purgeFormTemplatesInGroup(groupId, [])\n expect(purgeResults).to.have.lengthOf(0)\n })\n })\n})\n"]}
1
+ {"version":3,"file":"icc-form-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-form-x-api.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAAyB;AACzB,oDAAuI;AACvI,iCAA8B;AAC9B,+CAA6D;AAC7D,2CAA0C;AAC1C,yDAAqD;AAErD,mCAAmC;AACnC,mDAA+C;AAC/C,mEAA+D;AAC/D,2DAAuD;AACvD,+BAAqC;AACrC,IAAO,OAAO,GAAG,sBAAS,CAAC,OAAO,CAAA;AAClC,mDAAmE;AACnE,wFAAyF;AACzF,6DAAyD;AAEzD,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,IAAI,GAAa,CAAA;AAEjB,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;QACpD,CAAC;KAAA,CAAC,CAAA;IAEF,SAAe,aAAa,CAAC,gBAAgC,EAAE,OAAa;;YAC1E,OAAO,gBAAgB,CAAC,qBAAqB,CAC3C,OAAO,EACP,MAAM,gBAAgB,CAAC,WAAW,CAChC,OAAO,EACP,IAAI,iBAAO,CAAC;gBACV,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,SAAS,EAAE,MAAM;gBACjB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,kBAAkB;aACzB,CAAC,CACH,CACF,CAAA;QACH,CAAC;KAAA;IAED,EAAE,CAAC,MAAM,EAAE,GAAS,EAAE;QACpB,QAAQ;QACR,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,yBAAY,CAAC,CAAC,IAAI,CAAA;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,yBAAY,CAAC,CAAC,QAAQ,CAAA;QAE5D,MAAM,YAAY,GAAG,IAAI,oDAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAExE,MAAM,OAAO,GAAG,IAAI,uBAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAW,EAAE,KAAK,CAAC,CAAA;QACnF,MAAM,OAAO,GAAG,IAAI,oBAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;QAErE,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;IACpD,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,aAAa,EAAE,GAAS,EAAE;QAC3B,QAAQ;QACR,MAAM,EACJ,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,kBAAkB,EAChC,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,eAAe,EAC1B,YAAY,EAAE,kBAAkB,EAChC,OAAO,EAAE,QAAQ,GAClB,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,yBAAY,CAAC,CAAA;QACpC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,CAAC,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAY,CAAA;QAE3E,MAAM,IAAI,GAAG,IAAI,WAAI,CAAC;YACpB,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;YAC7B,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;YAC9B,WAAW,EAAE,OAAO,CAAC,iBAAkB;YACvC,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,OAAO,CAAC,EAAE;YAChB,OAAO,EAAE,OAAO,CAAC,EAAE;SACpB,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACvE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAE3D,MAAM,UAAU,GAAW,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAW,CAAA;QACxG,MAAM,mBAAmB,GAAW,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAW,CAAA;QAEhH,IAAA,aAAM,EAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACzD,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,EAAE,EAAE,sCAAsC,CAAC,CAAA;QAElF,IAAA,aAAM,EAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,EAAE,oCAAoC,CAAC,CAAA;QAC7E,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,EAAE,EAAE,iDAAiD,CAAC,CAAA;IACxG,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAS,EAAE;QAClD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;QACjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAC/D,KAAK,EACL,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CACtF,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAA;QAClG,MAAM,IAAI,CAAC,OAAO;aACf,OAAO,CAAC,MAAM,CAAC,EAAG,CAAC;aACnB,IAAI,CAAC,GAAG,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,cAAc;QAChB,CAAC,CAAC,CAAA;QACJ,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAkB,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAG,CAAC,CAAA;QACxD,IAAA,aAAM,EAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAC1F,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAS,EAAE;QACxC,QAAQ;QACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,yBAAY,CAAC,CAAA;QAC7D,MAAM,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAA;QACzB,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;QAE3C,MAAM,oBAAoB,GAAG,IAAI,2BAAY,CAAC;YAC5C,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACjF,KAAK,EAAE,6BAA6B;SACrC,CAAC,CAAA;QAEF,SAAS;QACT,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAA;QAC9E,IAAA,aAAM,EAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAC9C,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAEzD,MAAM;QACN,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,EAAG,CAAC,CAAA;QAC5E,IAAA,aAAM,EAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAEzD,WAAW;QACX,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAA;QACtD,IAAA,aAAM,EAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAEpE,oBAAoB;QACpB,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAA;QACvF,IAAA,aAAM,EAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAC5E,IAAA,aAAM,EAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAExD,6CAA6C;QAC7C,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACjF,IAAA,aAAM,EAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAEvE,SAAS;QACT,eAAe,CAAC,IAAI,GAAG,cAAc,CAAA;QACrC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAG,EAAE,eAAe,CAAC,CAAA;QAC9F,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAErD,SAAS;QACT,MAAM,OAAO,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAG,CAAC,CAAA;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,EAAG,CAAC,CAAA;YAClD,aAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW;QACb,CAAC;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,IAAA,2BAAc,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,kEAAkE,EAAE,GAAS,EAAE;YAChF,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAA;YACzB,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YAEjD,iCAAiC;YACjC,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAE/B,MAAM,oBAAoB,GAAG,IAAI,2BAAY,CAAC;gBAC5C,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,WAAW,CAAC,EAAE;gBACtB,IAAI,EAAE,mBAAmB;gBACzB,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;gBACjF,KAAK,EAAE,mCAAmC;aAC3C,CAAC,CAAA;YAEF,kBAAkB;YAClB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;YAC9F,IAAA,aAAM,EAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YAC9C,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAA,aAAM,EAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtD,CAAC;YAED,eAAe;YACf,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAG,CAAC,CAAA;YAC9F,IAAA,aAAM,EAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;YAExE,kBAAkB;YAClB,eAAe,CAAC,IAAI,GAAG,oBAAoB,CAAA;YAC3C,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,eAAe,CAAC,EAAG,EAAE,eAAe,CAAC,CAAA;YAC9G,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;YAE3D,kBAAkB;YAClB,MAAM,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,eAAe,CAAC,EAAG,EAAE,eAAe,CAAC,GAAI,CAAC,CAAA;YAE3F,kBAAkB;YAClB,MAAM,2BAA2B,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAG,CAAC,CAAA;YACzG,IAAA,aAAM,EAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QACzF,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,GAAS,EAAE;YAClE,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAC/B,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YACjD,MAAM,kBAAkB,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YAEtD,MAAM,iBAAiB,GAAG;gBACxB,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,sBAAsB;oBAC5B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,sBAAsB;oBAC5B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,0BAA0B;oBAChC,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBACvF,CAAC;aACH,CAAA;YAED,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YAC7F,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE5C,0BAA0B;YAC1B,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,kCAAkC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;YAErG,uEAAuE;YACvE,IAAA,aAAM,EAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAChF,IAAA,aAAM,EAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAChF,IAAA,aAAM,EAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAEpF,gCAAgC;YAChC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,kCAAkC,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;YAEpG,mEAAmE;YACnE,IAAA,aAAM,EAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC1E,IAAA,aAAM,EAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAE9E,uCAAuC;YACvC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,kCAAkC,CAAC,OAAO,EAAE,cAAc,GAAG,IAAA,mBAAU,GAAE,CAAC,CAAA;YAE5G,4BAA4B;YAC5B,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEvC,UAAU;YACV,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YACzF,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAC/D,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAA,2BAAc,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACpE,EAAE,CAAC,2EAA2E,EAAE,GAAS,EAAE;YACzF,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAC/B,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YAEjD,4BAA4B;YAC5B,MAAM,iBAAiB,GAAG;gBACxB,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;oBACjF,KAAK,EAAE,sBAAsB;iBAC9B,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;oBACjF,KAAK,EAAE,uBAAuB;iBAC/B,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,kBAAkB;oBACxB,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;oBACjF,KAAK,EAAE,sBAAsB;iBAC9B,CAAC;aACH,CAAA;YAED,eAAe;YACf,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YAC7F,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC5C,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;YAC7D,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;YAC7D,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;YAC7D,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACpC,IAAA,aAAM,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YAC1C,CAAC,CAAC,CAAA;YAEF,mBAAmB;YACnB,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAC9D,OAAO,EACP,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC,CACnC,CAAA;YACD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC9C,IAAA,aAAM,EAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAE9F,eAAe;YACf,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,iCACzD,CAAC,KACJ,IAAI,EAAE,0BAA0B,KAAK,GAAG,CAAC,EAAE,IAC3C,CAAC,CAAA;YACH,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;YAC9F,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC5C,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACrE,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACrE,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAErE,0BAA0B;YAC1B,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YACzF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YACnF,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACzC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,IAAA,aAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACrC,IAAA,aAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YACxC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,uEAAuE,EAAE,GAAS,EAAE;YACrF,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAC/B,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YAEjD,mBAAmB;YACnB,MAAM,iBAAiB,GAAG;gBACxB,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,wBAAwB;oBAC9B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,wBAAwB;oBAC9B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;aACH,CAAA;YAED,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YAC7F,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE5C,eAAe;YACf,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YACzF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YACnF,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEzC,2DAA2D;YAC3D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAG,CAAC,CAAA;YAC1F,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC/C,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC7B,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACxC,CAAC,CAAC,CAAA;YAEF,iEAAiE;YACjE,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YAC7G,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,4BAA4B,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;YAClG,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC9C,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtC,IAAA,aAAM,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACxC,IAAA,aAAM,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;YAC/C,CAAC,CAAC,CAAA;YAEF,4DAA4D;YAC5D,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAG,CAAC,CAAA;YACpG,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACtE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/B,IAAA,aAAM,EAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACjD,CAAC,CAAC,CAAA;YAEF,+BAA+B;YAC/B,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YAChG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;QACpE,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,GAAS,EAAE;YACvE,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAC/B,MAAM,aAAa,GAAG,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAA;YAEjD,mBAAmB;YACnB,MAAM,iBAAiB,GAAG;gBACxB,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,uBAAuB;oBAC7B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;gBACF,IAAI,2BAAY,CAAC;oBACf,EAAE,EAAE,IAAA,mBAAU,GAAE;oBAChB,IAAI,EAAE,IAAA,mBAAU,GAAE;oBAClB,MAAM,EAAE,WAAW,CAAC,EAAE;oBACtB,IAAI,EAAE,uBAAuB;oBAC7B,SAAS,EAAE,IAAI,mBAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;iBAClF,CAAC;aACH,CAAA;YAED,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YAC7F,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE5C,oDAAoD;YACpD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YAC/F,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;YACzF,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEzC,cAAc;YACd,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,qBAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAI,EAAE,CAAC,CAAC,CAAA;YAC1G,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;YACtF,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACxC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC9B,IAAA,aAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YACvC,CAAC,CAAC,CAAA;YAEF,yEAAyE;YACzE,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAC9D,OAAO,EACP,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC,CACnC,CAAA;YACD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,GAAS,EAAE;YAC/D,QAAQ;YACR,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;YACtC,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAA;YAE/B,yBAAyB;YACzB,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC9E,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE5C,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC/E,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE7C,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC7E,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE9C,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC3E,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEzC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,4BAA4B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC/E,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE3C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YACzE,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport { IccPatientXApi, IccUserXApi } from '../../icc-x-api'\nimport { IccFormApi } from '../../icc-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { Form } from '../../icc-api/model/Form'\nimport { FormTemplate } from '../../icc-api/model/FormTemplate'\nimport { CodeStub } from '../../icc-api/model/CodeStub'\nimport { assert, expect } from 'chai'\nimport initApi = TestUtils.initApi\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport { IdWithRev } from '../../icc-api/model/IdWithRev'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('icc-form-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 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('Test', async () => {\n // Given\n const username = env.dataOwnerDetails[hcp1Username].user\n const password = env.dataOwnerDetails[hcp1Username].password\n\n const authProvider = new BasicAuthenticationProvider(username, password)\n\n const userApi = new IccUserXApi(env.iCureUrl, {}, authProvider, null as any, fetch)\n const formApi = new IccFormApi(env.iCureUrl, {}, authProvider, fetch)\n\n const currentUser = await userApi.getCurrentUser()\n })\n\n it('Test findBy', async () => {\n // Given\n const {\n userApi: userApiForHcp,\n dataOwnerApi: dataOwnerApiForHcp,\n patientApi: patientApiForHcp,\n cryptoApi: cryptoApiForHcp,\n dataOwnerApi: dateOwnerApiForHcp,\n formApi: formXApi,\n } = await initApi(env, hcp1Username)\n const hcpUser = await userApiForHcp.getCurrentUser()\n const patient = (await createPatient(patientApiForHcp, hcpUser)) as Patient\n\n const form = new Form({\n id: randomUUID(),\n created: new Date().getTime(),\n modified: new Date().getTime(),\n responsible: hcpUser.healthcarePartyId!,\n author: hcpUser.id,\n codes: [],\n tags: [],\n user: hcpUser.id,\n patient: patient.id,\n })\n const formToCreate = await formXApi.newInstance(hcpUser, patient, form)\n const createdForm = await formXApi.createForm(formToCreate)\n\n const foundItems: Form[] = (await formXApi.findBy(hcpUser.healthcarePartyId!, patient, false)) as Form[]\n const foundItemsUsingPost: Form[] = (await formXApi.findBy(hcpUser.healthcarePartyId!, patient, true)) as Form[]\n\n assert(foundItems.length == 1, 'Found items should be 1')\n assert(foundItems[0].id == createdForm.id, 'Found item should be the created one')\n\n assert(foundItemsUsingPost.length == 1, 'Found items using post should be 1')\n assert(foundItemsUsingPost[0].id == createdForm.id, 'Found item using post should be the created one')\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 samplePatient = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio' })\n )\n const entity = await api1.formApi.createForm(await api1.formApi.newInstance(user1, samplePatient))\n await api2.formApi\n .getForm(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.formApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.formApi.getForm(entity.id!)\n expect((await api2.formApi.decryptPatientIdOf(retrieved))[0]).to.equal(samplePatient.id)\n })\n\n it('Tests for Form Templates', async () => {\n // Given\n const { formApi, userApi } = await initApi(env, hcp1Username)\n const guid = randomUUID()\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n const user = await userApi.getCurrentUser()\n\n const formTemplateToCreate = new FormTemplate({\n id: randomUUID(),\n guid: guid,\n author: user.id,\n name: 'My Test Template',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Description of the template',\n })\n\n // Create\n const createdTemplate = await formApi.createFormTemplate(formTemplateToCreate)\n expect(createdTemplate.id).to.not.be.undefined\n expect(createdTemplate.guid).to.equal(guid)\n expect(createdTemplate.name).to.equal('My Test Template')\n\n // Get\n const retrievedTemplate = await formApi.getFormTemplate(createdTemplate.id!)\n expect(retrievedTemplate.id).to.equal(createdTemplate.id)\n\n // Find all\n const allTemplates = await formApi.findFormTemplates()\n expect(allTemplates.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Find by specialty\n const templatesBySpecialty = await formApi.findFormTemplatesBySpeciality(specialtyCode)\n expect(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplate.id)\n expect(templatesBySpecialty.length).to.be.greaterThan(0)\n\n // Get by GUID (using getFormTemplatesByGuid)\n const templatesByGuid = await formApi.getFormTemplatesByGuid(guid, specialtyCode)\n expect(templatesByGuid.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Update\n createdTemplate.name = 'Updated Name'\n const updatedTemplate = await formApi.updateFormTemplate(createdTemplate.id!, createdTemplate)\n expect(updatedTemplate.name).to.equal('Updated Name')\n\n // Delete\n await formApi.deleteFormTemplate(createdTemplate.id!)\n try {\n await formApi.getFormTemplate(createdTemplate.id!)\n assert.fail('Should have thrown an error')\n } catch (e) {\n // Expected\n }\n })\n\n describeNoLite('Form Templates in Group Tests', () => {\n it('should create, find, update and delete form templates in a group', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const guid = randomUUID()\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Use the existing test group ID\n const groupId = env.testGroupId\n\n const formTemplateToCreate = new FormTemplate({\n id: randomUUID(),\n guid: guid,\n author: currentUser.id,\n name: 'My Group Template',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Description of the group template',\n })\n\n // Create In Group\n const createdTemplate = await formApi.createFormTemplateInGroup(groupId, formTemplateToCreate)\n expect(createdTemplate.id).to.not.be.undefined\n expect(createdTemplate.guid).to.equal(guid)\n if (createdTemplate.group) {\n expect(createdTemplate.group.guid).to.equal(groupId)\n }\n\n // Get In Group\n const templatesInGroup = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n expect(templatesInGroup.map((t) => t.id)).to.include(createdTemplate.id)\n\n // Update In Group\n createdTemplate.name = 'Updated Group Name'\n const updatedTemplate = await formApi.updateFormTemplateInGroup(groupId, createdTemplate.id!, createdTemplate)\n expect(updatedTemplate.name).to.equal('Updated Group Name')\n\n // Delete In Group\n await formApi.deleteFormTemplateInGroup(groupId, updatedTemplate.id!, updatedTemplate.rev!)\n\n // Verify deletion\n const templatesInGroupAfterDelete = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n expect(templatesInGroupAfterDelete.map((t) => t.id)).to.not.include(createdTemplate.id)\n })\n\n it('should find form templates by specialty in a group', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n const otherSpecialtyCode = 'SPECIALTY-' + randomUUID()\n\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Specialty Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Specialty Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Other Specialty Template',\n specialty: new CodeStub({ code: otherSpecialtyCode, type: 'specialty', version: '1' }),\n }),\n ]\n\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(3)\n\n // When: find by specialty\n const templatesBySpecialty = await formApi.getFormTemplatesBySpecialtyInGroup(groupId, specialtyCode)\n\n // Then: should return only the 2 templates with the matching specialty\n expect(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplates[0].id)\n expect(templatesBySpecialty.map((t) => t.id)).to.include(createdTemplates[1].id)\n expect(templatesBySpecialty.map((t) => t.id)).to.not.include(createdTemplates[2].id)\n\n // When: find by other specialty\n const otherTemplates = await formApi.getFormTemplatesBySpecialtyInGroup(groupId, otherSpecialtyCode)\n\n // Then: should return only the 1 template with the other specialty\n expect(otherTemplates.map((t) => t.id)).to.include(createdTemplates[2].id)\n expect(otherTemplates.map((t) => t.id)).to.not.include(createdTemplates[0].id)\n\n // When: find by non-existent specialty\n const emptyResult = await formApi.getFormTemplatesBySpecialtyInGroup(groupId, 'NONEXISTENT-' + randomUUID())\n\n // Then: should return empty\n expect(emptyResult).to.have.lengthOf(0)\n\n // Cleanup\n const idsAndRevs = createdTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n await formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs)\n })\n })\n\n describeNoLite('Form Templates Batch Operations in Group Tests', () => {\n it('should create, get, and modify multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create multiple templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'First batch template',\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Second batch template',\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Batch Template 3',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n descr: 'Third batch template',\n }),\n ]\n\n // Create batch\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(3)\n expect(createdTemplates[0].name).to.equal('Batch Template 1')\n expect(createdTemplates[1].name).to.equal('Batch Template 2')\n expect(createdTemplates[2].name).to.equal('Batch Template 3')\n createdTemplates.forEach((template) => {\n expect(template.id).to.not.be.undefined\n expect(template.rev).to.not.be.undefined\n })\n\n // Get batch by IDs\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(\n groupId,\n createdTemplates.map((t) => t.id!)\n )\n expect(retrievedTemplates).to.have.lengthOf(3)\n expect(retrievedTemplates.map((t) => t.id)).to.have.members(createdTemplates.map((t) => t.id))\n\n // Modify batch\n const templatesForUpdate = createdTemplates.map((t, index) => ({\n ...t,\n name: `Updated Batch Template ${index + 1}`,\n }))\n const updatedTemplates = await formApi.modifyFormTemplatesInGroup(groupId, templatesForUpdate)\n expect(updatedTemplates).to.have.lengthOf(3)\n expect(updatedTemplates[0].name).to.equal('Updated Batch Template 1')\n expect(updatedTemplates[1].name).to.equal('Updated Batch Template 2')\n expect(updatedTemplates[2].name).to.equal('Updated Batch Template 3')\n\n // Clean up - delete batch\n const idsAndRevs = updatedTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs)\n expect(deleteResults).to.have.lengthOf(3)\n deleteResults.forEach((result) => {\n expect(result.id).to.not.be.undefined\n expect(result.rev).to.not.be.undefined\n })\n })\n\n it('should delete and undelete multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Delete Test Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Delete Test Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n ]\n\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(2)\n\n // Delete batch\n const idsAndRevs = createdTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, idsAndRevs)\n expect(deleteResults).to.have.lengthOf(2)\n\n // Verify deletion - templates should not be in active list\n const allTemplates = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n const activeIds = allTemplates.map((t) => t.id)\n createdTemplates.forEach((t) => {\n expect(activeIds).to.not.include(t.id)\n })\n\n // Undelete batch - use the updated revisions from delete results\n const undeleteIdsAndRevs = deleteResults.map((result) => new IdWithRev({ id: result.id!, rev: result.rev! }))\n const undeletedTemplates = await formApi.undeleteFormTemplatesInGroup(groupId, undeleteIdsAndRevs)\n expect(undeletedTemplates).to.have.lengthOf(2)\n undeletedTemplates.forEach((template) => {\n expect(template.id).to.not.be.undefined\n expect(template.rev).to.not.be.undefined\n expect(template.deletionDate).to.be.undefined\n })\n\n // Verify undelete - templates should be back in active list\n const templatesAfterUndelete = await formApi.getFormTemplatesByUserInGroup(groupId, currentUser.id!)\n const activeIdsAfterUndelete = templatesAfterUndelete.map((t) => t.id)\n undeletedTemplates.forEach((t) => {\n expect(activeIdsAfterUndelete).to.include(t.id)\n })\n\n // Final cleanup - delete again\n const finalIdsAndRevs = undeletedTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n await formApi.deleteFormTemplatesInGroup(groupId, finalIdsAndRevs)\n })\n\n it('should purge multiple form templates in a group (batch)', async () => {\n // Given\n const { formApi, userApi } = await initApi(env)\n const currentUser = await userApi.getCurrentUser()\n const groupId = env.testGroupId\n const specialtyCode = 'SPECIALTY-' + randomUUID()\n\n // Create templates\n const templatesToCreate = [\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Purge Test Template 1',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n new FormTemplate({\n id: randomUUID(),\n guid: randomUUID(),\n author: currentUser.id,\n name: 'Purge Test Template 2',\n specialty: new CodeStub({ code: specialtyCode, type: 'specialty', version: '1' }),\n }),\n ]\n\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, templatesToCreate)\n expect(createdTemplates).to.have.lengthOf(2)\n\n // First delete them (purge requires deletion first)\n const deleteIdsAndRevs = createdTemplates.map((t) => new IdWithRev({ id: t.id!, rev: t.rev! }))\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, deleteIdsAndRevs)\n expect(deleteResults).to.have.lengthOf(2)\n\n // Purge batch\n const purgeIdsAndRevs = deleteResults.map((result) => new IdWithRev({ id: result.id!, rev: result.rev! }))\n const purgeResults = await formApi.purgeFormTemplatesInGroup(groupId, purgeIdsAndRevs)\n expect(purgeResults).to.have.lengthOf(2)\n purgeResults.forEach((result) => {\n expect(result.id).to.not.be.undefined\n })\n\n // Verify purge - trying to get the templates should fail or return empty\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(\n groupId,\n createdTemplates.map((t) => t.id!)\n )\n expect(retrievedTemplates).to.have.lengthOf(0)\n })\n\n it('should handle empty batch operations gracefully', async () => {\n // Given\n const { formApi } = await initApi(env)\n const groupId = env.testGroupId\n\n // Test with empty arrays\n const createdTemplates = await formApi.createFormTemplatesInGroup(groupId, [])\n expect(createdTemplates).to.have.lengthOf(0)\n\n const modifiedTemplates = await formApi.modifyFormTemplatesInGroup(groupId, [])\n expect(modifiedTemplates).to.have.lengthOf(0)\n\n const retrievedTemplates = await formApi.getFormTemplatesInGroup(groupId, [])\n expect(retrievedTemplates).to.have.lengthOf(0)\n\n const deleteResults = await formApi.deleteFormTemplatesInGroup(groupId, [])\n expect(deleteResults).to.have.lengthOf(0)\n\n const undeleteResults = await formApi.undeleteFormTemplatesInGroup(groupId, [])\n expect(undeleteResults).to.have.lengthOf(0)\n\n const purgeResults = await formApi.purgeFormTemplatesInGroup(groupId, [])\n expect(purgeResults).to.have.lengthOf(0)\n })\n })\n})\n"]}
@@ -45,7 +45,7 @@ describe('icc-x-user-api Tests', () => {
45
45
  }));
46
46
  it('Can get an user by its phoneNumber', () => __awaiter(void 0, void 0, void 0, function* () {
47
47
  const primitives = new icc_x_api_1.WebCryptoPrimitives(crypto_1.webcrypto);
48
- const phoneNumber = `+${primitives.randomUuid()}`;
48
+ const phoneNumber = `+32${Math.floor(Math.random() * 900000000) + 100000000}`;
49
49
  const api = yield initMasterApi(env);
50
50
  const createdUser = yield api.userApi.createUser(new User_1.User({
51
51
  id: (0, uuid_1.v4)(),
@@ -1 +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, 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, WebCryptoPrimitives, 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 WebCryptoPrimitives(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 = await 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"]}
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, 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, WebCryptoPrimitives, 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 WebCryptoPrimitives(webcrypto as any)\n const phoneNumber = `+32${Math.floor(Math.random() * 900000000) + 100000000}`\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 = await 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"]}
@@ -27,7 +27,7 @@ function createMessage(api, user, props) {
27
27
  toAddresses: [api.cryptoApi.primitives.randomUuid(), (_b = props.includeToAddress) !== null && _b !== void 0 ? _b : api.cryptoApi.primitives.randomUuid()],
28
28
  received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,
29
29
  };
30
- return yield api.messageApi.createMessage(yield api.messageApi.newInstance(user, messageBase));
30
+ return yield api.messageApi.createMessageWithUser(undefined, yield api.messageApi.newInstance(user, messageBase));
31
31
  });
32
32
  }
33
33
  function createTestMessages(api, user, propsForAccessibleMessages, propsForInaccessibleMessages) {
@@ -94,25 +94,25 @@ describe('CSM-243', function () {
94
94
  it('A user should be able to retrieve paginated messages without received date by fromAddress', function () {
95
95
  return __awaiter(this, void 0, void 0, function* () {
96
96
  const targetAddress = (0, crypto_1.randomUUID)();
97
- yield doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit));
97
+ yield doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit));
98
98
  });
99
99
  });
100
100
  it('A user should be able to retrieve paginated messages with received date by fromAddress', function () {
101
101
  return __awaiter(this, void 0, void 0, function* () {
102
102
  const targetAddress = (0, crypto_1.randomUUID)();
103
- yield doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit));
103
+ yield doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit));
104
104
  });
105
105
  });
106
106
  it('A user should be able to retrieve paginated messages without received date by toAddress', function () {
107
107
  return __awaiter(this, void 0, void 0, function* () {
108
108
  const targetAddress = (0, crypto_1.randomUUID)();
109
- yield doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit));
109
+ yield doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit));
110
110
  });
111
111
  });
112
112
  it('A user should be able to retrieve paginated messages with received date by toAddress', function () {
113
113
  return __awaiter(this, void 0, void 0, function* () {
114
114
  const targetAddress = (0, crypto_1.randomUUID)();
115
- yield doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit));
115
+ yield doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit));
116
116
  });
117
117
  });
118
118
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CSM-243.js","sourceRoot":"","sources":["../../../test/support/CSM-243.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { IccMessageXApi, IcureApi } from '../../icc-x-api'\nimport { randomUUID } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { User } from '../../icc-api/model/User'\nimport { Message } from '../../icc-api/model/Message'\nimport { PaginatedListMessage } from '../../icc-api/model/PaginatedListMessage'\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\nasync function createMessage(\n api: IcureApi,\n user: User,\n props: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message> {\n const messageBase: Message = {\n subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,\n fromAddress: props.includeFromAddress ?? api.cryptoApi.primitives.randomUuid(),\n toAddresses: [api.cryptoApi.primitives.randomUuid(), props.includeToAddress ?? api.cryptoApi.primitives.randomUuid()],\n received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,\n }\n return await api.messageApi.createMessage(await api.messageApi.newInstance(user, messageBase))\n}\n\nasync function createTestMessages(\n api: IcureApi,\n user: User,\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n },\n propsForInaccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message[]> {\n const expectedMessages: Message[] = []\n for (let i = 0; i < 100; i++) {\n expectedMessages.push(await createMessage(api, user, propsForAccessibleMessages))\n await createMessage(api, user, propsForInaccessibleMessages)\n }\n // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.\n const { api: otherApi, user: otherUser } = await createNewHcpApi(env)\n for (let i = 0; i < 100; i++) {\n await createMessage(otherApi, otherUser, propsForAccessibleMessages)\n }\n return expectedMessages\n}\n\nasync function getAllPaginatedMessages(listFunction: (nextKey?: string, nextKeyDocId?: string) => Promise<PaginatedListMessage>): Promise<Message[]> {\n let latestRetrieved: PaginatedListMessage | undefined\n let allResults: Message[] = []\n do {\n const nextKey = latestRetrieved?.nextKeyPair?.startKey\n latestRetrieved = await listFunction(nextKey ? JSON.stringify(nextKey) : undefined, latestRetrieved?.nextKeyPair?.startKeyDocId)\n allResults.push(...latestRetrieved.rows!)\n } while (latestRetrieved?.nextKeyPair?.startKey !== undefined)\n console.log(JSON.stringify(allResults.map((m) => m.received)))\n return allResults\n}\n\ndescribe('CSM-243', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function doTestWithoutReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessages: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: false },\n { includeRandomReceived: false }\n )\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessages.length)\n expect(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id))\n }\n\n async function doTestWithReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessagesWithReceived: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: true },\n { includeRandomReceived: true }\n )\n const messageWithoutReceived = await createMessage(api, user, { ...propsForAccessibleMessages, includeRandomReceived: false })\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessagesWithReceived.length + 1)\n expect(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id!])\n expect(allResults.map((m) => m.received)).to.deep.equal([\n undefined,\n ...expectedMessagesWithReceived.sort((a, b) => b.received! - a.received!).map((m) => m.received),\n ])\n }\n it('A user should be able to retrieve paginated messages without received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages without received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n})\n"]}
1
+ {"version":3,"file":"CSM-243.js","sourceRoot":"","sources":["../../../test/support/CSM-243.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { IccMessageXApi, IcureApi } from '../../icc-x-api'\nimport { randomUUID } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { User } from '../../icc-api/model/User'\nimport { Message } from '../../icc-api/model/Message'\nimport { PaginatedListMessage } from '../../icc-api/model/PaginatedListMessage'\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\nasync function createMessage(\n api: IcureApi,\n user: User,\n props: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message> {\n const messageBase: Message = {\n subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,\n fromAddress: props.includeFromAddress ?? api.cryptoApi.primitives.randomUuid(),\n toAddresses: [api.cryptoApi.primitives.randomUuid(), props.includeToAddress ?? api.cryptoApi.primitives.randomUuid()],\n received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,\n }\n return await api.messageApi.createMessageWithUser(undefined, await api.messageApi.newInstance(user, messageBase))\n}\n\nasync function createTestMessages(\n api: IcureApi,\n user: User,\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n },\n propsForInaccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message[]> {\n const expectedMessages: Message[] = []\n for (let i = 0; i < 100; i++) {\n expectedMessages.push(await createMessage(api, user, propsForAccessibleMessages))\n await createMessage(api, user, propsForInaccessibleMessages)\n }\n // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.\n const { api: otherApi, user: otherUser } = await createNewHcpApi(env)\n for (let i = 0; i < 100; i++) {\n await createMessage(otherApi, otherUser, propsForAccessibleMessages)\n }\n return expectedMessages\n}\n\nasync function getAllPaginatedMessages(listFunction: (nextKey?: string, nextKeyDocId?: string) => Promise<PaginatedListMessage>): Promise<Message[]> {\n let latestRetrieved: PaginatedListMessage | undefined\n let allResults: Message[] = []\n do {\n const nextKey = latestRetrieved?.nextKeyPair?.startKey\n latestRetrieved = await listFunction(nextKey ? JSON.stringify(nextKey) : undefined, latestRetrieved?.nextKeyPair?.startKeyDocId)\n allResults.push(...latestRetrieved.rows!)\n } while (latestRetrieved?.nextKeyPair?.startKey !== undefined)\n console.log(JSON.stringify(allResults.map((m) => m.received)))\n return allResults\n}\n\ndescribe('CSM-243', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function doTestWithoutReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessages: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: false },\n { includeRandomReceived: false }\n )\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessages.length)\n expect(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id))\n }\n\n async function doTestWithReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessagesWithReceived: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: true },\n { includeRandomReceived: true }\n )\n const messageWithoutReceived = await createMessage(api, user, { ...propsForAccessibleMessages, includeRandomReceived: false })\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessagesWithReceived.length + 1)\n expect(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id!])\n expect(allResults.map((m) => m.received)).to.deep.equal([\n undefined,\n ...expectedMessagesWithReceived.sort((a, b) => b.received! - a.received!).map((m) => m.received),\n ])\n }\n it('A user should be able to retrieve paginated messages without received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages without received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddressWithUser(undefined, targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';