@icure/api 8.3.6 → 8.4.0
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.
- package/icc-api/api/IccClassificationApi.d.ts +1 -0
- package/icc-api/api/IccClassificationApi.js +12 -0
- package/icc-api/api/IccClassificationApi.js.map +1 -1
- package/icc-api/api/IccMessageApi.d.ts +0 -6
- package/icc-api/api/IccMessageApi.js +0 -15
- package/icc-api/api/IccMessageApi.js.map +1 -1
- package/icc-x-api/icc-bekmehr-x-api.js +2 -1
- package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.d.ts +51 -6
- package/icc-x-api/icc-document-x-api.js +231 -69
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.d.ts +45 -6
- package/icc-x-api/icc-message-x-api.js +202 -30
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.d.ts +9 -1
- package/icc-x-api/icc-patient-x-api.js +92 -100
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/index.d.ts +6 -0
- package/icc-x-api/index.js +3 -2
- package/icc-x-api/index.js.map +1 -1
- package/package.json +1 -1
- package/test/icc-api/api/IccDocumentApi.js +27 -35
- package/test/icc-api/api/IccDocumentApi.js.map +1 -1
- package/test/icc-x-api/auth/group-switch-test.js.map +1 -1
- package/test/icc-x-api/icc-document-x-api.js +28 -4
- package/test/icc-x-api/icc-document-x-api.js.map +1 -1
- package/test/icc-x-api/icc-message-x-api.js +19 -293
- package/test/icc-x-api/icc-message-x-api.js.map +1 -1
- package/test/utils/test_utils.d.ts +4 -2
- package/test/utils/test_utils.js +3 -2
- package/test/utils/test_utils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icc-patient-x-api.js","sourceRoot":"","sources":["../../icc-x-api/icc-patient-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccAuthApi, IccPatientApi } from '../icc-api'\nimport { IccCryptoXApi } from './icc-crypto-x-api'\nimport { IccContactXApi } from './icc-contact-x-api'\nimport { IccFormXApi } from './icc-form-x-api'\nimport { IccHcpartyXApi } from './icc-hcparty-x-api'\nimport { IccInvoiceXApi } from './icc-invoice-x-api'\nimport { IccDocumentXApi } from './icc-document-x-api'\nimport { IccHelementXApi } from './icc-helement-x-api'\nimport { IccClassificationXApi } from './icc-classification-x-api'\n\nimport * as _ from 'lodash'\nimport * as models from '../icc-api/model/models'\nimport { Document, IcureStub, ListOfIds, MaintenanceTask, Patient } from '../icc-api/model/models'\nimport { IccCalendarItemXApi } from './icc-calendar-item-x-api'\nimport { b64_2ab } from '../icc-api/model/ModelHelper'\nimport { findName, garnishPersonWithName, hasName } from './utils/person-util'\nimport { EncryptedFieldsManifest, parseEncryptedFields, retry, subscribeToEntityEvents, SubscriptionOptions } from './utils'\nimport { IccDataOwnerXApi } from './icc-data-owner-x-api'\nimport { AuthenticationProvider, NoAuthenticationProvider } from './auth/AuthenticationProvider'\nimport { EntityWithDelegationTypeName } from './utils/EntityWithDelegationTypeName'\nimport { SecureDelegation } from '../icc-api/model/SecureDelegation'\nimport { MinimalEntityBulkShareResult } from '../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { EntityShareRequest } from '../icc-api/model/requests/EntityShareRequest'\nimport { ShareMetadataBehaviour } from './crypto/ShareMetadataBehaviour'\nimport { ShareResult } from './utils/ShareResult'\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport { XHR } from '../icc-api/api/XHR'\nimport { EncryptedEntityXApi } from './basexapi/EncryptedEntityXApi'\nimport { IccUserXApi } from './icc-user-x-api'\nimport { AbstractFilter } from './filters/filters'\nimport { Connection, ConnectionImpl } from '../icc-api/model/Connection'\nimport { BulkShareOrUpdateMetadataParams } from '../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\n\n// noinspection JSUnusedGlobalSymbols\nexport class IccPatientXApi extends IccPatientApi implements EncryptedEntityXApi<models.Patient> {\n private readonly encryptedFields: EncryptedFieldsManifest\n\n get headers(): Promise<Array<XHR.Header>> {\n return super.headers.then((h) => this.crypto.accessControlKeysHeaders.addAccessControlKeysHeaders(h, EntityWithDelegationTypeName.Patient))\n }\n\n constructor(\n host: string,\n headers: { [key: string]: string },\n private readonly crypto: IccCryptoXApi,\n private readonly contactApi: IccContactXApi,\n private readonly formApi: IccFormXApi,\n private readonly helementApi: IccHelementXApi,\n private readonly invoiceApi: IccInvoiceXApi,\n private readonly documentApi: IccDocumentXApi,\n private readonly hcpartyApi: IccHcpartyXApi,\n private readonly classificationApi: IccClassificationXApi,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly calendarItemApi: IccCalendarItemXApi,\n private readonly userApi: IccUserXApi,\n private readonly authApi: IccAuthApi,\n private readonly autofillAuthor: boolean,\n encryptedKeys: Array<string> = ['note'],\n authenticationProvider: AuthenticationProvider = new NoAuthenticationProvider(),\n fetchImpl: (input: RequestInfo, init?: RequestInit) => Promise<Response> = typeof window !== 'undefined'\n ? window.fetch\n : typeof self !== 'undefined'\n ? self.fetch\n : fetch\n ) {\n super(host, headers, authenticationProvider, fetchImpl)\n\n this.encryptedFields = parseEncryptedFields(encryptedKeys, 'Patient.')\n }\n\n /**\n * Creates a new instance of patient with initialised encryption metadata (not in the database).\n * @param user the current user.\n * @param p initialised data for the patient. Metadata such as id, creation data, etc. will be automatically initialised, but you can specify\n * other kinds of data or overwrite generated metadata with this. You can't specify encryption metadata.\n * @param options optional parameters:\n * - additionalDelegates: delegates which will have access to the entity in addition to the current data owner and delegates from the\n * auto-delegations. Must be an object which associates each data owner id with the access level to give to that data owner. May overlap with\n * auto-delegations, in such case the access level specified here will be used.\n * - ignoreAutoDelegations: if true the data won't be shared with the autodelegations of the user, but only with additional delegates\n * - alternateRootDelegation: by default a new entity is created with a root delegation from self to self. In keyless mode this is not possible,\n * and instead the root delegation will be from self to another. You have to specify which delegate will be part of the root delegation.\n * @return a new instance of patient.\n */\n async newInstance(\n user: models.User,\n p: any = {},\n options: {\n additionalDelegates?: { [dataOwnerId: string]: AccessLevelEnum }\n ignoreAutoDelegations?: boolean\n alternateRootDelegation?: string\n } = {}\n ) {\n const patient = {\n ...(p ?? {}),\n _type: 'org.taktik.icure.entities.Patient',\n id: p?.id ?? this.crypto.primitives.randomUuid(),\n created: p?.created ?? new Date().getTime(),\n modified: p?.modified ?? new Date().getTime(),\n responsible: p?.responsible ?? (this.autofillAuthor ? this.dataOwnerApi.getDataOwnerIdOf(user) : undefined),\n author: p?.author ?? (this.autofillAuthor ? user.id : undefined),\n codes: p?.codes ?? [],\n tags: p?.tags ?? [],\n }\n\n const ownerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n if (ownerId !== (await this.dataOwnerApi.getCurrentDataOwnerId())) throw new Error('Can only initialise entities as current data owner.')\n const extraDelegations = {\n ...(options.ignoreAutoDelegations == true\n ? {}\n : Object.fromEntries(\n [...(user.autoDelegations?.all ?? []), ...(user.autoDelegations?.medicalInformation ?? [])].map((d) => [d, AccessLevelEnum.WRITE])\n )),\n ...(options?.additionalDelegates ?? {}),\n }\n const initialisationInfo = await this.crypto.xapi.entityWithInitialisedEncryptedMetadata(\n patient,\n EntityWithDelegationTypeName.Patient,\n undefined,\n undefined,\n true,\n extraDelegations,\n options.alternateRootDelegation\n )\n return new models.Patient(initialisationInfo.updatedEntity)\n }\n\n completeNames(patient: models.Patient): models.Patient {\n let finalPatient: any = patient\n\n if (!!finalPatient.lastName && !hasName(finalPatient, models.PersonName.UseEnum.Official)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Official, finalPatient.lastName, finalPatient.firstName)\n }\n\n if (!!finalPatient.maidenName && !hasName(finalPatient, models.PersonName.UseEnum.Maiden)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Maiden, finalPatient.maidenName, finalPatient.firstName)\n }\n\n if (!!finalPatient.alias && !hasName(finalPatient, models.PersonName.UseEnum.Nickname)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Nickname, finalPatient.alias, finalPatient.firstName)\n }\n\n if (!finalPatient.lastName && !!hasName(finalPatient, models.PersonName.UseEnum.Official)) {\n const officialName = findName(finalPatient, models.PersonName.UseEnum.Official)\n finalPatient = {\n ...finalPatient,\n lastName: officialName!.lastName,\n firstName: officialName!.firstNames?.[0],\n }\n }\n\n if (!finalPatient.maidenName && !!hasName(finalPatient, models.PersonName.UseEnum.Maiden)) {\n finalPatient = {\n ...finalPatient,\n maidenName: findName(finalPatient, models.PersonName.UseEnum.Maiden)!.lastName,\n }\n }\n\n if (!finalPatient.alias && !!hasName(finalPatient, models.PersonName.UseEnum.Nickname)) {\n finalPatient = {\n ...finalPatient,\n alias: findName(finalPatient, models.PersonName.UseEnum.Nickname)!.lastName,\n }\n }\n\n return new Patient(finalPatient)\n }\n\n /**\n * @deprecated replace with {@link initConfidentialSecretId}\n */\n async initConfidentialDelegation(patient: models.Patient, user: models.User): Promise<models.Patient> {\n return this.initConfidentialSecretId(patient, user)\n }\n\n /**\n * Ensures that the current data owner has some confidential secret ids for the provided patient. If not creates them and updates the patient in the\n * database.\n * @param patient the patient for which you want to initialise the confidential secret id.\n * @param user the current user.\n * @return the updated patient or the original patient if no change was necessary.\n */\n async initConfidentialSecretId(patient: models.Patient, user: models.User): Promise<models.Patient> {\n const dataOwnerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n if (dataOwnerId !== (await this.dataOwnerApi.getCurrentDataOwnerId()))\n throw new Error('You can initialise confidential delegations only for the current data owner')\n let updatedPatient = patient\n if (!patient.rev) {\n updatedPatient = await this.createPatientWithUser(user, patient)\n if (!updatedPatient) throw new Error('Could not create patient')\n }\n const initialised = await this.crypto.xapi.initialiseConfidentialSecretId(updatedPatient, EntityWithDelegationTypeName.Patient, (x) =>\n this.bulkSharePatients(x)\n )\n if (initialised) {\n return initialised\n } else {\n return updatedPatient\n }\n }\n\n createPatient(body?: models.Patient): never {\n throw new Error('Cannot call a method that returns patients without providing a user for de/encryption')\n }\n\n createPatientWithUser(user: models.User, body?: models.Patient): Promise<models.Patient | any> {\n return body\n ? this.encrypt(user, [_.cloneDeep(this.completeNames(body))])\n .then((pats) => super.createPatient(pats[0]))\n .then(async (patient: Patient) => {\n /**\n * This code is a workaround for the fact that the backend is adding empty delegations to the patient when it is created.\n */\n\n const patientDelegations = patient.delegations\n\n if (patientDelegations != undefined && Object.keys(patientDelegations).length > 0) {\n const areDelegationsEmpty = Object.values(patientDelegations).every((delegation) => delegation.length === 0)\n\n if (areDelegationsEmpty) {\n return await this.modifyPatientRaw(\n new Patient({\n ...patient,\n delegations: {},\n })\n )\n }\n }\n return patient\n })\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n : Promise.resolve(null)\n }\n\n filterBy(\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n skip?: number,\n sort?: string,\n desc?: boolean,\n body?: models.FilterChainPatient\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n filterByWithUser(\n user: models.User,\n filterChain: models.FilterChainPatient,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n skip?: number,\n sort?: string,\n desc?: boolean\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .filterPatientsBy(startKey, startDocumentId, limit, skip, sort, desc, filterChain)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n findByAccessLogUserAfterDate(\n userId: string,\n accessType?: string,\n startDate?: number,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByAccessLogUserAfterDateWithUser(\n user: models.User,\n userId: string,\n accessType?: string,\n startDate?: number,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .findByAccessLogUserAfterDate(userId, accessType, startDate, startKey, startDocumentId, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n findByAccessLogUserAfterDate_1(externalId: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByExternalIdWithUser(user: models.User, externalId: string): Promise<models.Patient | any> {\n return super\n .findByExternalId(externalId)\n .then((pats) => this.decrypt(user, [pats]))\n .then((x) => x[0])\n }\n\n findByNameBirthSsinAuto(\n healthcarePartyId?: string,\n filterValue?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByNameBirthSsinAutoWithUser(\n user: models.User,\n healthcarePartyId?: string,\n filterValue?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .findByNameBirthSsinAuto(healthcarePartyId, filterValue, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n fuzzySearch(firstName?: string, lastName?: string, dateOfBirth?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n fuzzySearchWithUser(user: models.User, firstName?: string, lastName?: string, dateOfBirth?: number): Promise<Array<models.Patient> | any> {\n return super.fuzzySearch(firstName, lastName, dateOfBirth).then((pats) => this.decrypt(user, pats))\n }\n\n getPatient(patientId: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n getPatientRaw(patientId: string): Promise<models.Patient | any> {\n return super.getPatient(patientId)\n }\n\n getPatientWithUser(user: models.User, patientId: string): Promise<models.Patient | any> {\n return super\n .getPatient(patientId)\n .then((p) => this.tryDecryptOrReturnOriginal([p]))\n .then((pats) => pats[0].entity)\n }\n\n getPotentiallyEncryptedPatientWithUser(user: models.User, patientId: string): Promise<{ patient: models.Patient; decrypted: boolean }> {\n return super\n .getPatient(patientId)\n .then((p) => this.tryDecryptOrReturnOriginal([p]))\n .then((pats) => ({ patient: pats[0].entity, decrypted: pats[0].decrypted }))\n }\n\n getPatients(body?: models.ListOfIds): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n getPatientsWithUser(user: models.User, body?: models.ListOfIds): Promise<Array<models.Patient> | any> {\n return super.getPatients(body).then((pats) => this.decrypt(user, pats))\n }\n\n listDeletedPatients(startDate?: number, endDate?: number, desc?: boolean, startKey?: string, startDocumentId?: string, limit?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listDeletedPatientsWithUser(\n user: models.User,\n startDate?: number,\n endDate?: number,\n desc?: boolean,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listDeletedPatients(startDate, endDate, desc, startDocumentId, startKey, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listDeletedPatients_2(firstName?: string, lastName?: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listDeletedPatientsByNameWithUser(user: models.User, firstName?: string, lastName?: string): Promise<Array<models.Patient> | any> {\n return super.listDeletedPatientsByName(firstName, lastName).then((rows) => this.decrypt(user, rows, false))\n }\n\n listOfMergesAfter(date: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listOfMergesAfterWithUser(user: models.User, date: number): Promise<Array<models.Patient> | any> {\n return super.listOfMergesAfter(date).then((pats) => this.decrypt(user, pats, false))\n }\n\n listOfPatientsModifiedAfter(date: number, startKey?: number, startDocumentId?: string, limit?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listOfPatientsModifiedAfterWithUser(\n user: models.User,\n date: number,\n startKey?: number,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listOfPatientsModifiedAfter(date, startKey, startDocumentId, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatients(hcPartyId?: string, sortField?: string, startKey?: string, startDocumentId?: string, limit?: number, sortDirection?: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsWithUser(\n user: models.User,\n hcPartyId?: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatients(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatientsByHcParty(\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsByHcPartyWithUser(\n user: models.User,\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatientsByHcParty(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatientsOfHcParty(\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsOfHcPartyWithUser(\n user: models.User,\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatientsOfHcParty(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n mergeInto(toId: string, fromIds: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n mergeIntoWithUser(user: models.User, toId: string, fromIds: string): Promise<models.Patient | any> {\n return super\n .mergeInto(toId, fromIds)\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n }\n\n modifyPatient(body?: models.Patient): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n /**\n * @internal this method is for internal use only and may be changed without notice.\n */\n modifyPatientRaw(body?: models.Patient): Promise<models.Patient | any> {\n return super.modifyPatient(body)\n }\n\n modifyPatientWithUser(user: models.User, body?: models.Patient): Promise<models.Patient | null> {\n return body ? this.modifyPatientAs(this.dataOwnerApi.getDataOwnerIdOf(user), body) : Promise.resolve(null)\n }\n\n private modifyPatientAs(dataOwner: string, body: models.Patient): Promise<models.Patient> {\n return this.encryptAs(dataOwner, [_.cloneDeep(this.completeNames(body))])\n .then((pats) => super.modifyPatient(pats[0]))\n .then((p) => this.decryptAs(dataOwner, [p]))\n .then((pats) => pats[0])\n }\n\n modifyPatientReferral(patientId: string, referralId: string, start?: number, end?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n modifyPatientReferralWithUser(\n user: models.User,\n patientId: string,\n referralId: string,\n start?: number,\n end?: number\n ): Promise<models.Patient | any> {\n return super\n .modifyPatientReferral(patientId, referralId, start, end)\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n }\n\n encrypt(user: models.User, pats: Array<models.Patient>): Promise<Array<models.Patient>> {\n const dataOwnerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n return this.encryptAs(dataOwnerId, pats)\n }\n\n private encryptAs(dataOwner: string, pats: Array<models.Patient>): Promise<Array<models.Patient>> {\n return this.crypto.xapi.tryEncryptEntities(\n pats,\n EntityWithDelegationTypeName.Patient,\n this.encryptedFields,\n true,\n false,\n (x) => new models.Patient(x)\n )\n }\n\n // If patient can't be decrypted returns patient with encrypted data.\n decrypt(user: models.User, patients: Array<models.Patient>, fillDelegations = true): Promise<Array<models.Patient>> {\n return this.decryptAs(this.dataOwnerApi.getDataOwnerIdOf(user), patients, fillDelegations)\n }\n\n private decryptAs(dataOwner: string, patients: Array<models.Patient>, fillDelegations = true): Promise<Array<models.Patient>> {\n return this.tryDecryptOrReturnOriginal(patients).then((ps) => ps.map((p) => p.entity))\n }\n\n async tryDecryptOrReturnOriginal(patients: Array<models.Patient>): Promise<{ entity: models.Patient; decrypted: boolean }[]> {\n return (await this.crypto.xapi.tryDecryptEntities(patients, EntityWithDelegationTypeName.Patient, (x) => new models.Patient(x))).map((p) => {\n if (p.entity.picture && !(p.entity.picture instanceof ArrayBuffer)) {\n return {\n entity: new models.Patient({\n ...p.entity,\n picture: b64_2ab(p.entity.picture),\n }),\n decrypted: p.decrypted,\n }\n } else return p\n })\n }\n\n /**\n * @deprecated replace with {@link shareAllDataOfPatient}\n */\n async share(\n user: models.User,\n patId: string,\n ownerId: string,\n delegateIds: Array<string>,\n delegationTags: { [key: string]: Array<string> },\n usingPost: boolean = false\n ): Promise<{\n patient: models.Patient | null\n statuses: { [key: string]: { success: boolean | null; error: Error | null } }\n } | null> {\n return this.shareAllDataOfPatient(user, patId, ownerId, delegateIds, delegationTags, usingPost)\n }\n\n async shareAllDataOfPatient(\n user: models.User,\n patId: string,\n ownerId: string,\n delegateIds: Array<string>,\n delegationTags: { [key: string]: Array<string> },\n usingPost: boolean = false\n ): Promise<{\n patient: models.Patient | null\n statuses: { [key: string]: { success: boolean | null; error: Error | null } }\n } | null> {\n const allTags: string[] = _.uniq(_.flatMap(Object.values(delegationTags)))\n const status = {\n contacts: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n forms: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n healthElements: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n invoices: {\n success: allTags.includes('financialInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n documents: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n classifications: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n calendarItems: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n patient: { success: false, error: null, modified: 0 } as {\n success: boolean\n error: Error | null\n },\n }\n const hcp = await this.hcpartyApi.getHealthcareParty(ownerId)\n const parentId = hcp.parentId\n let patient = await retry(() => this.getPatientWithUser(user, patId))\n const patientWithInitialisedEncryption = await this.crypto.xapi.ensureEncryptionKeysInitialised(patient, EntityWithDelegationTypeName.Patient)\n if (patientWithInitialisedEncryption) {\n patient = await this.modifyPatientWithUser(user, patientWithInitialisedEncryption)\n }\n\n if (!patient) {\n status.patient = {\n success: false,\n error: new Error('Patient does not exist or cannot initialise encryption keys'),\n }\n return { patient: patient, statuses: status }\n }\n\n const delSfks = await this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId)\n const ecKeys = await this.crypto.xapi.encryptionKeysOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId)\n\n if (delSfks.length) {\n const retrievedHealthElements = await retry(() =>\n (usingPost\n ? this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((hes) =>\n parentId\n ? (usingPost\n ? this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreHes) => _.uniqBy(hes.concat(moreHes), 'id'))\n : hes\n )\n )\n const retrievedForms = await retry(() =>\n (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((frms) =>\n parentId\n ? (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreFrms) => _.uniqBy(frms.concat(moreFrms), 'id'))\n : frms\n )\n )\n const retrievedContacts = await retry(() =>\n (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(ownerId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ctcs) =>\n parentId\n ? (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(parentId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreCtcs) => _.uniqBy(ctcs.concat(moreCtcs), 'id'))\n : ctcs\n )\n )\n const retrievedInvoices = await retry(() =>\n (usingPost\n ? this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ivs) =>\n parentId\n ? this.invoiceApi\n .findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreIvs) => _.uniqBy(ivs.concat(moreIvs), 'id'))\n : ivs\n )\n )\n const retrievedClassifications = await retry(() =>\n this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n .then((cls) =>\n parentId\n ? this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreCls) => _.uniqBy(cls.concat(moreCls), 'id'))\n : cls\n )\n )\n const retrievedCalendarItems = await retry(() =>\n (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(ownerId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((cls) =>\n parentId\n ? (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(parentId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreCls) => _.uniqBy(cls.concat(moreCls), 'id'))\n : cls\n )\n )\n const isMedicalInfoTags = (tags: string[]) => tags.includes('medicalInformation') || tags.includes('all')\n const isFinancialInfoTags = (tags: string[]) => tags.includes('financialInformation') || tags.includes('all')\n const doShareEntitiesAndUpdateStatus = async (\n entities: models.IcureStub[],\n entitiesType: EntityWithDelegationTypeName,\n status: {\n success: boolean | null\n error: null | Error\n modified: number\n },\n tagsCondition: (tags: string[]) => boolean,\n doShareMinimal: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<void> => {\n const delegatesToApply = delegateIds.filter((delegateId) => tagsCondition(delegationTags[delegateId]))\n if (entities.length && delegatesToApply.length) {\n const requests: {\n entity: IcureStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[] = []\n for (const entity of entities) {\n const currentEntityRequests: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n const secretIds = await this.crypto.xapi.secretIdsOf({ entity, type: entitiesType }, undefined)\n const encryptionKeys = await this.crypto.xapi.encryptionKeysOf({ entity, type: entitiesType }, undefined)\n const request = {\n shareSecretIds: secretIds,\n shareEncryptionKeys: encryptionKeys,\n shareOwningEntityIds: [patient.id!],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n }\n for (const delegateId of delegatesToApply) {\n currentEntityRequests[delegateId] = request\n }\n requests.push({ dataForDelegates: currentEntityRequests, entity })\n }\n await this.crypto.xapi\n .bulkShareOrUpdateEncryptedEntityMetadataNoEntities(entitiesType, requests, (x) => doShareMinimal(x))\n .then((shareResult) => {\n status.modified = new Set(shareResult.successfulUpdates.map((x) => x.entityId)).size\n status.success = shareResult.updateErrors.length === 0\n if (!status.success) {\n const errorMsg = `Error while sharing (some) entities of type ${entitiesType} for patient ${patient.id} : ${JSON.stringify(\n shareResult.updateErrors\n )}`\n console.error(errorMsg)\n status.error = new Error(errorMsg)\n }\n })\n .catch((e) => {\n status.success = false\n status.error = e\n })\n } else {\n status.success = true\n }\n }\n await doShareEntitiesAndUpdateStatus(\n retrievedHealthElements,\n EntityWithDelegationTypeName.HealthElement,\n status.healthElements,\n isMedicalInfoTags,\n (x) => this.helementApi.bulkShareHealthElementsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedContacts, EntityWithDelegationTypeName.Contact, status.contacts, isMedicalInfoTags, (x) =>\n this.contactApi.bulkShareContactsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedInvoices, EntityWithDelegationTypeName.Invoice, status.invoices, isFinancialInfoTags, (x) =>\n this.invoiceApi.bulkShareInvoicesMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(\n retrievedClassifications,\n EntityWithDelegationTypeName.Classification,\n status.classifications,\n isMedicalInfoTags,\n (x) => this.classificationApi.bulkShareClassificationsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(\n retrievedCalendarItems,\n EntityWithDelegationTypeName.CalendarItem,\n status.calendarItems,\n isMedicalInfoTags,\n (x) => this.calendarItemApi.bulkShareCalendarItemsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedForms, EntityWithDelegationTypeName.Form, status.forms, isMedicalInfoTags, (x) =>\n this.formApi.bulkShareFormsMinimal(x)\n )\n }\n const sharePatientDataRequest = {\n shareSecretIds: delSfks,\n shareEncryptionKeys: ecKeys,\n shareOwningEntityIds: [],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n }\n const sharePatientRequest = {\n entity: patient,\n dataForDelegates: Object.fromEntries(delegateIds.map((delegateId) => [delegateId, sharePatientDataRequest])),\n }\n return await this.crypto.xapi\n .bulkShareOrUpdateEncryptedEntityMetadata(EntityWithDelegationTypeName.Patient, [sharePatientRequest], (x) => this.bulkSharePatients(x))\n .then((shareResult) => {\n if (shareResult.updatedEntities.length && !shareResult.updateErrors.length) {\n status.patient.success = true\n return { patient: shareResult.updatedEntities[0], statuses: status }\n } else {\n const errorMsg = `Error while sharing patient with id ${patient.id} : ${JSON.stringify(shareResult.updateErrors)}`\n console.error(errorMsg)\n status.patient.error = new Error(errorMsg)\n status.patient.success = false\n return { patient: shareResult.updatedEntities[0] ?? patient, statuses: status }\n }\n })\n .catch((e) => {\n status.patient.error = e\n status.patient.success = false\n return { patient, statuses: status }\n })\n }\n\n export(user: models.User, patId: string, ownerId: string, usingPost: boolean = false): Promise<{ id: string }> {\n return this.hcpartyApi.getHealthcareParty(ownerId).then((hcp) => {\n const parentId = hcp.parentId\n\n return retry(() => this.getPatientWithUser(user, patId))\n .then(async (patient: models.Patient) => {\n const initialised = await this.crypto.xapi.ensureEncryptionKeysInitialised(patient, EntityWithDelegationTypeName.Patient)\n if (!initialised) {\n return patient\n } else {\n return await this.modifyPatientWithUser(user, initialised)\n }\n })\n .then(async (patient: models.Patient | null) => {\n if (!patient) {\n return Promise.resolve({ id: patId })\n }\n const delSfks = await this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId)\n return delSfks.length\n ? Promise.all([\n retry(() =>\n (usingPost\n ? this.helementApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n : this.helementApi.findByHCPartyPatientSecretFKeysArray(ownerId, delSfks)\n ).then((hes) =>\n parentId\n ? (usingPost\n ? this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreHes) => _.uniqBy(hes.concat(moreHes), 'id'))\n : hes\n )\n ) as Promise<Array<models.IcureStub>>,\n retry(() =>\n (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((frms) =>\n parentId\n ? (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreFrms) => _.uniqBy(frms.concat(moreFrms), 'id'))\n : frms\n )\n ) as Promise<Array<models.Form>>,\n retry(() =>\n (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(ownerId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ctcs) =>\n parentId\n ? (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(parentId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreCtcs) => _.uniqBy(ctcs.concat(moreCtcs), 'id'))\n : ctcs\n )\n ) as Promise<Array<models.Contact>>,\n retry(() =>\n (usingPost\n ? this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ivs) =>\n parentId\n ? this.invoiceApi\n .findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreIvs) => _.uniqBy(ivs.concat(moreIvs), 'id'))\n : ivs\n )\n ) as Promise<Array<models.IcureStub>>,\n retry(() =>\n this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n .then((cls) =>\n parentId\n ? this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreCls) => _.uniqBy(cls.concat(moreCls), 'id'))\n : cls\n )\n ) as Promise<Array<models.Classification>>,\n retry(async () => {\n const delegationSFKs = _.uniq(delSfks).join(',')\n try {\n let calendarItems = await (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(ownerId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(',')))\n\n if (parentId) {\n const moreCalendarItems = await (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(parentId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(',')))\n calendarItems = _.uniqBy(calendarItems.concat(moreCalendarItems), 'id')\n }\n\n return calendarItems\n } catch (ex) {\n console.log(`exception occured exporting calendarItem for ownerId: ${ownerId} - ${ex}`)\n //throw ex\n }\n }) as Promise<Array<models.CalendarItem>>,\n ]).then(([hes, frms, ctcs, ivs, cls, cis]) => {\n const docIds: { [key: string]: number } = {}\n ctcs.forEach(\n (c: models.Contact) =>\n c.services &&\n c.services.forEach((s) => s.content && Object.values(s.content).forEach((c) => c && c.documentId && (docIds[c.documentId] = 1)))\n )\n\n return retry(() => this.documentApi.getDocuments(new ListOfIds({ ids: Object.keys(docIds) }))).then((docs: Array<Document>) => {\n return {\n id: patId,\n patient: patient,\n contacts: ctcs,\n forms: frms,\n healthElements: hes,\n invoices: ivs,\n classifications: cls,\n calItems: cis,\n documents: docs,\n }\n })\n })\n : Promise.resolve({\n id: patId,\n patient: patient,\n contacts: [],\n forms: [],\n healthElements: [],\n invoices: [],\n classifications: [],\n calItems: [],\n documents: [],\n })\n })\n })\n }\n\n checkInami(inami: string): boolean {\n const num_inami = inami.replace(new RegExp('[^(0-9)]', 'g'), '')\n\n const checkDigit = num_inami.substring(6, 8)\n const numSansCheck = num_inami.substring(0, 6)\n let retour = false\n\n //modulo du niss\n const modINAMI = parseInt(numSansCheck) % 97\n\n //obtention du num de check 97 - le resultat du mod\n const checkDigit_2 = 97 - modINAMI\n\n if (parseInt(checkDigit) == checkDigit_2) {\n retour = true\n }\n return retour\n }\n\n isValidSsin(ssin: string) {\n ssin = ssin.replace(new RegExp('[^(0-9)]', 'g'), '')\n let isValidNiss = false\n\n const normalNumber =\n /^[0-9][0-9](([0][0-9])|([1][0-2]))(([0-2][0-9])|([3][0-1]))(([0-9]{2}[1-9])|([0-9][1-9][0-9])|([1-9][0-9]{2}))(([0-8][0-9])|([9][0-7]))$/.test(\n ssin\n )\n const bisNumber = /^[0-9][0-9](([2][0-9])|([3][0-2]))(([0-2][0-9])|([3][0-1]))[0-9]{3}(([0-8][0-9])|([9][0-7]))$/.test(ssin)\n const terNumber = /^[0-9][0-9](([4][0-9])|([5][0-2]))(([0-2][0-9])|([3][0-1]))[0-9]{3}(([0-8][0-9])|([9][0-7]))$/.test(ssin)\n\n if (normalNumber || bisNumber || terNumber) {\n isValidNiss =\n 97 - (Number(ssin.substring(0, 9)) % 97) === Number(ssin.substring(9, 11))\n ? true\n : 97 - (Number('2' + ssin.substring(0, 9)) % 97) === Number(ssin.substring(9, 11))\n }\n\n return isValidNiss\n }\n\n async getPatientIdOfChildDocumentForHcpAndHcpParents(\n childDocument: models.Invoice | models.CalendarItem | models.Contact | models.AccessLog,\n hcpId: string,\n childDocumentType: EntityWithDelegationTypeName\n ): Promise<string> {\n const parentIdsArray = await this.crypto.xapi.owningEntityIdsOf({ entity: childDocument, type: childDocumentType }, hcpId)\n\n const multipleParentIds = _.uniq(parentIdsArray).length > 1\n\n if (multipleParentIds) {\n throw 'Child document with id ' + childDocument.id + ' contains multiple parent ids in its CFKs for hcpId: ' + hcpId\n }\n\n const parentId = _.first(parentIdsArray)\n\n if (!parentId) {\n throw 'Parent id is empty in CFK of child document with id ' + childDocument.id + ' for hcpId: ' + hcpId\n }\n\n let patient: models.Patient = await super.getPatient(parentId!)\n\n let mergeLevel = 0\n const maxMergeLevel = 10\n while (patient.mergeToPatientId) {\n mergeLevel++\n if (mergeLevel === maxMergeLevel) {\n throw 'Too many merged levels for parent (Patient) of child document ' + childDocument.id + ' ; hcpId: ' + hcpId\n }\n\n patient = await super.getPatient(patient.mergeToPatientId!)\n }\n\n return patient.id!\n }\n\n /**\n * @return if the logged data owner has write access to the content of the given patient\n */\n async hasWriteAccess(patient: models.Patient): Promise<boolean> {\n return this.crypto.xapi.hasWriteAccess({ entity: patient, type: EntityWithDelegationTypeName.Patient })\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param delegateId the id of the data owner which will be granted access to the patient.\n * @param patient the patient to share.\n * @param shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * @param options optional parameters to customize the sharing behaviour:\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return the updated entity\n */\n async shareWith(\n delegateId: string,\n patient: models.Patient,\n shareSecretIds: string[],\n options: {\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n } = {}\n ): Promise<models.Patient> {\n return this.shareWithMany(patient, { [delegateId]: { ...options, shareSecretIds: shareSecretIds } })\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param patient the patient to share.\n * @param delegates associates the id of data owners which will be granted access to the entity, to the following sharing options:\n * - shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return the updated entity\n */\n async shareWithMany(\n patient: models.Patient,\n delegates: {\n [delegateIds: string]: {\n shareSecretIds: string[]\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n }\n }\n ): Promise<models.Patient> {\n return (await this.tryShareWithMany(patient, delegates)).updatedEntityOrThrow\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param patient the patient to share.\n * @param delegates associates the id of data owners which will be granted access to the entity, to the following sharing options:\n * - shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return a promise which will contain the result of the operation: the updated entity if the operation was successful or details of the error if\n * the operation failed.\n */\n async tryShareWithMany(\n patient: models.Patient,\n delegates: {\n [delegateIds: string]: {\n shareSecretIds: string[]\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n }\n }\n ): Promise<ShareResult<models.Patient>> {\n const self = await this.dataOwnerApi.getCurrentDataOwnerId()\n // All entities should have an encryption key.\n const entityWithEncryptionKey = await this.crypto.xapi.ensureEncryptionKeysInitialised(patient, EntityWithDelegationTypeName.Patient)\n const updatedEntity = entityWithEncryptionKey ? await this.modifyPatientAs(self, entityWithEncryptionKey) : patient\n return this.crypto.xapi\n .simpleShareOrUpdateEncryptedEntityMetadata(\n {\n entity: updatedEntity,\n type: EntityWithDelegationTypeName.Patient,\n },\n Object.fromEntries(\n Object.entries(delegates).map(([delegateId, options]) => [\n delegateId,\n {\n requestedPermissions: options.requestedPermissions,\n shareEncryptionKeys: options.shareEncryptionKey,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: options.shareSecretIds,\n },\n ])\n ),\n (x) => this.bulkSharePatients(x)\n )\n .then((r) => r.mapSuccessAsync((e) => this.decryptAs(self, [e]).then((es) => es[0])))\n }\n\n /**\n * @param patient a patient\n * @return all the decryptable secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * @param patient a patient\n * @return the confidential secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptConfidentialSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.getConfidentialSecretIds({ entity: patient, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * @param patient a patient\n * @return the non-confidential secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptNonConfidentialSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.getSecretIdsSharedWithParents({ entity: patient, type: EntityWithDelegationTypeName.Patient })\n }\n\n getDataOwnersWithAccessTo(\n entity: models.Patient\n ): Promise<{ permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean }> {\n return this.crypto.delegationsDeAnonymization.getDataOwnersWithAccessTo({ entity, type: EntityWithDelegationTypeName.Patient })\n }\n\n getEncryptionKeysOf(entity: models.Patient): Promise<string[]> {\n return this.crypto.xapi.encryptionKeysOf({ entity, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * Merge two patients into one. This method performs the following operations:\n * - The `from` patient will be soft-deleted, and it will point to the `into` patient. Only the `deletionDate` and `mergeToPatientId` fields of the\n * patient will be changed (automatically by this method). Note that the value of {@link from} is only used to verify that the client is aware of\n * the last version of the `from` patient: any changes to its content and/or metadata compared to what is actually stored in the database will be\n * ignored.\n * - The metadata of the `into` patient will be automatically updated to contain also the metadata of the `from` patient and to keep track of the\n * merge:\n * - the `mergedIds` will be updated to contain the `from` patient id\n * - all secret ids of the `from` patient will be added to the `into` patient\n * - all data owners (including anonymous data owners) with access to the `from` patient will have the same access to the merged `into` patient\n * (unless they already had greater access to the `into` patient, in which case they keep the greater access)\n * - The content of the `into` patient will be updated to match the content (name, address, note, ...) of the provided {@link mergedInto} parameter.\n * Note that since the metadata is automatically updated by this method you must not change the metadata of the `mergedInto` patient\n * (`delegations`, mergedInto`, ...): if there is any change between the metadata of the provided `mergedInto` patient and the stored patient this\n * method will fail with an error.\n *\n * In case the revisions of {@link from} and/or {@link mergedInto} does not match the latest revisions for these patients in the database this\n * method will fail without soft-deleting the `from` patient and without updating the `into` patient with the merged content and metadata. You will\n * have to retrieve the updated versions of both patients before retrying the merge.\n *\n * Finally, note that this method only merges existing data, and does not perform any automatic sharing of the data. The secret ids and encryption\n * keys will not be shared with users that had access only to one of the entity, you will have to use the {@link shareWith} method after the merge\n * if you want to do so.\n * For example consider hcps A, B with access to P' and hcps A, C with access to P'', and we merge P'' into P'. After the merge:\n * - A has access to all secret ids of the merged patient and to the encryption key of the merged patient\n * - B has access to the encryption key of the merged patient (since it is the same as in P'), but only to the secret id which was originally from\n * the unmerged P'\n * - C has no access to the encryption key of the merged patient, and has access only to the secret id which was originally from the unmerged P''\n *\n * @param from the original, unmodified `from` patient. Its content will be unchanged and its metadata will be automatically updated by this method\n * to reflect the merge.\n * @param mergedInto the `into` patient with updated content result of the merge with the `from` patient, as specified by your application logic.\n * The metadata of the `mergedInto` patient must not differ from the metadata of the stored version of the patient, since it will be automatically\n * updated by the method.\n * @return the updated `into` patient.\n */\n async mergePatients(from: Patient, mergedInto: Patient): Promise<Patient> {\n const encryptedMerged = (await this.encryptAs(await this.dataOwnerApi.getCurrentDataOwnerId(), [mergedInto]))[0]\n const merged = await super.baseMergePatients(from.id!, from.rev!, encryptedMerged)\n return (await this.tryDecryptOrReturnOriginal([merged]))[0].entity\n }\n\n async subscribeToPatientEvents(\n eventTypes: ('CREATE' | 'UPDATE' | 'DELETE')[],\n filter: AbstractFilter<Patient> | undefined,\n eventFired: (patient: Patient) => Promise<void>,\n options: SubscriptionOptions = {}\n ): Promise<Connection> {\n const currentUser = await this.userApi.getCurrentUser()\n return subscribeToEntityEvents(\n this.host,\n this.authApi,\n EntityWithDelegationTypeName.Patient,\n eventTypes,\n filter,\n eventFired,\n options,\n async (encrypted) => (await this.decrypt(currentUser, [encrypted]))[0]\n ).then((rs) => new ConnectionImpl(rs))\n }\n\n createDelegationDeAnonymizationMetadata(entity: Patient, delegates: string[]): Promise<void> {\n return this.crypto.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo({ entity, type: EntityWithDelegationTypeName.Patient }, delegates)\n }\n\n /**\n * Initializes the exchange data towards a newly invited patient. This allows the doctor to share data with the\n * patient even if the patient has not yet initialized a keypair for himself.\n *\n * This method should be used only if the patient has not yet initialized a keypair for himself. If the patient has\n * already initialized a keypair this method does nothing and returns false. In this case the exchange data will be\n * automatically created the first time you share data with the patient, and your implementation of the crypto\n * strategies will be used to validate the public keys of the patient.\n *\n * Once exchange data is initialized you can use the {@link IccRecoveryXApi.createExchangeDataRecoveryInfo} to\n * generate a key that the patient will be able to use on his first login to immediately gain access to the exchange\n * data (through the {@link IccRecoveryXApi.recoverExchangeData} method).\n *\n * @param patientId the id of the newly invited patient.\n * @return true if exchange data was initialized, false if the patient already has a key pair and the exchange data\n * will be initialized in the standard way (automatically on the first time data is shared with the user).\n */\n async forceInitialiseExchangeDataToNewlyInvitedPatient(patientId: string): Promise<boolean> {\n const patient = await super.getPatient(patientId)\n if (this.dataOwnerApi.getHexPublicKeysOf(patient).size) return false\n await this.crypto.exchangeData.getOrCreateEncryptionDataTo(patientId, {\n allowCreationWithoutDelegateKey: true,\n })\n return true\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"icc-patient-x-api.js","sourceRoot":"","sources":["../../icc-x-api/icc-patient-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccAuthApi, IccPatientApi } from '../icc-api'\nimport { IccCryptoXApi } from './icc-crypto-x-api'\nimport { IccContactXApi } from './icc-contact-x-api'\nimport { IccFormXApi } from './icc-form-x-api'\nimport { IccHcpartyXApi } from './icc-hcparty-x-api'\nimport { IccInvoiceXApi } from './icc-invoice-x-api'\nimport { IccDocumentXApi } from './icc-document-x-api'\nimport { IccHelementXApi } from './icc-helement-x-api'\nimport { IccClassificationXApi } from './icc-classification-x-api'\n\nimport * as _ from 'lodash'\nimport * as models from '../icc-api/model/models'\nimport { Document, IcureStub, ListOfIds, MaintenanceTask, Patient } from '../icc-api/model/models'\nimport { IccCalendarItemXApi } from './icc-calendar-item-x-api'\nimport { b64_2ab } from '../icc-api/model/ModelHelper'\nimport { findName, garnishPersonWithName, hasName } from './utils/person-util'\nimport { EncryptedFieldsManifest, parseEncryptedFields, retry, subscribeToEntityEvents, SubscriptionOptions } from './utils'\nimport { IccDataOwnerXApi } from './icc-data-owner-x-api'\nimport { AuthenticationProvider, NoAuthenticationProvider } from './auth/AuthenticationProvider'\nimport { EntityWithDelegationTypeName } from './utils/EntityWithDelegationTypeName'\nimport { SecureDelegation } from '../icc-api/model/SecureDelegation'\nimport { MinimalEntityBulkShareResult } from '../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { EntityShareRequest } from '../icc-api/model/requests/EntityShareRequest'\nimport { ShareMetadataBehaviour } from './crypto/ShareMetadataBehaviour'\nimport { ShareResult } from './utils/ShareResult'\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport { XHR } from '../icc-api/api/XHR'\nimport { EncryptedEntityXApi } from './basexapi/EncryptedEntityXApi'\nimport { IccUserXApi } from './icc-user-x-api'\nimport { AbstractFilter } from './filters/filters'\nimport { Connection, ConnectionImpl } from '../icc-api/model/Connection'\nimport { BulkShareOrUpdateMetadataParams } from '../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\n\n// noinspection JSUnusedGlobalSymbols\nexport class IccPatientXApi extends IccPatientApi implements EncryptedEntityXApi<models.Patient> {\n private readonly encryptedFields: EncryptedFieldsManifest\n\n get headers(): Promise<Array<XHR.Header>> {\n return super.headers.then((h) => this.crypto.accessControlKeysHeaders.addAccessControlKeysHeaders(h, EntityWithDelegationTypeName.Patient))\n }\n\n constructor(\n host: string,\n headers: { [key: string]: string },\n private readonly crypto: IccCryptoXApi,\n private readonly contactApi: IccContactXApi,\n private readonly formApi: IccFormXApi,\n private readonly helementApi: IccHelementXApi,\n private readonly invoiceApi: IccInvoiceXApi,\n private readonly documentApi: IccDocumentXApi,\n private readonly hcpartyApi: IccHcpartyXApi,\n private readonly classificationApi: IccClassificationXApi,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly calendarItemApi: IccCalendarItemXApi,\n private readonly userApi: IccUserXApi,\n private readonly authApi: IccAuthApi,\n private readonly autofillAuthor: boolean,\n encryptedKeys: Array<string> = ['note'],\n authenticationProvider: AuthenticationProvider = new NoAuthenticationProvider(),\n fetchImpl: (input: RequestInfo, init?: RequestInit) => Promise<Response> = typeof window !== 'undefined'\n ? window.fetch\n : typeof self !== 'undefined'\n ? self.fetch\n : fetch\n ) {\n super(host, headers, authenticationProvider, fetchImpl)\n\n this.encryptedFields = parseEncryptedFields(encryptedKeys, 'Patient.')\n }\n\n /**\n * Creates a new instance of patient with initialised encryption metadata (not in the database).\n * @param user the current user.\n * @param p initialised data for the patient. Metadata such as id, creation data, etc. will be automatically initialised, but you can specify\n * other kinds of data or overwrite generated metadata with this. You can't specify encryption metadata.\n * @param options optional parameters:\n * - additionalDelegates: delegates which will have access to the entity in addition to the current data owner and delegates from the\n * auto-delegations. Must be an object which associates each data owner id with the access level to give to that data owner. May overlap with\n * auto-delegations, in such case the access level specified here will be used.\n * - ignoreAutoDelegations: if true the data won't be shared with the autodelegations of the user, but only with additional delegates\n * - alternateRootDelegation: by default a new entity is created with a root delegation from self to self. In keyless mode this is not possible,\n * and instead the root delegation will be from self to another. You have to specify which delegate will be part of the root delegation.\n * @return a new instance of patient.\n */\n async newInstance(\n user: models.User,\n p: any = {},\n options: {\n additionalDelegates?: { [dataOwnerId: string]: AccessLevelEnum }\n ignoreAutoDelegations?: boolean\n alternateRootDelegation?: string\n } = {}\n ) {\n const patient = {\n ...(p ?? {}),\n _type: 'org.taktik.icure.entities.Patient',\n id: p?.id ?? this.crypto.primitives.randomUuid(),\n created: p?.created ?? new Date().getTime(),\n modified: p?.modified ?? new Date().getTime(),\n responsible: p?.responsible ?? (this.autofillAuthor ? this.dataOwnerApi.getDataOwnerIdOf(user) : undefined),\n author: p?.author ?? (this.autofillAuthor ? user.id : undefined),\n codes: p?.codes ?? [],\n tags: p?.tags ?? [],\n }\n\n const ownerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n if (ownerId !== (await this.dataOwnerApi.getCurrentDataOwnerId())) throw new Error('Can only initialise entities as current data owner.')\n const extraDelegations = {\n ...(options.ignoreAutoDelegations == true\n ? {}\n : Object.fromEntries(\n [...(user.autoDelegations?.all ?? []), ...(user.autoDelegations?.medicalInformation ?? [])].map((d) => [d, AccessLevelEnum.WRITE])\n )),\n ...(options?.additionalDelegates ?? {}),\n }\n const initialisationInfo = await this.crypto.xapi.entityWithInitialisedEncryptedMetadata(\n patient,\n EntityWithDelegationTypeName.Patient,\n undefined,\n undefined,\n true,\n extraDelegations,\n options.alternateRootDelegation\n )\n return new models.Patient(initialisationInfo.updatedEntity)\n }\n\n completeNames(patient: models.Patient): models.Patient {\n let finalPatient: any = patient\n\n if (!!finalPatient.lastName && !hasName(finalPatient, models.PersonName.UseEnum.Official)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Official, finalPatient.lastName, finalPatient.firstName)\n }\n\n if (!!finalPatient.maidenName && !hasName(finalPatient, models.PersonName.UseEnum.Maiden)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Maiden, finalPatient.maidenName, finalPatient.firstName)\n }\n\n if (!!finalPatient.alias && !hasName(finalPatient, models.PersonName.UseEnum.Nickname)) {\n finalPatient = garnishPersonWithName(finalPatient, models.PersonName.UseEnum.Nickname, finalPatient.alias, finalPatient.firstName)\n }\n\n if (!finalPatient.lastName && !!hasName(finalPatient, models.PersonName.UseEnum.Official)) {\n const officialName = findName(finalPatient, models.PersonName.UseEnum.Official)\n finalPatient = {\n ...finalPatient,\n lastName: officialName!.lastName,\n firstName: officialName!.firstNames?.[0],\n }\n }\n\n if (!finalPatient.maidenName && !!hasName(finalPatient, models.PersonName.UseEnum.Maiden)) {\n finalPatient = {\n ...finalPatient,\n maidenName: findName(finalPatient, models.PersonName.UseEnum.Maiden)!.lastName,\n }\n }\n\n if (!finalPatient.alias && !!hasName(finalPatient, models.PersonName.UseEnum.Nickname)) {\n finalPatient = {\n ...finalPatient,\n alias: findName(finalPatient, models.PersonName.UseEnum.Nickname)!.lastName,\n }\n }\n\n return new Patient(finalPatient)\n }\n\n /**\n * @deprecated replace with {@link initConfidentialSecretId}\n */\n async initConfidentialDelegation(patient: models.Patient, user: models.User): Promise<models.Patient> {\n return this.initConfidentialSecretId(patient, user)\n }\n\n /**\n * Ensures that the current data owner has some confidential secret ids for the provided patient. If not creates them and updates the patient in the\n * database.\n * @param patient the patient for which you want to initialise the confidential secret id.\n * @param user the current user.\n * @return the updated patient or the original patient if no change was necessary.\n */\n async initConfidentialSecretId(patient: models.Patient, user: models.User): Promise<models.Patient> {\n const dataOwnerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n if (dataOwnerId !== (await this.dataOwnerApi.getCurrentDataOwnerId()))\n throw new Error('You can initialise confidential delegations only for the current data owner')\n let updatedPatient = patient\n if (!patient.rev) {\n updatedPatient = await this.createPatientWithUser(user, patient)\n if (!updatedPatient) throw new Error('Could not create patient')\n }\n const initialised = await this.crypto.xapi.initialiseConfidentialSecretId(updatedPatient, EntityWithDelegationTypeName.Patient, (x) =>\n this.bulkSharePatients(x)\n )\n if (initialised) {\n return initialised\n } else {\n return updatedPatient\n }\n }\n\n createPatient(body?: models.Patient): never {\n throw new Error('Cannot call a method that returns patients without providing a user for de/encryption')\n }\n\n createPatientWithUser(user: models.User, body?: models.Patient): Promise<models.Patient | any> {\n return body\n ? this.encrypt(user, [_.cloneDeep(this.completeNames(body))])\n .then((pats) => super.createPatient(pats[0]))\n .then(async (patient: Patient) => {\n /**\n * This code is a workaround for the fact that the backend is adding empty delegations to the patient when it is created.\n */\n\n const patientDelegations = patient.delegations\n\n if (patientDelegations != undefined && Object.keys(patientDelegations).length > 0) {\n const areDelegationsEmpty = Object.values(patientDelegations).every((delegation) => delegation.length === 0)\n\n if (areDelegationsEmpty) {\n return await this.modifyPatientRaw(\n new Patient({\n ...patient,\n delegations: {},\n })\n )\n }\n }\n return patient\n })\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n : Promise.resolve(null)\n }\n\n filterBy(\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n skip?: number,\n sort?: string,\n desc?: boolean,\n body?: models.FilterChainPatient\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n filterByWithUser(\n user: models.User,\n filterChain: models.FilterChainPatient,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n skip?: number,\n sort?: string,\n desc?: boolean\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .filterPatientsBy(startKey, startDocumentId, limit, skip, sort, desc, filterChain)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n findByAccessLogUserAfterDate(\n userId: string,\n accessType?: string,\n startDate?: number,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByAccessLogUserAfterDateWithUser(\n user: models.User,\n userId: string,\n accessType?: string,\n startDate?: number,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .findByAccessLogUserAfterDate(userId, accessType, startDate, startKey, startDocumentId, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n findByAccessLogUserAfterDate_1(externalId: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByExternalIdWithUser(user: models.User, externalId: string): Promise<models.Patient | any> {\n return super\n .findByExternalId(externalId)\n .then((pats) => this.decrypt(user, [pats]))\n .then((x) => x[0])\n }\n\n findByNameBirthSsinAuto(\n healthcarePartyId?: string,\n filterValue?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n findByNameBirthSsinAutoWithUser(\n user: models.User,\n healthcarePartyId?: string,\n filterValue?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .findByNameBirthSsinAuto(healthcarePartyId, filterValue, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n fuzzySearch(firstName?: string, lastName?: string, dateOfBirth?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n fuzzySearchWithUser(user: models.User, firstName?: string, lastName?: string, dateOfBirth?: number): Promise<Array<models.Patient> | any> {\n return super.fuzzySearch(firstName, lastName, dateOfBirth).then((pats) => this.decrypt(user, pats))\n }\n\n getPatient(patientId: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n getPatientRaw(patientId: string): Promise<models.Patient | any> {\n return super.getPatient(patientId)\n }\n\n getPatientWithUser(user: models.User, patientId: string): Promise<models.Patient | any> {\n return super\n .getPatient(patientId)\n .then((p) => this.tryDecryptOrReturnOriginal([p]))\n .then((pats) => pats[0].entity)\n }\n\n getPotentiallyEncryptedPatientWithUser(user: models.User, patientId: string): Promise<{ patient: models.Patient; decrypted: boolean }> {\n return super\n .getPatient(patientId)\n .then((p) => this.tryDecryptOrReturnOriginal([p]))\n .then((pats) => ({ patient: pats[0].entity, decrypted: pats[0].decrypted }))\n }\n\n getPatients(body?: models.ListOfIds): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n getPatientsWithUser(user: models.User, body?: models.ListOfIds): Promise<Array<models.Patient> | any> {\n return super.getPatients(body).then((pats) => this.decrypt(user, pats))\n }\n\n listDeletedPatients(startDate?: number, endDate?: number, desc?: boolean, startKey?: string, startDocumentId?: string, limit?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listDeletedPatientsWithUser(\n user: models.User,\n startDate?: number,\n endDate?: number,\n desc?: boolean,\n startKey?: string,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listDeletedPatients(startDate, endDate, desc, startDocumentId, startKey, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listDeletedPatients_2(firstName?: string, lastName?: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listDeletedPatientsByNameWithUser(user: models.User, firstName?: string, lastName?: string): Promise<Array<models.Patient> | any> {\n return super.listDeletedPatientsByName(firstName, lastName).then((rows) => this.decrypt(user, rows, false))\n }\n\n listOfMergesAfter(date: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listOfMergesAfterWithUser(user: models.User, date: number): Promise<Array<models.Patient> | any> {\n return super.listOfMergesAfter(date).then((pats) => this.decrypt(user, pats, false))\n }\n\n listOfPatientsModifiedAfter(date: number, startKey?: number, startDocumentId?: string, limit?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listOfPatientsModifiedAfterWithUser(\n user: models.User,\n date: number,\n startKey?: number,\n startDocumentId?: string,\n limit?: number\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listOfPatientsModifiedAfter(date, startKey, startDocumentId, limit)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatients(hcPartyId?: string, sortField?: string, startKey?: string, startDocumentId?: string, limit?: number, sortDirection?: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsWithUser(\n user: models.User,\n hcPartyId?: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatients(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatientsByHcParty(\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsByHcPartyWithUser(\n user: models.User,\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatientsByHcParty(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n listPatientsOfHcParty(\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n listPatientsOfHcPartyWithUser(\n user: models.User,\n hcPartyId: string,\n sortField?: string,\n startKey?: string,\n startDocumentId?: string,\n limit?: number,\n sortDirection?: string\n ): Promise<models.PaginatedListPatient | any> {\n return super\n .listPatientsOfHcParty(hcPartyId, sortField, startKey, startDocumentId, limit, sortDirection)\n .then((pl) => this.decrypt(user, pl.rows!, false).then((dr) => Object.assign(pl, { rows: dr })))\n }\n\n mergeInto(toId: string, fromIds: string): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n mergeIntoWithUser(user: models.User, toId: string, fromIds: string): Promise<models.Patient | any> {\n return super\n .mergeInto(toId, fromIds)\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n }\n\n modifyPatient(body?: models.Patient): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n /**\n * @internal this method is for internal use only and may be changed without notice.\n */\n modifyPatientRaw(body?: models.Patient): Promise<models.Patient | any> {\n return super.modifyPatient(body)\n }\n\n modifyPatientWithUser(user: models.User, body?: models.Patient): Promise<models.Patient | null> {\n return body ? this.modifyPatientAs(this.dataOwnerApi.getDataOwnerIdOf(user), body) : Promise.resolve(null)\n }\n\n private modifyPatientAs(dataOwner: string, body: models.Patient): Promise<models.Patient> {\n return this.encryptAs(dataOwner, [_.cloneDeep(this.completeNames(body))])\n .then((pats) => super.modifyPatient(pats[0]))\n .then((p) => this.decryptAs(dataOwner, [p]))\n .then((pats) => pats[0])\n }\n\n modifyPatientReferral(patientId: string, referralId: string, start?: number, end?: number): never {\n throw new Error('Cannot call a method that returns contacts without providing a user for de/encryption')\n }\n\n modifyPatientReferralWithUser(\n user: models.User,\n patientId: string,\n referralId: string,\n start?: number,\n end?: number\n ): Promise<models.Patient | any> {\n return super\n .modifyPatientReferral(patientId, referralId, start, end)\n .then((p) => this.decrypt(user, [p]))\n .then((pats) => pats[0])\n }\n\n encrypt(user: models.User, pats: Array<models.Patient>): Promise<Array<models.Patient>> {\n const dataOwnerId = this.dataOwnerApi.getDataOwnerIdOf(user)\n return this.encryptAs(dataOwnerId, pats)\n }\n\n private encryptAs(dataOwner: string, pats: Array<models.Patient>): Promise<Array<models.Patient>> {\n return this.crypto.xapi.tryEncryptEntities(\n pats,\n EntityWithDelegationTypeName.Patient,\n this.encryptedFields,\n true,\n false,\n (x) => new models.Patient(x)\n )\n }\n\n // If patient can't be decrypted returns patient with encrypted data.\n decrypt(user: models.User, patients: Array<models.Patient>, fillDelegations = true): Promise<Array<models.Patient>> {\n return this.decryptAs(this.dataOwnerApi.getDataOwnerIdOf(user), patients, fillDelegations)\n }\n\n private decryptAs(dataOwner: string, patients: Array<models.Patient>, fillDelegations = true): Promise<Array<models.Patient>> {\n return this.tryDecryptOrReturnOriginal(patients).then((ps) => ps.map((p) => p.entity))\n }\n\n async tryDecryptOrReturnOriginal(patients: Array<models.Patient>): Promise<{ entity: models.Patient; decrypted: boolean }[]> {\n return (await this.crypto.xapi.tryDecryptEntities(patients, EntityWithDelegationTypeName.Patient, (x) => new models.Patient(x))).map((p) => {\n if (p.entity.picture && !(p.entity.picture instanceof ArrayBuffer)) {\n return {\n entity: new models.Patient({\n ...p.entity,\n picture: b64_2ab(p.entity.picture),\n }),\n decrypted: p.decrypted,\n }\n } else return p\n })\n }\n\n /**\n * @deprecated replace with {@link shareAllDataOfPatient}\n */\n async share(\n user: models.User,\n patId: string,\n ownerId: string,\n delegateIds: Array<string>,\n delegationTags: { [key: string]: Array<string> },\n usingPost: boolean = false\n ): Promise<{\n patient: models.Patient | null\n statuses: { [key: string]: { success: boolean | null; error: Error | null } }\n } | null> {\n return this.shareAllDataOfPatient(user, patId, ownerId, delegateIds, delegationTags, usingPost)\n }\n\n async shareAllDataOfPatient(\n user: models.User,\n patId: string,\n ownerId: string,\n delegateIds: Array<string>,\n delegationTags: { [key: string]: Array<string> },\n usingPost: boolean = false\n ): Promise<{\n patient: models.Patient | null\n statuses: { [key: string]: { success: boolean | null; error: Error | null } }\n } | null> {\n const allTags: string[] = _.uniq(_.flatMap(Object.values(delegationTags)))\n const status = {\n contacts: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n forms: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n healthElements: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n invoices: {\n success: allTags.includes('financialInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n documents: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n classifications: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n calendarItems: {\n success: allTags.includes('medicalInformation') || allTags.includes('all') ? false : null,\n error: null,\n modified: 0,\n },\n patient: { success: false, error: null, modified: 0 } as {\n success: boolean\n error: Error | null\n },\n }\n const hcp = await this.hcpartyApi.getHealthcareParty(ownerId)\n const parentId = hcp.parentId\n let patient = await retry(() => this.getPatientWithUser(user, patId))\n const patientWithInitialisedEncryption = await this.crypto.xapi.ensureEncryptionKeysInitialised(patient, EntityWithDelegationTypeName.Patient)\n if (patientWithInitialisedEncryption) {\n patient = await this.modifyPatientWithUser(user, patientWithInitialisedEncryption)\n }\n\n if (!patient) {\n status.patient = {\n success: false,\n error: new Error('Patient does not exist or cannot initialise encryption keys'),\n }\n return { patient: patient, statuses: status }\n }\n\n const delSfks = await this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId)\n const ecKeys = await this.crypto.xapi.encryptionKeysOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId)\n\n if (delSfks.length) {\n const retrievedHealthElements = await retry(() =>\n (usingPost\n ? this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((hes) =>\n parentId\n ? (usingPost\n ? this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.helementApi.findHealthElementsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreHes) => _.uniqBy(hes.concat(moreHes), 'id'))\n : hes\n )\n )\n const retrievedForms = await retry(() =>\n (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((frms) =>\n parentId\n ? (usingPost\n ? this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeysUsingPost(parentId, _.uniq(delSfks))\n : this.formApi.findFormsDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreFrms) => _.uniqBy(frms.concat(moreFrms), 'id'))\n : frms\n )\n )\n const retrievedContacts = await retry(() =>\n (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(ownerId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ctcs) =>\n parentId\n ? (usingPost\n ? this.contactApi.findByHCPartyPatientSecretFKeysUsingPost(parentId, undefined, undefined, _.uniq(delSfks))\n : this.contactApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreCtcs) => _.uniqBy(ctcs.concat(moreCtcs), 'id'))\n : ctcs\n )\n )\n const retrievedInvoices = await retry(() =>\n (usingPost\n ? this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeysUsingPost(ownerId, _.uniq(delSfks))\n : this.invoiceApi.findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((ivs) =>\n parentId\n ? this.invoiceApi\n .findInvoicesDelegationsStubsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreIvs) => _.uniqBy(ivs.concat(moreIvs), 'id'))\n : ivs\n )\n )\n const retrievedClassifications = await retry(() =>\n this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(ownerId, _.uniq(delSfks).join(','))\n .then((cls) =>\n parentId\n ? this.classificationApi\n .findClassificationsByHCPartyPatientForeignKeys(parentId, _.uniq(delSfks).join(','))\n .then((moreCls) => _.uniqBy(cls.concat(moreCls), 'id'))\n : cls\n )\n )\n const retrievedCalendarItems = await retry(() =>\n (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(ownerId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(ownerId, _.uniq(delSfks).join(','))\n ).then((cls) =>\n parentId\n ? (usingPost\n ? this.calendarItemApi.findByHCPartyPatientSecretFKeysArray(parentId, _.uniq(delSfks))\n : this.calendarItemApi.findByHCPartyPatientSecretFKeys(parentId, _.uniq(delSfks).join(','))\n ).then((moreCls) => _.uniqBy(cls.concat(moreCls), 'id'))\n : cls\n )\n )\n const isMedicalInfoTags = (tags: string[]) => tags.includes('medicalInformation') || tags.includes('all')\n const isFinancialInfoTags = (tags: string[]) => tags.includes('financialInformation') || tags.includes('all')\n const doShareEntitiesAndUpdateStatus = async (\n entities: models.IcureStub[],\n entitiesType: EntityWithDelegationTypeName,\n status: {\n success: boolean | null\n error: null | Error\n modified: number\n },\n tagsCondition: (tags: string[]) => boolean,\n doShareMinimal: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<void> => {\n const delegatesToApply = delegateIds.filter((delegateId) => tagsCondition(delegationTags[delegateId]))\n if (entities.length && delegatesToApply.length) {\n const requests: {\n entity: IcureStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[] = []\n for (const entity of entities) {\n const currentEntityRequests: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n const secretIds = await this.crypto.xapi.secretIdsOf({ entity, type: entitiesType }, undefined)\n const encryptionKeys = await this.crypto.xapi.encryptionKeysOf({ entity, type: entitiesType }, undefined)\n const request = {\n shareSecretIds: secretIds,\n shareEncryptionKeys: encryptionKeys,\n shareOwningEntityIds: [patient.id!],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n }\n for (const delegateId of delegatesToApply) {\n currentEntityRequests[delegateId] = request\n }\n requests.push({ dataForDelegates: currentEntityRequests, entity })\n }\n await this.crypto.xapi\n .bulkShareOrUpdateEncryptedEntityMetadataNoEntities(entitiesType, requests, (x) => doShareMinimal(x))\n .then((shareResult) => {\n status.modified = new Set(shareResult.successfulUpdates.map((x) => x.entityId)).size\n status.success = shareResult.updateErrors.length === 0\n if (!status.success) {\n const errorMsg = `Error while sharing (some) entities of type ${entitiesType} for patient ${patient.id} : ${JSON.stringify(\n shareResult.updateErrors\n )}`\n console.error(errorMsg)\n status.error = new Error(errorMsg)\n }\n })\n .catch((e) => {\n status.success = false\n status.error = e\n })\n } else {\n status.success = true\n }\n }\n await doShareEntitiesAndUpdateStatus(\n retrievedHealthElements,\n EntityWithDelegationTypeName.HealthElement,\n status.healthElements,\n isMedicalInfoTags,\n (x) => this.helementApi.bulkShareHealthElementsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedContacts, EntityWithDelegationTypeName.Contact, status.contacts, isMedicalInfoTags, (x) =>\n this.contactApi.bulkShareContactsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedInvoices, EntityWithDelegationTypeName.Invoice, status.invoices, isFinancialInfoTags, (x) =>\n this.invoiceApi.bulkShareInvoicesMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(\n retrievedClassifications,\n EntityWithDelegationTypeName.Classification,\n status.classifications,\n isMedicalInfoTags,\n (x) => this.classificationApi.bulkShareClassificationsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(\n retrievedCalendarItems,\n EntityWithDelegationTypeName.CalendarItem,\n status.calendarItems,\n isMedicalInfoTags,\n (x) => this.calendarItemApi.bulkShareCalendarItemsMinimal(x)\n )\n await doShareEntitiesAndUpdateStatus(retrievedForms, EntityWithDelegationTypeName.Form, status.forms, isMedicalInfoTags, (x) =>\n this.formApi.bulkShareFormsMinimal(x)\n )\n }\n const sharePatientDataRequest = {\n shareSecretIds: delSfks,\n shareEncryptionKeys: ecKeys,\n shareOwningEntityIds: [],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n }\n const sharePatientRequest = {\n entity: patient,\n dataForDelegates: Object.fromEntries(delegateIds.map((delegateId) => [delegateId, sharePatientDataRequest])),\n }\n return await this.crypto.xapi\n .bulkShareOrUpdateEncryptedEntityMetadata(EntityWithDelegationTypeName.Patient, [sharePatientRequest], (x) => this.bulkSharePatients(x))\n .then((shareResult) => {\n if (shareResult.updatedEntities.length && !shareResult.updateErrors.length) {\n status.patient.success = true\n return { patient: shareResult.updatedEntities[0], statuses: status }\n } else {\n const errorMsg = `Error while sharing patient with id ${patient.id} : ${JSON.stringify(shareResult.updateErrors)}`\n console.error(errorMsg)\n status.patient.error = new Error(errorMsg)\n status.patient.success = false\n return { patient: shareResult.updatedEntities[0] ?? patient, statuses: status }\n }\n })\n .catch((e) => {\n status.patient.error = e\n status.patient.success = false\n return { patient, statuses: status }\n })\n }\n\n async export(\n user: models.User,\n patId: string,\n ownerId: string\n ): Promise<{\n id: string\n patient: Patient | null\n contacts: models.Contact[]\n forms: models.Form[]\n healthElements: models.HealthElement[]\n invoices: models.Invoice[]\n classifications: models.Classification[]\n calItems: models.CalendarItem[]\n documents: models.Document[]\n }> {\n const parentId = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds().then((h) => (h.length - 2 >= 0 ? h[h.length - 2] : h[0]))\n const patient = await retry(async () => {\n const retrieved: Patient | undefined = await this.getPatientWithUser(user, patId)\n if (retrieved != undefined) {\n const initialised = await this.crypto.xapi.ensureEncryptionKeysInitialised(retrieved, EntityWithDelegationTypeName.Patient)\n if (!initialised) {\n return retrieved\n } else {\n return await this.modifyPatientWithUser(user, initialised)\n }\n } else {\n return null\n }\n })\n const delSfks =\n patient != null ? await this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, ownerId) : []\n if (delSfks.length <= 0) {\n return {\n id: patId,\n patient,\n contacts: [],\n forms: [],\n healthElements: [],\n invoices: [],\n classifications: [],\n calItems: [],\n documents: [],\n }\n }\n const contactIds = new Set([\n ...(await retry(() => this.contactApi.findContactIdsByDataOwnerPatientOpeningDate(ownerId, delSfks))),\n ...(await retry(() => this.contactApi.findContactIdsByDataOwnerPatientOpeningDate(parentId, delSfks))),\n ])\n const formIds = new Set([\n ...(await retry(() => this.formApi.findFormIdsByDataOwnerPatientOpeningDate(ownerId, delSfks))),\n ...(await retry(() => this.formApi.findFormIdsByDataOwnerPatientOpeningDate(parentId, delSfks))),\n ])\n const healthElementIds = new Set([\n ...(await retry(() => this.helementApi.findHealthElementIdsByDataOwnerPatientOpeningDate(ownerId, delSfks))),\n ...(await retry(() => this.helementApi.findHealthElementIdsByDataOwnerPatientOpeningDate(parentId, delSfks))),\n ])\n const invoiceIds = new Set([\n ...(await retry(() => this.invoiceApi.findInvoiceIdsByDataOwnerPatientInvoiceDate(ownerId, delSfks))),\n ...(await retry(() => this.invoiceApi.findInvoiceIdsByDataOwnerPatientInvoiceDate(parentId, delSfks))),\n ])\n const classificationIds = new Set([\n ...(await retry(() => this.classificationApi.findClassificationIdsByDataOwnerPatientCreated(ownerId, delSfks))),\n ...(await retry(() => this.classificationApi.findClassificationIdsByDataOwnerPatientCreated(parentId, delSfks))),\n ])\n const calendarItemIds = new Set([\n ...(await retry(() => this.calendarItemApi.findCalendarItemIdsByDataOwnerPatientStartTime(ownerId, delSfks))),\n ...(await retry(() => this.calendarItemApi.findCalendarItemIdsByDataOwnerPatientStartTime(parentId, delSfks))),\n ])\n async function batchGet<T>(items: string[], get: (batch: string[]) => Promise<T[]>, batchSize: number = 1000): Promise<T[]> {\n const results: T[] = []\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize)\n const res = await retry(() => get(batch))\n results.push(...res)\n }\n return results\n }\n const contacts = await batchGet([...contactIds], (x): Promise<models.Contact[]> => this.contactApi.getContactsWithUser(user, { ids: x }))\n const forms = await batchGet([...formIds], (x): Promise<models.Form[]> => this.formApi.getForms({ ids: x }))\n const healthElements = await batchGet(\n [...healthElementIds],\n (x): Promise<models.HealthElement[]> => this.helementApi.getHealthElementsWithUser(user, { ids: x })\n )\n const invoices = await batchGet([...invoiceIds], (x): Promise<models.Invoice[]> => this.invoiceApi.getInvoices({ ids: x }))\n const classifications = await batchGet(\n [...classificationIds],\n (x): Promise<models.Classification[]> => this.classificationApi.getClassifications({ ids: x })\n )\n const calItems = await batchGet(\n [...calendarItemIds],\n (x): Promise<models.CalendarItem[]> => this.calendarItemApi.getCalendarItemsWithIdsWithUser(user, { ids: x })\n )\n const documentIds = new Set<string>()\n contacts.forEach((contact) => {\n contact.services?.forEach((service) => {\n Object.values(service.content ?? {}).forEach((content) => {\n if (!!content.documentId) documentIds.add(content.documentId)\n })\n })\n })\n const documents = await batchGet([...documentIds], (x): Promise<models.Document[]> => this.documentApi.getDocumentsWithUser(user, { ids: x }))\n return {\n id: patId,\n patient,\n calItems,\n classifications,\n contacts,\n documents,\n forms,\n healthElements,\n invoices,\n }\n }\n\n checkInami(inami: string): boolean {\n const num_inami = inami.replace(new RegExp('[^(0-9)]', 'g'), '')\n\n const checkDigit = num_inami.substring(6, 8)\n const numSansCheck = num_inami.substring(0, 6)\n let retour = false\n\n //modulo du niss\n const modINAMI = parseInt(numSansCheck) % 97\n\n //obtention du num de check 97 - le resultat du mod\n const checkDigit_2 = 97 - modINAMI\n\n if (parseInt(checkDigit) == checkDigit_2) {\n retour = true\n }\n return retour\n }\n\n isValidSsin(ssin: string) {\n ssin = ssin.replace(new RegExp('[^(0-9)]', 'g'), '')\n let isValidNiss = false\n\n const normalNumber =\n /^[0-9][0-9](([0][0-9])|([1][0-2]))(([0-2][0-9])|([3][0-1]))(([0-9]{2}[1-9])|([0-9][1-9][0-9])|([1-9][0-9]{2}))(([0-8][0-9])|([9][0-7]))$/.test(\n ssin\n )\n const bisNumber = /^[0-9][0-9](([2][0-9])|([3][0-2]))(([0-2][0-9])|([3][0-1]))[0-9]{3}(([0-8][0-9])|([9][0-7]))$/.test(ssin)\n const terNumber = /^[0-9][0-9](([4][0-9])|([5][0-2]))(([0-2][0-9])|([3][0-1]))[0-9]{3}(([0-8][0-9])|([9][0-7]))$/.test(ssin)\n\n if (normalNumber || bisNumber || terNumber) {\n isValidNiss =\n 97 - (Number(ssin.substring(0, 9)) % 97) === Number(ssin.substring(9, 11))\n ? true\n : 97 - (Number('2' + ssin.substring(0, 9)) % 97) === Number(ssin.substring(9, 11))\n }\n\n return isValidNiss\n }\n\n async getPatientIdOfChildDocumentForHcpAndHcpParents(\n childDocument: models.Invoice | models.CalendarItem | models.Contact | models.AccessLog,\n hcpId: string,\n childDocumentType: EntityWithDelegationTypeName\n ): Promise<string> {\n const parentIdsArray = await this.crypto.xapi.owningEntityIdsOf({ entity: childDocument, type: childDocumentType }, hcpId)\n\n const multipleParentIds = _.uniq(parentIdsArray).length > 1\n\n if (multipleParentIds) {\n throw 'Child document with id ' + childDocument.id + ' contains multiple parent ids in its CFKs for hcpId: ' + hcpId\n }\n\n const parentId = _.first(parentIdsArray)\n\n if (!parentId) {\n throw 'Parent id is empty in CFK of child document with id ' + childDocument.id + ' for hcpId: ' + hcpId\n }\n\n let patient: models.Patient = await super.getPatient(parentId!)\n\n let mergeLevel = 0\n const maxMergeLevel = 10\n while (patient.mergeToPatientId) {\n mergeLevel++\n if (mergeLevel === maxMergeLevel) {\n throw 'Too many merged levels for parent (Patient) of child document ' + childDocument.id + ' ; hcpId: ' + hcpId\n }\n\n patient = await super.getPatient(patient.mergeToPatientId!)\n }\n\n return patient.id!\n }\n\n /**\n * @return if the logged data owner has write access to the content of the given patient\n */\n async hasWriteAccess(patient: models.Patient): Promise<boolean> {\n return this.crypto.xapi.hasWriteAccess({ entity: patient, type: EntityWithDelegationTypeName.Patient })\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param delegateId the id of the data owner which will be granted access to the patient.\n * @param patient the patient to share.\n * @param shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * @param options optional parameters to customize the sharing behaviour:\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return the updated entity\n */\n async shareWith(\n delegateId: string,\n patient: models.Patient,\n shareSecretIds: string[],\n options: {\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n } = {}\n ): Promise<models.Patient> {\n return this.shareWithMany(patient, { [delegateId]: { ...options, shareSecretIds: shareSecretIds } })\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param patient the patient to share.\n * @param delegates associates the id of data owners which will be granted access to the entity, to the following sharing options:\n * - shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return the updated entity\n */\n async shareWithMany(\n patient: models.Patient,\n delegates: {\n [delegateIds: string]: {\n shareSecretIds: string[]\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n }\n }\n ): Promise<models.Patient> {\n return (await this.tryShareWithMany(patient, delegates)).updatedEntityOrThrow\n }\n\n /**\n * Share an existing patient with other data owners, allowing them to access the non-encrypted data of the patient and optionally also\n * the encrypted content, with read-only or read-write permissions.\n * @param patient the patient to share.\n * @param delegates associates the id of data owners which will be granted access to the entity, to the following sharing options:\n * - shareSecretIds the secret ids of the Patient that the delegate will be given access to. Allows the delegate to search for data where the\n * shared Patient is the owning entity id.\n * - shareEncryptionKey: specifies if the encryption key of the access log should be shared with the delegate, giving access to all encrypted\n * content of the entity, excluding other encrypted metadata (defaults to {@link ShareMetadataBehaviour.IF_AVAILABLE}). Note that by default a\n * patient does not have encrypted content.\n * {@link ShareMetadataBehaviour.IF_AVAILABLE}).\n * - requestedPermissions: the requested permissions for the delegate, defaults to {@link RequestedPermissionEnum.MAX_WRITE}.\n * @return a promise which will contain the result of the operation: the updated entity if the operation was successful or details of the error if\n * the operation failed.\n */\n async tryShareWithMany(\n patient: models.Patient,\n delegates: {\n [delegateIds: string]: {\n shareSecretIds: string[]\n requestedPermissions?: RequestedPermissionEnum\n shareEncryptionKey?: ShareMetadataBehaviour // Defaults to ShareMetadataBehaviour.IF_AVAILABLE\n }\n }\n ): Promise<ShareResult<models.Patient>> {\n const self = await this.dataOwnerApi.getCurrentDataOwnerId()\n // All entities should have an encryption key.\n const entityWithEncryptionKey = await this.crypto.xapi.ensureEncryptionKeysInitialised(patient, EntityWithDelegationTypeName.Patient)\n const updatedEntity = entityWithEncryptionKey ? await this.modifyPatientAs(self, entityWithEncryptionKey) : patient\n return this.crypto.xapi\n .simpleShareOrUpdateEncryptedEntityMetadata(\n {\n entity: updatedEntity,\n type: EntityWithDelegationTypeName.Patient,\n },\n Object.fromEntries(\n Object.entries(delegates).map(([delegateId, options]) => [\n delegateId,\n {\n requestedPermissions: options.requestedPermissions,\n shareEncryptionKeys: options.shareEncryptionKey,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: options.shareSecretIds,\n },\n ])\n ),\n (x) => this.bulkSharePatients(x)\n )\n .then((r) => r.mapSuccessAsync((e) => this.decryptAs(self, [e]).then((es) => es[0])))\n }\n\n /**\n * @param patient a patient\n * @return all the decryptable secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.secretIdsOf({ entity: patient, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * @param patient a patient\n * @return the confidential secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptConfidentialSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.getConfidentialSecretIds({ entity: patient, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * @param patient a patient\n * @return the non-confidential secret ids of the patient, retrieved from the encrypted metadata. The result may be used to find entities where the\n * patient is the 'owning entity', or in the {@link shareWith} method in order to share it with other data owners.\n */\n decryptNonConfidentialSecretIdsOf(patient: models.Patient): Promise<string[]> {\n return this.crypto.xapi.getSecretIdsSharedWithParents({ entity: patient, type: EntityWithDelegationTypeName.Patient })\n }\n\n getDataOwnersWithAccessTo(\n entity: models.Patient\n ): Promise<{ permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean }> {\n return this.crypto.delegationsDeAnonymization.getDataOwnersWithAccessTo({ entity, type: EntityWithDelegationTypeName.Patient })\n }\n\n getEncryptionKeysOf(entity: models.Patient): Promise<string[]> {\n return this.crypto.xapi.encryptionKeysOf({ entity, type: EntityWithDelegationTypeName.Patient }, undefined)\n }\n\n /**\n * Merge two patients into one. This method performs the following operations:\n * - The `from` patient will be soft-deleted, and it will point to the `into` patient. Only the `deletionDate` and `mergeToPatientId` fields of the\n * patient will be changed (automatically by this method). Note that the value of {@link from} is only used to verify that the client is aware of\n * the last version of the `from` patient: any changes to its content and/or metadata compared to what is actually stored in the database will be\n * ignored.\n * - The metadata of the `into` patient will be automatically updated to contain also the metadata of the `from` patient and to keep track of the\n * merge:\n * - the `mergedIds` will be updated to contain the `from` patient id\n * - all secret ids of the `from` patient will be added to the `into` patient\n * - all data owners (including anonymous data owners) with access to the `from` patient will have the same access to the merged `into` patient\n * (unless they already had greater access to the `into` patient, in which case they keep the greater access)\n * - The content of the `into` patient will be updated to match the content (name, address, note, ...) of the provided {@link mergedInto} parameter.\n * Note that since the metadata is automatically updated by this method you must not change the metadata of the `mergedInto` patient\n * (`delegations`, mergedInto`, ...): if there is any change between the metadata of the provided `mergedInto` patient and the stored patient this\n * method will fail with an error.\n *\n * In case the revisions of {@link from} and/or {@link mergedInto} does not match the latest revisions for these patients in the database this\n * method will fail without soft-deleting the `from` patient and without updating the `into` patient with the merged content and metadata. You will\n * have to retrieve the updated versions of both patients before retrying the merge.\n *\n * Finally, note that this method only merges existing data, and does not perform any automatic sharing of the data. The secret ids and encryption\n * keys will not be shared with users that had access only to one of the entity, you will have to use the {@link shareWith} method after the merge\n * if you want to do so.\n * For example consider hcps A, B with access to P' and hcps A, C with access to P'', and we merge P'' into P'. After the merge:\n * - A has access to all secret ids of the merged patient and to the encryption key of the merged patient\n * - B has access to the encryption key of the merged patient (since it is the same as in P'), but only to the secret id which was originally from\n * the unmerged P'\n * - C has no access to the encryption key of the merged patient, and has access only to the secret id which was originally from the unmerged P''\n *\n * @param from the original, unmodified `from` patient. Its content will be unchanged and its metadata will be automatically updated by this method\n * to reflect the merge.\n * @param mergedInto the `into` patient with updated content result of the merge with the `from` patient, as specified by your application logic.\n * The metadata of the `mergedInto` patient must not differ from the metadata of the stored version of the patient, since it will be automatically\n * updated by the method.\n * @return the updated `into` patient.\n */\n async mergePatients(from: Patient, mergedInto: Patient): Promise<Patient> {\n const encryptedMerged = (await this.encryptAs(await this.dataOwnerApi.getCurrentDataOwnerId(), [mergedInto]))[0]\n const merged = await super.baseMergePatients(from.id!, from.rev!, encryptedMerged)\n return (await this.tryDecryptOrReturnOriginal([merged]))[0].entity\n }\n\n async subscribeToPatientEvents(\n eventTypes: ('CREATE' | 'UPDATE' | 'DELETE')[],\n filter: AbstractFilter<Patient> | undefined,\n eventFired: (patient: Patient) => Promise<void>,\n options: SubscriptionOptions = {}\n ): Promise<Connection> {\n const currentUser = await this.userApi.getCurrentUser()\n return subscribeToEntityEvents(\n this.host,\n this.authApi,\n EntityWithDelegationTypeName.Patient,\n eventTypes,\n filter,\n eventFired,\n options,\n async (encrypted) => (await this.decrypt(currentUser, [encrypted]))[0]\n ).then((rs) => new ConnectionImpl(rs))\n }\n\n createDelegationDeAnonymizationMetadata(entity: Patient, delegates: string[]): Promise<void> {\n return this.crypto.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo({ entity, type: EntityWithDelegationTypeName.Patient }, delegates)\n }\n\n /**\n * Initializes the exchange data towards a newly invited patient. This allows the doctor to share data with the\n * patient even if the patient has not yet initialized a keypair for himself.\n *\n * This method should be used only if the patient has not yet initialized a keypair for himself. If the patient has\n * already initialized a keypair this method does nothing and returns false. In this case the exchange data will be\n * automatically created the first time you share data with the patient, and your implementation of the crypto\n * strategies will be used to validate the public keys of the patient.\n *\n * Once exchange data is initialized you can use the {@link IccRecoveryXApi.createExchangeDataRecoveryInfo} to\n * generate a key that the patient will be able to use on his first login to immediately gain access to the exchange\n * data (through the {@link IccRecoveryXApi.recoverExchangeData} method).\n *\n * @param patientId the id of the newly invited patient.\n * @return true if exchange data was initialized, false if the patient already has a key pair and the exchange data\n * will be initialized in the standard way (automatically on the first time data is shared with the user).\n */\n async forceInitialiseExchangeDataToNewlyInvitedPatient(patientId: string): Promise<boolean> {\n const patient = await super.getPatient(patientId)\n if (this.dataOwnerApi.getHexPublicKeysOf(patient).size) return false\n await this.crypto.exchangeData.getOrCreateEncryptionDataTo(patientId, {\n allowCreationWithoutDelegateKey: true,\n })\n return true\n }\n}\n"]}
|
package/icc-x-api/index.d.ts
CHANGED
|
@@ -351,6 +351,11 @@ export interface EncryptedFieldsConfig {
|
|
|
351
351
|
* @default ['description']
|
|
352
352
|
*/
|
|
353
353
|
readonly topic?: string[];
|
|
354
|
+
/**
|
|
355
|
+
* Fields to encrypt for entities of type {@link Document}
|
|
356
|
+
* @default []
|
|
357
|
+
*/
|
|
358
|
+
readonly document?: string[];
|
|
354
359
|
}
|
|
355
360
|
export declare namespace EncryptedFieldsConfig {
|
|
356
361
|
const Defaults: {
|
|
@@ -362,6 +367,7 @@ export declare namespace EncryptedFieldsConfig {
|
|
|
362
367
|
maintenanceTask: string[];
|
|
363
368
|
patient: string[];
|
|
364
369
|
message: never[];
|
|
370
|
+
document: never[];
|
|
365
371
|
topic: string[];
|
|
366
372
|
};
|
|
367
373
|
}
|
package/icc-x-api/index.js
CHANGED
|
@@ -156,6 +156,7 @@ var EncryptedFieldsConfig;
|
|
|
156
156
|
maintenanceTask: ['properties'],
|
|
157
157
|
patient: ['note', 'notes[].markdown'],
|
|
158
158
|
message: [],
|
|
159
|
+
document: [],
|
|
159
160
|
topic: ['description', 'linkedServices', 'linkedHealthElements'],
|
|
160
161
|
};
|
|
161
162
|
})(EncryptedFieldsConfig || (exports.EncryptedFieldsConfig = EncryptedFieldsConfig = {}));
|
|
@@ -393,8 +394,8 @@ class IcureApiImpl {
|
|
|
393
394
|
return ((_a = this._insuranceApi) !== null && _a !== void 0 ? _a : (this._insuranceApi = new icc_api_1.IccInsuranceApi(this.host, this.cryptoInitInfos.headers, this.groupSpecificAuthenticationProvider, this.fetch)));
|
|
394
395
|
}
|
|
395
396
|
get documentApi() {
|
|
396
|
-
var _a;
|
|
397
|
-
return ((_a = this._documentApi) !== null && _a !== void 0 ? _a : (this._documentApi = new icc_document_x_api_1.IccDocumentXApi(this.host, this.cryptoInitInfos.headers, this.cryptoApi, this.authApi, this.dataOwnerApi, !this.cryptoInitInfos.dataOwnerRequiresAnonymousDelegation, this.groupSpecificAuthenticationProvider, this.fetch)));
|
|
397
|
+
var _a, _b;
|
|
398
|
+
return ((_a = this._documentApi) !== null && _a !== void 0 ? _a : (this._documentApi = new icc_document_x_api_1.IccDocumentXApi(this.host, this.cryptoInitInfos.headers, this.cryptoApi, this.authApi, this.dataOwnerApi, !this.cryptoInitInfos.dataOwnerRequiresAnonymousDelegation, this.groupSpecificAuthenticationProvider, (_b = this.params.encryptedFieldsConfig.document) !== null && _b !== void 0 ? _b : EncryptedFieldsConfig.Defaults.document, this.fetch)));
|
|
398
399
|
}
|
|
399
400
|
get healthcareElementApi() {
|
|
400
401
|
var _a, _b;
|