Skip to content

Commit 6dda78d

Browse files
Merge pull request #13166 from SORMAS-Foundation/change-#13159-automatic-soft-delete-negative-covid-tests-and-samples
Change #13159 automatic soft delete negative covid tests and samples
2 parents 13b5a4b + f22a66b commit 6dda78d

File tree

8 files changed

+330
-1
lines changed

8 files changed

+330
-1
lines changed

sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,6 @@ public interface ConfigFacade {
161161
CaseClassificationCalculationMode getCaseClassificationCalculationMode(Disease disease);
162162

163163
boolean isAnyCaseClassificationCalculationEnabled();
164+
165+
Integer getNegaiveCovidSamplesMaxAgeDays();
164166
}

sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestCriteria.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ public SampleReferenceDto getSample() {
2121
public void setSample(SampleReferenceDto sample) {
2222
this.sample = sample;
2323
}
24+
25+
public PathogenTestCriteria sample(SampleReferenceDto sample) {
26+
this.sample = sample;
27+
return this;
28+
}
2429
}

sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ public class ConfigFacadeEjb implements ConfigFacade {
187187
public static final int DEFAULT_DOCUMENT_UPLOAD_SIZE_LIMIT_MB = 20;
188188
public static final String IMPORT_FILE_SIZE_LIMIT_MB = "importFileSizeLimitMb";
189189
public static final int DEFAULT_IMPOR_FILE_SIZE_LIMIT_MB = 20;
190+
public static final String NEGAIVE_COVID_SAMPLES_MAX_AGE_DAYS = "negaiveCovidSamplesMaxAgeDays";
190191

191192
private final Logger logger = LoggerFactory.getLogger(getClass());
192193

@@ -838,6 +839,11 @@ public void resetRequestContext() {
838839
RequestContextHolder.reset();
839840
}
840841

842+
@Override
843+
public Integer getNegaiveCovidSamplesMaxAgeDays() {
844+
return parseProperty(NEGAIVE_COVID_SAMPLES_MAX_AGE_DAYS, null, Integer::parseInt);
845+
}
846+
841847
@LocalBean
842848
@Stateless
843849
public static class ConfigFacadeEjbLocal extends ConfigFacadeEjb {

sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import de.symeda.sormas.backend.immunization.ImmunizationFacadeEjb;
4949
import de.symeda.sormas.backend.infrastructure.central.CentralInfraSyncFacade;
5050
import de.symeda.sormas.backend.report.WeeklyReportFacadeEjb.WeeklyReportFacadeEjbLocal;
51+
import de.symeda.sormas.backend.sample.SampleService;
5152
import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessFacadeEjb.SpecialCaseAccessFacadeEjbLocal;
5253
import de.symeda.sormas.backend.systemevent.SystemEventFacadeEjb.SystemEventFacadeEjbLocal;
5354
import de.symeda.sormas.backend.task.TaskFacadeEjb.TaskFacadeEjbLocal;
@@ -96,6 +97,8 @@ public class CronService {
9697
private SpecialCaseAccessFacadeEjbLocal specialCaseAccessFacade;
9798
@EJB
9899
private UserFacadeEjbLocal userFacade;
100+
@EJB
101+
private SampleService sampleService;
99102

100103
@Schedule(hour = "*", minute = "*/" + TASK_UPDATE_INTERVAL, second = "0", persistent = false)
101104
public void sendNewAndDueTaskMessages() {
@@ -297,4 +300,9 @@ public void syncUsersFromAuthenticationProvider() {
297300
userFacade.syncUsersFromAuthenticationProvider();
298301
}
299302
}
303+
304+
@Schedule(hour = "2", minute = "40", persistent = false)
305+
public void sofDeleteOldNegativeSamples() {
306+
sampleService.cleanupOldCovidSamples();
307+
}
300308
}

sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ public void setTestTypeText(String testTypeText) {
248248
}
249249

250250
@Temporal(TemporalType.TIMESTAMP)
251-
@Column(nullable = false)
252251
public Date getTestDateTime() {
253252
return testDateTime;
254253
}

sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,23 @@
5656

5757
import org.apache.commons.collections4.CollectionUtils;
5858

59+
import de.symeda.sormas.api.Disease;
5960
import de.symeda.sormas.api.EntityRelevanceStatus;
6061
import de.symeda.sormas.api.RequestContextHolder;
6162
import de.symeda.sormas.api.caze.IsCase;
6263
import de.symeda.sormas.api.common.DeletableEntityType;
6364
import de.symeda.sormas.api.common.DeletionDetails;
65+
import de.symeda.sormas.api.common.DeletionReason;
6466
import de.symeda.sormas.api.common.progress.ProcessedEntity;
6567
import de.symeda.sormas.api.common.progress.ProcessedEntityStatus;
6668
import de.symeda.sormas.api.contact.ContactReferenceDto;
6769
import de.symeda.sormas.api.disease.DiseaseVariant;
6870
import de.symeda.sormas.api.event.EventParticipantReferenceDto;
6971
import de.symeda.sormas.api.feature.FeatureType;
72+
import de.symeda.sormas.api.i18n.I18nProperties;
73+
import de.symeda.sormas.api.i18n.Strings;
7074
import de.symeda.sormas.api.sample.IsSample;
75+
import de.symeda.sormas.api.sample.PathogenTestCriteria;
7176
import de.symeda.sormas.api.sample.PathogenTestResultType;
7277
import de.symeda.sormas.api.sample.PathogenTestType;
7378
import de.symeda.sormas.api.sample.SampleAssociationType;
@@ -87,6 +92,7 @@
8792
import de.symeda.sormas.backend.caze.CaseService;
8893
import de.symeda.sormas.backend.common.AbstractDeletableAdoService;
8994
import de.symeda.sormas.backend.common.AbstractDomainObject;
95+
import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
9096
import de.symeda.sormas.backend.common.CriteriaBuilderHelper;
9197
import de.symeda.sormas.backend.common.DeletableAdo;
9298
import de.symeda.sormas.backend.common.JurisdictionFlagsService;
@@ -145,6 +151,8 @@ public class SampleService extends AbstractDeletableAdoService<Sample>
145151
protected FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
146152
@EJB
147153
private SpecialCaseAccessService specialCaseAccessService;
154+
@EJB
155+
private ConfigFacadeEjbLocal configFacade;
148156

149157
public SampleService() {
150158
super(Sample.class, DeletableEntityType.SAMPLE);
@@ -1276,4 +1284,37 @@ public List<DiseaseVariant> getAssociatedDiseaseVariants(String sampleUuid) {
12761284
cq.select(pathogenTestJoin.get(PathogenTest.TESTED_DISEASE_VARIANT));
12771285
return em.createQuery(cq).getResultList();
12781286
}
1287+
1288+
public void cleanupOldCovidSamples() {
1289+
final Integer maxAgeDays = configFacade.getNegaiveCovidSamplesMaxAgeDays();
1290+
if (maxAgeDays == null) {
1291+
return;
1292+
}
1293+
1294+
CriteriaBuilder cb = em.getCriteriaBuilder();
1295+
CriteriaQuery<PathogenTest> cq = cb.createQuery(PathogenTest.class);
1296+
Root<PathogenTest> from = cq.from(PathogenTest.class);
1297+
1298+
cq.where(
1299+
cb.equal(from.get(PathogenTest.TESTED_DISEASE), Disease.CORONAVIRUS),
1300+
cb.equal(from.get(PathogenTest.TEST_RESULT), PathogenTestResultType.NEGATIVE),
1301+
cb.notEqual(from.get(PathogenTest.DELETED), true),
1302+
cb.lessThan(
1303+
CriteriaBuilderHelper.coalesce(
1304+
cb,
1305+
Date.class,
1306+
from.get(PathogenTest.TEST_DATE_TIME),
1307+
from.get(PathogenTest.REPORT_DATE),
1308+
from.get(PathogenTest.CREATION_DATE)),
1309+
DateHelper.subtractDays(new Date(), maxAgeDays)));
1310+
em.createQuery(cq).getResultList().stream().collect(Collectors.groupingBy(PathogenTest::getSample)).forEach((sample, tests) -> {
1311+
if (pathogenTestService.count(new PathogenTestCriteria().sample(sample.toReference())) == tests.size()) {
1312+
delete(sample, new DeletionDetails(DeletionReason.OTHER_REASON, I18nProperties.getString(Strings.entityAutomaticSoftDeletion)));
1313+
} else {
1314+
tests.forEach(
1315+
p -> pathogenTestService
1316+
.delete(p, new DeletionDetails(DeletionReason.OTHER_REASON, I18nProperties.getString(Strings.entityAutomaticSoftDeletion))));
1317+
}
1318+
});
1319+
}
12791320
}

0 commit comments

Comments
 (0)