diff --git a/src/core_modules/capture-core-utils/featuresSupport/support.js b/src/core_modules/capture-core-utils/featuresSupport/support.js index 637439c74b..103df995a5 100644 --- a/src/core_modules/capture-core-utils/featuresSupport/support.js +++ b/src/core_modules/capture-core-utils/featuresSupport/support.js @@ -7,6 +7,7 @@ export const FEATURES = Object.freeze({ exportablePayload: 'exportablePayload', changelogs: 'changelogs', trackerImageEndpoint: 'trackerImageEndpoint', + trackerFileEndpoint: 'trackerFileEndpoint', trackedEntitiesCSV: 'trackedEntitiesCSV', newAocApiSeparator: 'newAocApiSeparator', }); @@ -18,6 +19,7 @@ const MINOR_VERSION_SUPPORT = Object.freeze({ [FEATURES.customIcons]: 41, [FEATURES.exportablePayload]: 41, [FEATURES.trackerImageEndpoint]: 41, + [FEATURES.trackerFileEndpoint]: 41, [FEATURES.newTransferQueryParam]: 41, [FEATURES.changelogs]: 41, [FEATURES.trackedEntitiesCSV]: 40, diff --git a/src/core_modules/capture-core/components/WidgetProfile/hooks/getSubValueForTei.js b/src/core_modules/capture-core/components/WidgetProfile/hooks/getSubValueForTei.js index e1c15c954a..abb5fc55ba 100644 --- a/src/core_modules/capture-core/components/WidgetProfile/hooks/getSubValueForTei.js +++ b/src/core_modules/capture-core/components/WidgetProfile/hooks/getSubValueForTei.js @@ -17,12 +17,19 @@ type SubValueFunctionParams = { minorServerVersion: number, }; -const buildTEAFileUrl = (attribute) => { - const { absoluteApiPath, teiId, id } = attribute; - return `${absoluteApiPath}/trackedEntityInstances/${teiId}/${id}/file`; +const buildTEAFileUrl = (attribute, minorServerVersion) => { + const { absoluteApiPath, teiId, programId, id } = attribute; + + return hasAPISupportForFeature(minorServerVersion, FEATURES.trackerFileEndpoint) + ? `${absoluteApiPath}/tracker/trackedEntities/${teiId}/attributes/${id}/file?program=${programId}` + : `${absoluteApiPath}/trackedEntityInstances/${teiId}/${id}/file`; }; -const getFileResourceSubvalue = async ({ attribute, querySingleResource }: SubValueFunctionParams) => { +const getFileResourceSubvalue = async ({ + attribute, + querySingleResource, + minorServerVersion, +}: SubValueFunctionParams) => { if (!attribute.value) return null; const { id, displayName: name } = await querySingleResource({ resource: 'fileResources', id: attribute.value }); @@ -30,7 +37,7 @@ const getFileResourceSubvalue = async ({ attribute, querySingleResource }: SubVa id, name, value: id, - url: buildTEAFileUrl(attribute), + url: buildTEAFileUrl(attribute, minorServerVersion), }; }; diff --git a/src/core_modules/capture-core/components/WidgetStagesAndEvents/Stages/Stage/getEventDataWithSubValue.js b/src/core_modules/capture-core/components/WidgetStagesAndEvents/Stages/Stage/getEventDataWithSubValue.js index 29919f0fe8..a5493d19fd 100644 --- a/src/core_modules/capture-core/components/WidgetStagesAndEvents/Stages/Stage/getEventDataWithSubValue.js +++ b/src/core_modules/capture-core/components/WidgetStagesAndEvents/Stages/Stage/getEventDataWithSubValue.js @@ -12,7 +12,9 @@ const getFileResourceSubvalue = async (keys: Object, querySingleResource: QueryS return { id, name, - url: `${absoluteApiPath}/events/files?dataElementUid=${key}&eventUid=${eventId}`, + url: featureAvailable(FEATURES.trackerFileEndpoint) + ? `${absoluteApiPath}/tracker/events/${eventId}/dataValues/${key}/file` + : `${absoluteApiPath}/events/files?dataElementUid=${key}&eventUid=${eventId}`, }; } return {}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/utils/getSubValueForDataValue.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/utils/getSubValueForDataValue.js index 8936d423b5..5de5037e21 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/utils/getSubValueForDataValue.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/utils/getSubValueForDataValue.js @@ -18,7 +18,9 @@ const getFileResourceSubvalue = async ({ dataElement, querySingleResource, event return { id, name, - url: `${absoluteApiPath}/events/files?dataElementUid=${dataElement.id}&eventUid=${eventId}`, + url: featureAvailable(FEATURES.trackerFileEndpoint) + ? `${absoluteApiPath}/tracker/events/${eventId}/dataValues/${dataElement.id}/file` + : `${absoluteApiPath}/events/files?dataElementUid=${dataElement.id}&eventUid=${eventId}`, }; }; diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/epics/teiViewEpics/helpers/getListDataCommon/buildUrlByElementType.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/epics/teiViewEpics/helpers/getListDataCommon/buildUrlByElementType.js index 696f12c20b..a901059530 100644 --- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/epics/teiViewEpics/helpers/getListDataCommon/buildUrlByElementType.js +++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/epics/teiViewEpics/helpers/getListDataCommon/buildUrlByElementType.js @@ -5,9 +5,19 @@ import { dataElementTypes } from '../../../../../../../metaData'; const buildTEAUrlByElementType: {| [string]: Function, |} = { - [dataElementTypes.FILE_RESOURCE]: ({ trackedEntity, id }: { trackedEntity: string, id: string }) => ({ - fileUrl: `/trackedEntityInstances/${trackedEntity}/${id}/file`, - }), + [dataElementTypes.FILE_RESOURCE]: ({ + trackedEntity, + id, + programId, + }: { + trackedEntity: string, + id: string, + programId: string, + }) => + (featureAvailable(FEATURES.trackerFileEndpoint) + ? { fileUrl: `/tracker/trackedEntities/${trackedEntity}/attributes/${id}/file?program=${programId}` } + : { fileUrl: `/trackedEntityInstances/${trackedEntity}/${id}/file` } + ), [dataElementTypes.IMAGE]: ({ trackedEntity, id, @@ -31,9 +41,11 @@ const buildTEAUrlByElementType: {| const buildDataElementUrlByElementType: {| [string]: Function, |} = { - [dataElementTypes.FILE_RESOURCE]: ({ event, id }: { event: string, id: string }) => ({ - fileUrl: `/events/files?dataElementUid=${id}&eventUid=${event}`, - }), + [dataElementTypes.FILE_RESOURCE]: ({ event, id }: { event: string, id: string }) => + (featureAvailable(FEATURES.trackerFileEndpoint) + ? { fileUrl: `/tracker/events/${event}/dataValues/${id}/file` } + : { fileUrl: `/events/files?dataElementUid=${id}&eventUid=${event}` } + ), [dataElementTypes.IMAGE]: ({ event, id }: { event: string, id: string }) => (featureAvailable(FEATURES.trackerImageEndpoint) ? { diff --git a/src/core_modules/capture-core/events/getSubValues.js b/src/core_modules/capture-core/events/getSubValues.js index 005dbc4d9d..19b36daf2a 100644 --- a/src/core_modules/capture-core/events/getSubValues.js +++ b/src/core_modules/capture-core/events/getSubValues.js @@ -28,7 +28,9 @@ const subValueGetterByElementType = { ({ name: res.name, value: res.id, - url: `${absoluteApiPath}/events/files?dataElementUid=${metaElementId}&eventUid=${eventId}`, + url: featureAvailable(FEATURES.trackerFileEndpoint) + ? `${absoluteApiPath}/tracker/events/${eventId}/dataValues/${metaElementId}/file` + : `${absoluteApiPath}/events/files?dataElementUid=${metaElementId}&eventUid=${eventId}`, })) .catch((error) => { log.warn(errorCreator(GET_SUBVALUE_ERROR)({ value, eventId, metaElementId, error })); diff --git a/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js b/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js index 53da2bfa6b..5485e957e3 100644 --- a/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js +++ b/src/core_modules/capture-core/trackedEntityInstances/getSubValues.js @@ -33,18 +33,27 @@ const subValueGetterByElementType = { attributeId, absoluteApiPath, querySingleResource, + programId, }: { value: string, teiId: string, attributeId: string, absoluteApiPath: string, querySingleResource: QuerySingleResource, + programId: ?string, }) => querySingleResource({ resource: `fileResources/${value}` }) - .then(res => ({ - name: res.name, - url: `${absoluteApiPath}/trackedEntityInstances/${teiId}/${attributeId}/file`, - })) + .then((res) => { + const fileUrl = featureAvailable(FEATURES.trackerFileEndpoint) + ? `${absoluteApiPath}/tracker/trackedEntities/${teiId}/attributes/${attributeId}/file` + : `${absoluteApiPath}/trackedEntityInstances/${teiId}/${attributeId}/file`; + const url = programId ? `${fileUrl}?program=${programId}` : fileUrl; + + return { + name: res.name, + url, + }; + }) .catch((error) => { log.warn(errorCreator('Could not get subvalue')({ value, teiId, attributeId, error })); return null;