Skip to content

Commit dc67353

Browse files
committed
feat: refactor compliance evaluation classes and update related mappings
1 parent 3b39ba3 commit dc67353

23 files changed

Lines changed: 250 additions & 378 deletions

backend/src/main/java/com/park/utmstack/config/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public final class Constants {
164164
public static final List<String> API_ENDPOINT_IGNORE = Collections.emptyList();
165165

166166
// Application version file
167-
public static final String APP_VERSION_FILE = "/Users/elena/Documents/Work/UTM Stack/version.json"; //TODO: ELENA
167+
public static final String APP_VERSION_FILE = "/updates/version.json";
168168

169169
public static final String ADMIN_EMAIL = "admin@localhost";
170170

backend/src/main/java/com/park/utmstack/repository/compliance/UtmComplianceQueryConfigRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import org.springframework.data.jpa.repository.JpaRepository;
55
import org.springframework.stereotype.Repository;
66

7-
import java.util.List;
8-
97
@Repository
108
public interface UtmComplianceQueryConfigRepository extends JpaRepository<UtmComplianceQueryConfig, Long> {
119

backend/src/main/java/com/park/utmstack/service/compliance/config/UtmComplianceControlConfigQueryService.java renamed to backend/src/main/java/com/park/utmstack/service/compliance/config/UtmComplianceControlConfigCriteriaService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414

1515
@Service
1616
@Transactional(readOnly = true)
17-
public class UtmComplianceControlConfigQueryService extends QueryService<UtmComplianceControlConfig> {
17+
public class UtmComplianceControlConfigCriteriaService extends QueryService<UtmComplianceControlConfig> {
1818

1919
private final UtmComplianceControlConfigRepository complianceControlConfigRepository;
2020
private final UtmComplianceControlConfigMapper mapper;
2121

22-
public UtmComplianceControlConfigQueryService(UtmComplianceControlConfigRepository complianceControlConfigRepository,
23-
UtmComplianceControlConfigMapper mapper) {
22+
public UtmComplianceControlConfigCriteriaService(UtmComplianceControlConfigRepository complianceControlConfigRepository,
23+
UtmComplianceControlConfigMapper mapper) {
2424
this.complianceControlConfigRepository = complianceControlConfigRepository;
2525
this.mapper = mapper;
2626
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com.park.utmstack.service.compliance.config;
2+
3+
import com.park.utmstack.domain.compliance.UtmComplianceQueryConfig;
4+
import com.park.utmstack.repository.compliance.UtmComplianceQueryConfigRepository;
5+
import com.park.utmstack.service.dto.compliance.*;
6+
import com.park.utmstack.service.elasticsearch.ElasticsearchService;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.time.Instant;
10+
import java.time.ZoneOffset;
11+
import java.util.*;
12+
import java.util.function.Function;
13+
import java.util.stream.Collectors;
14+
15+
@Service
16+
public class UtmComplianceControlEvaluationHistoryService {
17+
18+
private final ElasticsearchService elasticsearchService;
19+
private final UtmComplianceQueryConfigRepository queryConfigRepository;
20+
21+
public UtmComplianceControlEvaluationHistoryService(ElasticsearchService elasticsearchService,
22+
UtmComplianceQueryConfigRepository QueryConfigRepository) {
23+
this.elasticsearchService = elasticsearchService;
24+
this.queryConfigRepository = QueryConfigRepository;
25+
}
26+
27+
public List<UtmComplianceControlEvaluationHistoryDto> findByControlId(Long controlId) {
28+
return elasticsearchService.getControlEvaluations(controlId);
29+
}
30+
31+
public UtmComplianceControlEvaluationHistoryResponseDto getEvaluationsWithRange(Long controlId) {
32+
var evaluations = findByControlId(controlId);
33+
34+
if (evaluations.isEmpty()) {
35+
return new UtmComplianceControlEvaluationHistoryResponseDto(null, null, List.of());
36+
}
37+
38+
var queryConfigIds = evaluations.stream()
39+
.flatMap(ev -> ev.getQueryEvaluations().stream())
40+
.map(UtmComplianceQueryEvaluationDto::getQueryConfigId)
41+
.collect(Collectors.toSet());
42+
43+
var configMap = queryConfigRepository.findAllById(queryConfigIds).stream()
44+
.collect(Collectors.toMap(UtmComplianceQueryConfig::getId, Function.identity()));
45+
46+
List<UtmComplianceControlEvaluationGroupedDto> groupedList =
47+
enrichQueries(evaluations, configMap).stream()
48+
.map(evaluation -> {
49+
var grouped = groupByIndexPattern(evaluation);
50+
return buildGroupedDto(evaluation, grouped);
51+
})
52+
.toList();
53+
54+
var timestamps = evaluations.stream()
55+
.map(UtmComplianceControlEvaluationHistoryDto::getTimestamp)
56+
.toList();
57+
58+
return new UtmComplianceControlEvaluationHistoryResponseDto(
59+
timestamps.stream().min(Instant::compareTo)
60+
.get().atZone(ZoneOffset.UTC).toLocalDate(),
61+
timestamps.stream().max(Instant::compareTo)
62+
.get().atZone(ZoneOffset.UTC).toLocalDate(),
63+
groupedList);
64+
}
65+
66+
67+
private List<UtmComplianceControlEvaluationHistoryDto> enrichQueries(
68+
List<UtmComplianceControlEvaluationHistoryDto> evaluations,
69+
Map<Long, UtmComplianceQueryConfig> configMap
70+
) {
71+
evaluations.forEach(controlEval ->
72+
controlEval.getQueryEvaluations().forEach(queryEval -> {
73+
var cfg = configMap.get(queryEval.getQueryConfigId());
74+
if (cfg != null) {
75+
queryEval.setQueryDescription(cfg.getQueryDescription());
76+
queryEval.setEvaluationRule(cfg.getEvaluationRule().name());
77+
queryEval.setIndexPatternId(cfg.getIndexPattern().getId());
78+
queryEval.setIndexPatternName(cfg.getIndexPattern().getPattern());
79+
}
80+
})
81+
);
82+
return evaluations;
83+
}
84+
85+
private List<UtmComplianceIndexPatternQueriesGroupDto> groupByIndexPattern(
86+
UtmComplianceControlEvaluationHistoryDto evaluation
87+
) {
88+
return evaluation.getQueryEvaluations().stream()
89+
.collect(Collectors.groupingBy(UtmComplianceQueryEvaluationDto::getIndexPatternId))
90+
.entrySet().stream()
91+
.map(entry -> {
92+
var first = entry.getValue().get(0);
93+
var dto = new UtmComplianceIndexPatternQueriesGroupDto();
94+
dto.setIndexPatternId(entry.getKey());
95+
dto.setIndexPatternName(first.getIndexPatternName());
96+
dto.setQueries(entry.getValue());
97+
return dto;
98+
})
99+
.toList();
100+
}
101+
102+
private UtmComplianceControlEvaluationGroupedDto buildGroupedDto(
103+
UtmComplianceControlEvaluationHistoryDto evaluation,
104+
List<UtmComplianceIndexPatternQueriesGroupDto> groupedEvaluations
105+
) {
106+
var dto = new UtmComplianceControlEvaluationGroupedDto();
107+
dto.setControlId(evaluation.getControlId());
108+
dto.setControlName(evaluation.getControlName());
109+
dto.setStatus(evaluation.getStatus());
110+
dto.setTimestamp(evaluation.getTimestamp());
111+
dto.setQueryEvaluations(groupedEvaluations);
112+
113+
return dto;
114+
}
115+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.park.utmstack.service.compliance.config;
2+
3+
import com.park.utmstack.service.dto.compliance.UtmComplianceControlConfigDto;
4+
import com.park.utmstack.service.dto.compliance.UtmComplianceControlLatestEvaluationDto;
5+
import com.park.utmstack.service.elasticsearch.ElasticsearchService;
6+
import com.park.utmstack.service.mapper.compliance.UtmComplianceControlLatestEvaluationMapper;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.util.List;
10+
11+
@Service
12+
public class UtmComplianceControlEvaluationLatestService {
13+
14+
private final UtmComplianceControlConfigService configService;
15+
private final ElasticsearchService elasticsearchService;
16+
17+
public UtmComplianceControlEvaluationLatestService(UtmComplianceControlConfigService configService,
18+
ElasticsearchService elasticsearchService) {
19+
this.configService = configService;
20+
this.elasticsearchService = elasticsearchService;
21+
}
22+
23+
public List<UtmComplianceControlLatestEvaluationDto> getControlsWithLastEvaluation(Long sectionId) {
24+
25+
List<UtmComplianceControlConfigDto> controls = configService.getControlsBySection(sectionId);
26+
27+
return controls.stream()
28+
.map(control -> {
29+
var lastEval = this.elasticsearchService.getLatestControlEvaluation(control.getId());
30+
return UtmComplianceControlLatestEvaluationMapper.toDto(control, lastEval);
31+
})
32+
.toList();
33+
}
34+
}
35+
36+

backend/src/main/java/com/park/utmstack/service/compliance/config/UtmComplianceControlEvaluationService.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)