Skip to content

Commit

Permalink
Related Entity Location Sync Strategy.
Browse files Browse the repository at this point in the history
 - User selected sync strategy
 - User selected sync strategy
 fixes opensrp/fhircore#3052
  • Loading branch information
lincmba committed Mar 13, 2024
1 parent f99738e commit 82f6498
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,19 @@ public class Constants {
public static final String PROXY_TO_ENV = "PROXY_TO";
public static final String SYNC_STRATEGY = "syncStrategy";
public static final String TAG_SEARCH_PARAM = "_tag";

public static final String AUTHORIZATION = "Authorization";

public static final String KEYCLOAK_UUID = "keycloak-uuid";
public static final String IDENTIFIER = "identifier";

public static final String PAGINATION_PAGE_SIZE = "_count";

public static final String PAGINATION_PAGE_NUMBER = "_page";

public static final int PAGINATION_DEFAULT_PAGE_SIZE = 20;

public static final int PAGINATION_DEFAULT_PAGE_NUMBER = 1;
public static final String SYNC_LOCATIONS = "_syncLocations";
public static final String RELATED_ENTITY_LOCATION = "RelatedEntityLocation";
public static final String RELATED_ENTITY_TAG_URL_ENV = "RELATED_ENTITY_TAG_URL";
public static final String DEFAULT_RELATED_ENTITY_TAG_URL =
"https://smartregister.org/related-entity-location-tag-id";
public static final String ROLE_ALL_LOCATIONS = "ROLE_ALL_LOCATIONS";

public interface Literals {
String EQUALS = "=";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
package org.smartregister.fhir.gateway.plugins;

import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;

import javax.inject.Named;
Expand Down Expand Up @@ -364,6 +359,7 @@ private static Map<String, List<String>> collateSyncStrategyIds(
List<String> careTeamIds;
List<String> organizationIds;
List<String> locationIds;
List<String> relatedEntityLocationIds;
if (StringUtils.isNotBlank(syncStrategy)) {
if (Constants.CARE_TEAM.equalsIgnoreCase(syncStrategy)) {
careTeams =
Expand Down Expand Up @@ -413,6 +409,18 @@ private static Map<String, List<String>> collateSyncStrategyIds(
: new ArrayList<>();

resultMap = Map.of(syncStrategy, locationIds);
} else if (Constants.RELATED_ENTITY_LOCATION.equalsIgnoreCase(syncStrategy)) {
// assigned locations
relatedEntityLocationIds =
practitionerDetails != null
&& practitionerDetails.getFhirPractitionerDetails()
!= null
? PractitionerDetailsEndpointHelper.getAttributedLocations(
practitionerDetails
.getFhirPractitionerDetails()
.getLocationHierarchyList())
: new ArrayList<>();
resultMap = Map.of(syncStrategy, relatedEntityLocationIds);
}
} else
throw new IllegalStateException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class PractitionerDetailsEndpointHelper {
public static final Bundle EMPTY_BUNDLE = new Bundle();
private final IGenericClient r4FHIRClient;

private final LocationHierarchyEndpointHelper locationHierarchyEndpointHelper;
private static LocationHierarchyEndpointHelper locationHierarchyEndpointHelper;

public PractitionerDetailsEndpointHelper(IGenericClient fhirClient) {
this.r4FHIRClient = fhirClient;
Expand Down Expand Up @@ -546,7 +546,7 @@ private List<OrganizationAffiliation> mapBundleToOrganizationAffiliation(
: Collections.emptyList();
}

private List<LocationHierarchy> getLocationsHierarchy(List<String> locationsIdentifiers) {
static List<LocationHierarchy> getLocationsHierarchy(List<String> locationsIdentifiers) {
List<LocationHierarchy> locationHierarchyList = new ArrayList<>();
LocationHierarchy locationHierarchy;
for (String locationsIdentifier : locationsIdentifiers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public class SyncAccessDecision implements AccessDecision {
private final String syncStrategy;
private final String applicationId;
private final boolean accessGranted;
private final Map<String, List<String>> syncStrategyIds;
private Map<String, List<String>> syncStrategyIds;
private final List<String> roles;
private IgnoredResourcesConfig config;
private final String keycloakUUID;
Expand Down Expand Up @@ -101,8 +101,25 @@ public RequestMutation getRequestMutation(RequestDetailsReader requestDetailsRea
if (isSyncUrl(requestDetailsReader)
&& !shouldSkipDataFiltering(
requestDetailsReader)) { // Check if it is the Sync URL and Skip app-wide

// accessible resource requests
if (syncStrategyIds.isEmpty()
if (Constants.RELATED_ENTITY_LOCATION.equalsIgnoreCase(syncStrategy)) {
Map<String, String[]> parameters =
new HashMap<>(requestDetailsReader.getParameters());
String[] syncLocations = parameters.get(Constants.SYNC_LOCATIONS);
List<String> relatedEntityLocationIds;
if (roles.contains(Constants.ROLE_ALL_LOCATIONS) && syncLocations != null) {
// selected locations

List<String> locationUuids = Arrays.asList(syncLocations[0].split(","));
relatedEntityLocationIds =
PractitionerDetailsEndpointHelper.getAttributedLocations(
PractitionerDetailsEndpointHelper.getLocationsHierarchy(
locationUuids));
this.syncStrategyIds = Map.of(syncStrategy, relatedEntityLocationIds);
}

} else if (syncStrategyIds.isEmpty()
|| StringUtils.isBlank(syncStrategy)
|| (syncStrategyIds.containsKey(syncStrategy)
&& syncStrategyIds.get(syncStrategy).isEmpty())) {
Expand Down Expand Up @@ -372,6 +389,9 @@ private String getSyncTagUrl(String syncStrategy) {
} else if (syncStrategy.equalsIgnoreCase(Constants.CARE_TEAM)) {
return getEnvironmentVar(
Constants.CARE_TEAM_TAG_URL_ENV, Constants.DEFAULT_CARE_TEAM_TAG_URL);
} else if (syncStrategy.equalsIgnoreCase(Constants.RELATED_ENTITY_LOCATION)) {
return getEnvironmentVar(
Constants.RELATED_ENTITY_TAG_URL_ENV, Constants.DEFAULT_RELATED_ENTITY_TAG_URL);
} else {
return null;
}
Expand Down

0 comments on commit 82f6498

Please sign in to comment.