Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit b8797c2

Browse files
Merge remote-tracking branch 'origin/feature-4140-fix-automatic-serverfeature-updates' into hotfix-1.54.1
2 parents ad0ca8f + 7ece677 commit b8797c2

2 files changed

Lines changed: 85 additions & 12 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/feature/FeatureConfigurationService.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,9 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From<?,
124124

125125
public void createMissingFeatureConfigurations() {
126126

127-
List<FeatureConfiguration> featureConfigurations = getAll();
128-
Map<FeatureType, FeatureConfiguration> existingListOfConfigurations =
129-
featureConfigurations.stream().collect(Collectors.toMap(FeatureConfiguration::getFeatureType, Function.identity()));
130-
127+
Map<FeatureType, FeatureConfiguration> configs = getServerFeatureConfigurations();
131128
FeatureType.getAllServerFeatures().forEach(featureType -> {
132-
FeatureConfiguration savedConfiguration = existingListOfConfigurations.get(featureType);
129+
FeatureConfiguration savedConfiguration = configs.get(featureType);
133130
if (savedConfiguration == null) {
134131
FeatureConfiguration configuration = FeatureConfiguration.build(featureType, featureType.isEnabledDefault());
135132
ensurePersisted(configuration);
@@ -139,23 +136,31 @@ public void createMissingFeatureConfigurations() {
139136

140137
public void updateFeatureConfigurations() {
141138

142-
List<FeatureConfiguration> featureConfigurations = getAll();
143-
Map<FeatureType, FeatureConfiguration> featureConfigurationMap =
144-
featureConfigurations.stream().collect(Collectors.toMap(FeatureConfiguration::getFeatureType, Function.identity()));
145-
139+
Map<FeatureType, FeatureConfiguration> configs = getServerFeatureConfigurations();
146140
FeatureType.getAllServerFeatures().forEach(featureType -> {
147141
if (featureType.isDependent()) {
148-
boolean hasEnabledDependentFeature = hasEnabledDependentFeature(featureType, featureConfigurationMap);
149-
142+
boolean hasEnabledDependentFeature = hasEnabledDependentFeature(featureType, configs);
150143
if (!hasEnabledDependentFeature) {
151-
FeatureConfiguration configuration = featureConfigurationMap.get(featureType);
144+
FeatureConfiguration configuration = configs.get(featureType);
152145
configuration.setEnabled(false);
153146
ensurePersisted(configuration);
154147
}
155148
}
156149
});
157150
}
158151

152+
private Map<FeatureType, FeatureConfiguration> getServerFeatureConfigurations() {
153+
154+
List<FeatureConfiguration> featureConfigurations = getAll();
155+
Map<FeatureType, FeatureConfiguration> configurationsMap =
156+
featureConfigurations.stream()
157+
.filter(e -> e.getFeatureType().isServerFeature())
158+
// In case a serverFeature happens not to be unique in the database, take the last one
159+
.collect(Collectors.toMap(FeatureConfiguration::getFeatureType, Function.identity(), (e1, e2) -> e2));
160+
161+
return configurationsMap;
162+
}
163+
159164
private boolean hasEnabledDependentFeature(FeatureType featureType, Map<FeatureType, FeatureConfiguration> featureConfigurationMap) {
160165

161166
for (FeatureType dependentFeatureType : featureType.getDependentFeatures()) {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package de.symeda.sormas.backend.feature;
2+
3+
import org.junit.Test;
4+
5+
import de.symeda.sormas.api.Disease;
6+
import de.symeda.sormas.api.feature.FeatureType;
7+
import de.symeda.sormas.backend.AbstractBeanTest;
8+
import de.symeda.sormas.backend.TestDataCreator.RDCF;
9+
import de.symeda.sormas.backend.region.District;
10+
import de.symeda.sormas.backend.region.Region;
11+
12+
public class FeatureConfigurationServiceTest extends AbstractBeanTest {
13+
14+
@Test
15+
public void testCreateMissingFeatureConfigurations() {
16+
17+
createConfigurations();
18+
FeatureConfigurationService featureConfigurationService = getBean(FeatureConfigurationService.class);
19+
featureConfigurationService.createMissingFeatureConfigurations();
20+
}
21+
22+
@Test
23+
public void testUpdateFeatureConfigurations() {
24+
25+
createConfigurations();
26+
FeatureConfigurationService featureConfigurationService = getBean(FeatureConfigurationService.class);
27+
28+
/*
29+
* update relies on that all serverFeature configurations are already present,
30+
* that's why the createMissing needs to be run before.
31+
*/
32+
featureConfigurationService.createMissingFeatureConfigurations();
33+
featureConfigurationService.updateFeatureConfigurations();
34+
}
35+
36+
private void createConfigurations() {
37+
38+
// Some serverFeatures
39+
build(FeatureType.EVENT_SURVEILLANCE);
40+
build(FeatureType.TASK_MANAGEMENT);
41+
42+
// Some features configured on district level
43+
RDCF rdcf = creator.createRDCF();
44+
Region region = getRegionService().getByUuid(rdcf.region.getUuid());
45+
build(FeatureType.LINE_LISTING, null, region, getDistrictService().getByUuid(rdcf.district.getUuid()));
46+
build(FeatureType.LINE_LISTING, null, region, creator.createDistrict("d2", region));
47+
}
48+
49+
private FeatureConfiguration build(FeatureType type) {
50+
51+
return build(type, null, null, null);
52+
}
53+
54+
private FeatureConfiguration build(FeatureType type, Disease disease, Region region, District district) {
55+
56+
FeatureConfigurationService featureConfigurationService = getBean(FeatureConfigurationService.class);
57+
58+
FeatureConfiguration entity = new FeatureConfiguration();
59+
entity.setFeatureType(type);
60+
entity.setEnabled(type.isEnabledDefault());
61+
entity.setDisease(disease);
62+
entity.setRegion(region);
63+
entity.setDistrict(district);
64+
featureConfigurationService.ensurePersisted(entity);
65+
66+
return entity;
67+
}
68+
}

0 commit comments

Comments
 (0)