Skip to content

Commit c2b364f

Browse files
committed
Merge branch '8.0.3' into 9.0
# Conflicts: # avni-server-api/src/main/java/org/avni/server/service/SubjectTypeService.java # avni-server-api/src/main/java/org/avni/server/web/SubjectTypeController.java
2 parents 9c8f5e7 + 520d02f commit c2b364f

File tree

16 files changed

+139
-57
lines changed

16 files changed

+139
-57
lines changed

avni-server-api/src/main/java/org/avni/server/dao/AddressLevelTypeRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.avni.server.dao;
22

33
import org.avni.server.domain.AddressLevelType;
4+
import org.avni.server.domain.AddressLevelTypes;
45
import org.springframework.data.jpa.repository.Query;
56
import org.springframework.data.repository.query.Param;
67
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@@ -36,4 +37,8 @@ public interface AddressLevelTypeRepository extends ReferenceDataRepository<Addr
3637
AddressLevelType findByParent(AddressLevelType parent);
3738

3839
List<AddressLevelType> findByIsVoidedFalseAndNameIgnoreCaseContains(String name);
40+
41+
default AddressLevelTypes getAllAddressLevelTypes() {
42+
return new AddressLevelTypes(this.findAllByIsVoidedFalse());
43+
}
3944
}

avni-server-api/src/main/java/org/avni/server/domain/AddressLevelType.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,12 @@ public Boolean isVoidable() {
8989
public interface AddressLevelTypeProjection extends BaseProjection {
9090
String getName();
9191
}
92+
93+
@Override
94+
public String toString() {
95+
return "{" +
96+
"name='" + name + '\'' +
97+
", level=" + level +
98+
'}';
99+
}
92100
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.avni.server.domain;
2+
3+
import java.util.*;
4+
5+
public class AddressLevelTypes extends ArrayList<AddressLevelType> {
6+
public AddressLevelTypes(AddressLevelType ... addressLevelTypes) {
7+
super(Arrays.asList(addressLevelTypes));
8+
}
9+
10+
public AddressLevelTypes(List<AddressLevelType> addressLevelTypes) {
11+
super(addressLevelTypes);
12+
}
13+
14+
public AddressLevelTypes getLowToHigh() {
15+
AddressLevelTypes temp = new AddressLevelTypes(this);
16+
temp.sort(Comparator.comparingDouble(AddressLevelType::getLevel));
17+
return temp;
18+
}
19+
20+
public AddressLevelTypes getHighToLow() {
21+
AddressLevelTypes temp = this.getLowToHigh();
22+
Collections.reverse(temp);
23+
return temp;
24+
}
25+
}

avni-server-api/src/main/java/org/avni/server/domain/OrganisationConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33

44
import com.fasterxml.jackson.annotation.JsonIgnore;
5+
import com.fasterxml.jackson.core.type.TypeReference;
6+
import org.avni.server.application.KeyType;
57
import org.avni.server.application.OrganisationConfigSettingKey;
68
import org.avni.server.domain.framework.BaseJsonObject;
9+
import org.avni.server.util.ObjectMapperSingleton;
10+
import org.avni.server.web.request.webapp.SubjectTypeSetting;
711
import org.hibernate.annotations.BatchSize;
812
import org.hibernate.annotations.Type;
913

@@ -71,6 +75,15 @@ public Boolean isFeatureEnabled(String feature) {
7175
return (Boolean) getSettings().getOrDefault(feature, false);
7276
}
7377

78+
@JsonIgnore
79+
public List<SubjectTypeSetting> getCustomRegistrationLocations() {
80+
return ObjectMapperSingleton.getObjectMapper().convertValue(this.getSettings().getOrDefault(KeyType.customRegistrationLocations.toString(), Collections.EMPTY_LIST), new TypeReference<List<SubjectTypeSetting>>() {});
81+
}
82+
83+
public SubjectTypeSetting getRegistrationSetting(SubjectType subjectType) {
84+
return this.getCustomRegistrationLocations().stream().filter(subjectTypeSetting -> subjectTypeSetting.getSubjectTypeUUID().equals(subjectType.getUuid())).findFirst().orElse(null);
85+
}
86+
7487
public class Settings {
7588
private final JsonObject settings;
7689

avni-server-api/src/main/java/org/avni/server/domain/SubjectType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ public List<GroupRoleContract> getGroupRolesContract() {
197197
.collect(Collectors.toList());
198198
}
199199

200+
// Used from projections
200201
@JsonIgnore
201202
public List<String> getMemberSubjectUUIDs() {
202203
return isGroup() ? groupRoles.stream()

avni-server-api/src/main/java/org/avni/server/importer/batch/csv/BatchConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public Step importStep(FlatFileItemReader<Row> csvFileItemReader,
8888
.writer(csvFileItemWriter)
8989
.faultTolerant()
9090
.skip(Exception.class)
91+
.skip(RuntimeException.class)
9192
.noSkip(FileNotFoundException.class)
9293
.noSkip(FlatFileParseException.class)
9394
.noSkip(FlatFileFormatException.class)

avni-server-api/src/main/java/org/avni/server/importer/batch/csv/creator/AddressLevelCreator.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.avni.server.dao.LocationRepository;
44
import org.avni.server.domain.AddressLevel;
55
import org.avni.server.domain.AddressLevelType;
6+
import org.avni.server.domain.AddressLevelTypes;
67
import org.avni.server.importer.batch.model.Row;
78
import org.springframework.beans.factory.annotation.Autowired;
89
import org.springframework.data.domain.PageRequest;
@@ -13,49 +14,48 @@
1314

1415
@Service
1516
public class AddressLevelCreator {
16-
17-
private LocationRepository locationRepository;
17+
private final LocationRepository locationRepository;
1818

1919
@Autowired
2020
public AddressLevelCreator(LocationRepository locationRepository) {
2121
this.locationRepository = locationRepository;
2222
}
2323

2424
public AddressLevel findAddressLevel(Row row,
25-
List<AddressLevelType> locationTypes) throws Exception {
26-
AddressLevelType lowestAddressLevelType = locationTypes.get(locationTypes.size() - 1);
27-
28-
String lowestInputAddressLevel = row.get(lowestAddressLevelType.getName());
29-
if (lowestInputAddressLevel == null) {
30-
throw new Exception(String.format("Missing '%s'", lowestAddressLevelType.getName()));
31-
}
32-
33-
List<AddressLevel> matchingAddressLevels = locationRepository.findByTitleAndType(lowestInputAddressLevel, lowestAddressLevelType, PageRequest.of(0, 2));
25+
AddressLevelTypes addressLevelTypes) throws Exception {
26+
AddressLevelTypes orderedLocationTypes = addressLevelTypes.getLowToHigh();
27+
AddressLevelType firstMatch = orderedLocationTypes.stream().filter(addressLevelType -> row.get(addressLevelType.getName()) != null)
28+
.findFirst()
29+
.orElseThrow(() -> new RuntimeException("No matching location types found. If subject type has registration locations then only those will be used for matching."));
30+
31+
String title = row.get(firstMatch.getName());
32+
List<AddressLevel> matchingAddressLevels = locationRepository.findByTitleAndType(title, firstMatch, PageRequest.of(0, 2));
3433
switch (matchingAddressLevels.size()) {
3534
case 0:
36-
throw new Exception(("Address not found: " + lowestInputAddressLevel));
35+
throw new RuntimeException(("Address not found: " + title));
3736
case 1:
3837
return matchingAddressLevels.get(0);
3938
default:
40-
return getAddressLevelByLineage(row, locationTypes);
39+
return getAddressLevelByLineage(row, addressLevelTypes);
4140
}
4241
}
4342

4443
private AddressLevel getAddressLevelByLineage(Row row,
45-
List<AddressLevelType> locationTypes) throws Exception {
44+
AddressLevelTypes locationTypes) {
45+
AddressLevelTypes highToLow = locationTypes.getHighToLow();
4646
List<String> inputLocations = new ArrayList<>();
47-
for (AddressLevelType addressLevelType : locationTypes) {
47+
for (AddressLevelType addressLevelType : highToLow) {
4848
String _location = row.get(addressLevelType.getName());
4949
if (_location != null)
5050
inputLocations.add(_location);
5151
}
5252

53-
if (inputLocations.size() == 0)
54-
throw new Exception("Invalid address");
53+
if (inputLocations.isEmpty())
54+
throw new RuntimeException("No locations matching their location types found.");
5555

5656
String lineage = String.join(", ", inputLocations);
5757

5858
return locationRepository.findByTitleLineageIgnoreCase(lineage)
59-
.orElseThrow(() -> new Exception("'Address' not found: " + lineage));
59+
.orElseThrow(() -> new RuntimeException("'Address' not found: " + lineage));
6060
}
6161
}

avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/EntityWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.avni.server.service.OrganisationConfigService;
77

88
public abstract class EntityWriter {
9-
private final OrganisationConfigService organisationConfigService;
9+
protected final OrganisationConfigService organisationConfigService;
1010

1111
protected EntityWriter(OrganisationConfigService organisationConfigService) {
1212
this.organisationConfigService = organisationConfigService;

avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/SubjectWriter.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@
2424

2525
import java.io.Serializable;
2626
import java.util.ArrayList;
27-
import java.util.Comparator;
2827
import java.util.List;
2928

3029

3130
@Component
3231
public class SubjectWriter extends EntityWriter implements ItemWriter<Row>, Serializable {
33-
private final AddressLevelTypeRepository addressLevelTypeRepository;
34-
private final LocationRepository locationRepository;
3532
private final IndividualRepository individualRepository;
3633
private final GenderRepository genderRepository;
3734
private final SubjectTypeCreator subjectTypeCreator;
@@ -45,8 +42,9 @@ public class SubjectWriter extends EntityWriter implements ItemWriter<Row>, Seri
4542
private final IndividualService individualService;
4643
private final S3Service s3Service;
4744
private final EntityApprovalStatusWriter entityApprovalStatusWriter;
48-
private AddressLevelCreator addressLevelCreator;
45+
private final AddressLevelCreator addressLevelCreator;
4946
private final SubjectMigrationService subjectMigrationService;
47+
private final SubjectTypeService subjectTypeService;
5048

5149
private static final Logger logger = LoggerFactory.getLogger(SubjectWriter.class);
5250

@@ -64,10 +62,8 @@ public SubjectWriter(AddressLevelTypeRepository addressLevelTypeRepository,
6462
ObservationCreator observationCreator, IndividualService individualService, EntityApprovalStatusWriter entityApprovalStatusWriter,
6563
S3Service s3Service,
6664
OrganisationConfigService organisationConfigService,
67-
AddressLevelCreator addressLevelCreator, SubjectMigrationService subjectMigrationService) {
65+
AddressLevelCreator addressLevelCreator, SubjectMigrationService subjectMigrationService, SubjectTypeService subjectTypeService) {
6866
super(organisationConfigService);
69-
this.addressLevelTypeRepository = addressLevelTypeRepository;
70-
this.locationRepository = locationRepository;
7167
this.individualRepository = individualRepository;
7268
this.genderRepository = genderRepository;
7369
this.subjectTypeCreator = subjectTypeCreator;
@@ -81,6 +77,7 @@ public SubjectWriter(AddressLevelTypeRepository addressLevelTypeRepository,
8177
this.entityApprovalStatusWriter = entityApprovalStatusWriter;
8278
this.addressLevelCreator = addressLevelCreator;
8379
this.subjectMigrationService = subjectMigrationService;
80+
this.subjectTypeService = subjectTypeService;
8481
this.locationCreator = new LocationCreator();
8582
this.s3Service = s3Service;
8683
}
@@ -92,9 +89,6 @@ public void write(List<? extends Row> rows) throws Exception {
9289

9390
private void write(Row row) throws Exception {
9491
try {
95-
List<AddressLevelType> locationTypes = addressLevelTypeRepository.findAllByIsVoidedFalse();
96-
locationTypes.sort(Comparator.comparingDouble(AddressLevelType::getLevel).reversed());
97-
9892
Individual individual = getOrCreateIndividual(row);
9993
AddressLevel oldAddressLevel = individual.getAddressLevel();
10094
ObservationCollection oldObservations = individual.getObservations();
@@ -111,7 +105,10 @@ private void write(Row row) throws Exception {
111105
individual.setDateOfBirthVerified(row.getBool(SubjectHeaders.dobVerified));
112106
setRegistrationDate(individual, row, allErrorMsgs);
113107
individual.setRegistrationLocation(locationCreator.getLocation(row, SubjectHeaders.registrationLocation, allErrorMsgs));
114-
individual.setAddressLevel(addressLevelCreator.findAddressLevel(row, locationTypes));
108+
109+
AddressLevelTypes registrationLocationTypes = subjectTypeService.getRegistrableLocationTypes(subjectType);
110+
individual.setAddressLevel(addressLevelCreator.findAddressLevel(row, registrationLocationTypes));
111+
115112
if (individual.getSubjectType().getType().equals(Subject.Person)) setGender(individual, row);
116113
FormMapping formMapping = formMappingRepository.getRegistrationFormMapping(subjectType);
117114
individual.setVoided(false);

avni-server-api/src/main/java/org/avni/server/service/OrganisationConfigService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,13 @@ public OrganisationConfig updateOrganisationConfig(OrganisationConfigRequest req
195195
}
196196

197197
public Object getSettingsByKey(String key) {
198+
OrganisationConfig currentOrganisationConfig = this.getCurrentOrganisationConfig();
199+
return currentOrganisationConfig.getSettings().getOrDefault(key, Collections.EMPTY_LIST);
200+
}
201+
202+
public OrganisationConfig getCurrentOrganisationConfig() {
198203
Long organisationId = UserContextHolder.getUserContext().getOrganisationId();
199-
OrganisationConfig organisationConfig = organisationConfigRepository.findByOrganisationId(organisationId);
200-
return organisationConfig.getSettings().getOrDefault(key, Collections.EMPTY_LIST);
204+
return organisationConfigRepository.findByOrganisationId(organisationId);
201205
}
202206

203207
public void saveCustomRegistrationLocations(List<String> locationTypeUUIDs, SubjectType subjectType) {

0 commit comments

Comments
 (0)