From 184ce8dfee8788e20e2c357e4bf1eaf371a496f6 Mon Sep 17 00:00:00 2001 From: Simona Domnisoru Date: Wed, 3 Jul 2024 09:36:25 +0200 Subject: [PATCH] fix: [DHIS2-17531] use new image endpoint in search tracked entity results (#3673) --- .../TeiSearch/epics/teiSearch.epics.js | 4 +- .../possibleDuplicatesDialog.epics.js | 3 +- .../SearchBox/SearchForm/SearchForm.epics.js | 21 +++++++-- .../TeiSearch/epics/teiSearch.epics.js | 4 +- .../trackedEntityInstances/getSubValues.js | 43 ++++++++++--------- .../trackedEntityInstanceRequests.js | 11 ++++- 6 files changed, 59 insertions(+), 27 deletions(-) diff --git a/src/core_modules/capture-core/components/Pages/common/TEIRelationshipsWidget/TeiSearch/epics/teiSearch.epics.js b/src/core_modules/capture-core/components/Pages/common/TEIRelationshipsWidget/TeiSearch/epics/teiSearch.epics.js index 6c73d6d2ff..325ac72aa6 100644 --- a/src/core_modules/capture-core/components/Pages/common/TEIRelationshipsWidget/TeiSearch/epics/teiSearch.epics.js +++ b/src/core_modules/capture-core/components/Pages/common/TEIRelationshipsWidget/TeiSearch/epics/teiSearch.epics.js @@ -100,7 +100,9 @@ const searchTei = ({ getTrackerProgram(selectedProgramId).attributes : getTrackedEntityType(selectedTrackedEntityTypeId).attributes; - return from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource)).pipe( + return from( + getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource, selectedProgramId), + ).pipe( map(({ trackedEntityInstanceContainers, pagingData }) => searchTeiResultRetrieved( { trackedEntityInstanceContainers, currentPage: pagingData.currentPage }, diff --git a/src/core_modules/capture-core/components/PossibleDuplicatesDialog/possibleDuplicatesDialog.epics.js b/src/core_modules/capture-core/components/PossibleDuplicatesDialog/possibleDuplicatesDialog.epics.js index 06ef99576a..77e4fb872c 100644 --- a/src/core_modules/capture-core/components/PossibleDuplicatesDialog/possibleDuplicatesDialog.epics.js +++ b/src/core_modules/capture-core/components/PossibleDuplicatesDialog/possibleDuplicatesDialog.epics.js @@ -84,9 +84,10 @@ export const loadSearchGroupDuplicatesForReviewEpic = ( ...contextParam, }; const attributes = getAttributesFromScopeId(selectedScopeId); + const programId = scopeType === scopeTypes.TRACKER_PROGRAM ? selectedScopeId : null; const stream$: Stream = from( - getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource), + getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource, programId), ); return stream$.pipe( map(({ trackedEntityInstanceContainers: searchResults, pagingData }) => diff --git a/src/core_modules/capture-core/components/SearchBox/SearchForm/SearchForm.epics.js b/src/core_modules/capture-core/components/SearchBox/SearchForm/SearchForm.epics.js index 9f50c5e821..de084d12d8 100644 --- a/src/core_modules/capture-core/components/SearchBox/SearchForm/SearchForm.epics.js +++ b/src/core_modules/capture-core/components/SearchBox/SearchForm/SearchForm.epics.js @@ -49,7 +49,7 @@ const searchViaUniqueIdStream = ({ absoluteApiPath: string, querySingleResource: QuerySingleResource, }) => - from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource)).pipe( + from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource, programId)).pipe( flatMap(({ trackedEntityInstanceContainers }) => { const searchResults = trackedEntityInstanceContainers; if (searchResults.length > 0) { @@ -92,8 +92,22 @@ const handleErrors = ({ httpStatusCode, message }) => { return of(showErrorViewOnSearchBox()); }; -const searchViaAttributesStream = ({ queryArgs, attributes, triggeredFrom, absoluteApiPath, querySingleResource }) => - from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource)).pipe( +const searchViaAttributesStream = ({ + queryArgs, + attributes, + triggeredFrom, + absoluteApiPath, + querySingleResource, + programId, +}: { + queryArgs: any, + attributes: any, + triggeredFrom: string, + absoluteApiPath: string, + querySingleResource: QuerySingleResource, + programId?: string, +}) => + from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource, programId)).pipe( map(({ trackedEntityInstanceContainers: searchResults, pagingData }) => { if (searchResults.length > 0) { return showSuccessResultsViewOnSearchBox( @@ -204,6 +218,7 @@ export const searchViaAttributesOnScopeProgramEpic = ( triggeredFrom, absoluteApiPath, querySingleResource, + programId, }); }), ); diff --git a/src/core_modules/capture-core/components/TeiSearch/epics/teiSearch.epics.js b/src/core_modules/capture-core/components/TeiSearch/epics/teiSearch.epics.js index c0b3e7321c..876c62bd5d 100644 --- a/src/core_modules/capture-core/components/TeiSearch/epics/teiSearch.epics.js +++ b/src/core_modules/capture-core/components/TeiSearch/epics/teiSearch.epics.js @@ -100,7 +100,9 @@ const searchTei = ({ getTrackerProgram(selectedProgramId).attributes : getTrackedEntityType(selectedTrackedEntityTypeId).attributes; - return from(getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource)).pipe( + return from( + getTrackedEntityInstances(queryArgs, attributes, absoluteApiPath, querySingleResource, selectedProgramId), + ).pipe( map(({ trackedEntityInstanceContainers, pagingData }) => searchTeiResultRetrieved( { trackedEntityInstanceContainers, currentPage: pagingData.currentPage }, diff --git a/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js b/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js index 59642140a0..3b6f08c12c 100644 --- a/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js +++ b/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js @@ -1,38 +1,38 @@ // @flow -import log from 'loglevel'; import isDefined from 'd2-utilizr/lib/isDefined'; -import { errorCreator } from 'capture-core-utils'; +import { featureAvailable, FEATURES } from 'capture-core-utils'; import { type DataElement, dataElementTypes } from '../metaData'; import type { QuerySingleResource } from '../utils/api/api.types'; -const GET_SUBVALUE_ERROR = 'Could not get subvalue'; - const subValueGetterByElementType = { [dataElementTypes.IMAGE]: ({ - value, teiId, attributeId, absoluteApiPath, - querySingleResource, + programId, }: { - value: any, teiId: string, attributeId: string, absoluteApiPath: string, - querySingleResource: QuerySingleResource, - }) => - querySingleResource({ resource: `fileResources/${value}` }) - .then(res => - ({ - name: res.name, - value: res.id, - url: `${absoluteApiPath}/trackedEntityInstances/${teiId}/${attributeId}/image`, - })) - .catch((error) => { - log.warn(errorCreator(GET_SUBVALUE_ERROR)({ value, teiId, attributeId, error })); - return null; - }) }; + programId: ?string, + }) => { + const buildUrl = () => { + if (featureAvailable(FEATURES.trackerImageEndpoint)) { + if (programId) { + return `${absoluteApiPath}/tracker/trackedEntities/${teiId}/attributes/${attributeId}/image?program=${programId}&dimension=small`; + } + return `${absoluteApiPath}/tracker/trackedEntities/${teiId}/attributes/${attributeId}/image?dimension=small`; + } + return `${absoluteApiPath}/trackedEntityInstances/${teiId}/${attributeId}/image`; + }; + const previewUrl = buildUrl(); + return { + previewUrl, + url: previewUrl, + }; + }, +}; export async function getSubValues({ teiId, @@ -40,12 +40,14 @@ export async function getSubValues({ values, absoluteApiPath, querySingleResource, + programId, }: { teiId: string, attributes: Array, values?: ?Object, absoluteApiPath: string, querySingleResource: QuerySingleResource, + programId: ?string, }) { if (!values) { return null; @@ -67,6 +69,7 @@ export async function getSubValues({ attributeId, absoluteApiPath, querySingleResource, + programId, }); accValues[attributeId] = subValue; } diff --git a/src/core_modules/capture-core/trackedEntityInstances/trackedEntityInstanceRequests.js b/src/core_modules/capture-core/trackedEntityInstances/trackedEntityInstanceRequests.js index 01920797e7..6ce155b755 100644 --- a/src/core_modules/capture-core/trackedEntityInstances/trackedEntityInstanceRequests.js +++ b/src/core_modules/capture-core/trackedEntityInstances/trackedEntityInstanceRequests.js @@ -34,6 +34,7 @@ async function convertToClientTei( attributes: Array, absoluteApiPath: string, querySingleResource: QuerySingleResource, + programId: ?string, ) { const attributeValuesById = getValuesById(apiTei.attributes); const convertedAttributeValues = convertDataElementsValues(attributeValuesById, attributes, convertValue); @@ -44,6 +45,7 @@ async function convertToClientTei( values: convertedAttributeValues, absoluteApiPath, querySingleResource, + programId, }); return { @@ -63,6 +65,7 @@ export async function getTrackedEntityInstances( attributes: Array, absoluteApiPath: string, querySingleResource: QuerySingleResource, + selectedProgramId: ?string, ): TrackedEntityInstancesPromise { const apiResponse = await querySingleResource({ resource: 'tracker/trackedEntities', @@ -72,7 +75,13 @@ export async function getTrackedEntityInstances( const trackedEntityInstanceContainers = await apiTrackedEntities.reduce(async (accTeiPromise, apiTei) => { const accTeis = await accTeiPromise; - const teiContainer = await convertToClientTei(apiTei, attributes, absoluteApiPath, querySingleResource); + const teiContainer = await convertToClientTei( + apiTei, + attributes, + absoluteApiPath, + querySingleResource, + selectedProgramId, + ); if (teiContainer) { accTeis.push(teiContainer); }