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+ }
0 commit comments