Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.park.utmstack.domain.chart_builder.UtmDashboard;
import com.park.utmstack.domain.chart_builder.UtmDashboardVisualization;
import com.park.utmstack.domain.chart_builder.types.query.FilterType;
import com.park.utmstack.domain.compliance.enums.ComplianceStatus;
import com.park.utmstack.domain.compliance.enums.ComplianceType;
import com.park.utmstack.domain.compliance.types.RequestParamFilter;
import com.park.utmstack.domain.shared_types.DataColumn;
Expand Down Expand Up @@ -92,6 +93,10 @@ public class UtmComplianceReportConfig implements Serializable {
@Column(name = "config_report_name", length = 50)
private String configReportName;

@Enumerated(EnumType.STRING)
@Column(name = "config_report_status", length = 25)
private ComplianceStatus configReportStatus;

@Transient
@JsonSerialize
@JsonDeserialize
Expand All @@ -105,6 +110,8 @@ public class UtmComplianceReportConfig implements Serializable {
@JoinColumn(name = "dashboard_id", referencedColumnName = "id", insertable = false, updatable = false)
private UtmDashboard associatedDashboard;



@Transient
@JsonSerialize
@JsonDeserialize
Expand Down Expand Up @@ -336,4 +343,12 @@ public String getConfigRemediation() {
public void setConfigRemediation(String configRemediation) {
this.configRemediation = configRemediation;
}

public ComplianceStatus getConfigReportStatus() {
return configReportStatus;
}

public void setConfigReportStatus(ComplianceStatus complianceStatus) {
this.configReportStatus = complianceStatus;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.park.utmstack.domain.compliance.enums;
public enum ComplianceStatus {
COMPLAINT,
NON_COMPLAINT
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.park.utmstack.repository.compliance;

import com.park.utmstack.domain.compliance.UtmComplianceReportConfig;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
Expand All @@ -16,7 +18,6 @@
/**
* Spring Data repository for the ComplianceTemplate entity.
*/
@SuppressWarnings("unused")
@Repository
public interface UtmComplianceReportConfigRepository extends JpaRepository<UtmComplianceReportConfig, Long>, JpaSpecificationExecutor<UtmComplianceReportConfig> {

Expand All @@ -28,4 +29,19 @@ public interface UtmComplianceReportConfigRepository extends JpaRepository<UtmCo
@Transactional
@Query("delete from UtmComplianceReportConfig r where r.standardSectionId in (select s.id from UtmComplianceStandardSection s where s.standardId = :standardId) and r.id not in :reportIds")
void deleteReportsByStandardIdAndIdNotIn(@Param("standardId") Long standardId, @Param("reportIds") List<Long> reportIds);

@Query(value = "SELECT cfg FROM UtmComplianceReportConfig cfg " +
"JOIN cfg.section sec " +
"LEFT JOIN cfg.associatedDashboard d " +
"WHERE (:standardId IS NULL OR sec.standardId = :standardId) " +
"AND (:solution IS NULL OR lower(cfg.configSolution) LIKE %:solution%) " +
"AND (:sectionId IS NULL OR sec.id = :sectionId) " +
"AND (:search IS NULL OR lower(cfg.configReportName) LIKE %:search% OR d.name LIKE %:search%)")
Page<UtmComplianceReportConfig> getReportsByFilters(
@Param("standardId") Long standardId,
@Param("solution") String solution,
@Param("sectionId") Long sectionId,
@Param("search") String search,
Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
package com.park.utmstack.service.compliance.config;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.park.utmstack.domain.chart_builder.UtmDashboard;
import com.park.utmstack.domain.chart_builder.UtmDashboardVisualization;
import com.park.utmstack.domain.chart_builder.UtmVisualization;
import com.park.utmstack.domain.chart_builder.types.ChartType;
import com.park.utmstack.domain.compliance.UtmComplianceReportConfig;
import com.park.utmstack.domain.compliance.UtmComplianceStandard;
import com.park.utmstack.domain.compliance.UtmComplianceStandardSection;
import com.park.utmstack.domain.compliance.enums.ComplianceStatus;
import com.park.utmstack.repository.compliance.UtmComplianceReportConfigRepository;
import com.park.utmstack.service.chart_builder.UtmDashboardService;
import com.park.utmstack.service.chart_builder.UtmDashboardVisualizationService;
import com.park.utmstack.service.elasticsearch.ElasticsearchService;
import com.park.utmstack.util.UtilPagination;
import com.park.utmstack.util.exceptions.UtmPageNumberNotSupported;
import com.park.utmstack.util.chart_builder.elasticsearch_dsl.requests.RequestDsl;
import com.park.utmstack.util.exceptions.UtmElasticsearchException;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
Expand All @@ -17,6 +27,7 @@
import org.springframework.util.StringUtils;

import javax.persistence.EntityManager;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
Expand All @@ -29,17 +40,24 @@ public class UtmComplianceReportConfigService {
private final UtmDashboardService dashboardService;
private final UtmComplianceStandardService standardService;
private final UtmComplianceStandardSectionService standardSectionService;

private final UtmDashboardVisualizationService dashboardVisualizationService;

private final ElasticsearchService elasticsearchService;
private final EntityManager em;

public UtmComplianceReportConfigService(UtmComplianceReportConfigRepository complianceReportConfigRepository,
UtmDashboardService dashboardService,
UtmComplianceStandardService standardService,
UtmComplianceStandardSectionService standardSectionService,
UtmDashboardVisualizationService dashboardVisualizationService, ElasticsearchService elasticsearchService,
EntityManager em) {
this.complianceReportConfigRepository = complianceReportConfigRepository;
this.dashboardService = dashboardService;
this.standardService = standardService;
this.standardSectionService = standardSectionService;
this.dashboardVisualizationService = dashboardVisualizationService;
this.elasticsearchService = elasticsearchService;
this.em = em;
}

Expand Down Expand Up @@ -81,72 +99,31 @@ public void deleteReportsByStandardIdAndIdNotIn(Long standardId, List<Long> repo
}

public Page<UtmComplianceReportConfig> getReportsByFilters(Long standardId, String solution, Long sectionId,
String search, Pageable pageable) {
StringBuilder script = new StringBuilder(
"SELECT cfg.* FROM utm_compliance_report_config cfg " +
"INNER JOIN utm_compliance_standard_section sec ON cfg.standard_section_id = sec.id " +
"INNER JOIN utm_compliance_standard st ON sec.standard_id = st.id " +
"LEFT JOIN utm_dashboard d ON cfg.dashboard_id = d.id");

StringBuilder countScript = new StringBuilder(
"SELECT COUNT(cfg.id) FROM utm_compliance_report_config cfg " +
"INNER JOIN utm_compliance_standard_section sec ON cfg.standard_section_id = sec.id " +
"INNER JOIN utm_compliance_standard st ON sec.standard_id = st.id " +
"LEFT JOIN utm_dashboard d ON cfg.dashboard_id = d.id");

boolean hasWhere = false;

if (standardId != null) {
hasWhere = true;
script.append(" WHERE st.id = ").append(standardId);
countScript.append(" WHERE st.id = ").append(standardId);
}
String search, Boolean expandDashboard, Boolean setStatus, Pageable pageable) throws UtmElasticsearchException {

if (StringUtils.hasText(solution)) {
String condition = "cfg.config_solution ILIKE '%" + solution + "%'";
script.append(hasWhere ? " AND " : " WHERE ").append(condition);
countScript.append(hasWhere ? " AND " : " WHERE ").append(condition);
hasWhere = true;
}
Page<UtmComplianceReportConfig> page = complianceReportConfigRepository.getReportsByFilters(standardId, solution, sectionId, search, pageable);

if (sectionId != null) {
String condition = "sec.id = " + sectionId;
script.append(hasWhere ? " AND " : " WHERE ").append(condition);
countScript.append(hasWhere ? " AND " : " WHERE ").append(condition);
}

if (StringUtils.hasText(search)) {
String condition = "(cfg.config_report_name ILIKE '%" + search + "%' OR d.name ILIKE '%" + search + "%')";
script.append(hasWhere ? " AND " : " WHERE ").append(condition);
countScript.append(hasWhere ? " AND " : " WHERE ").append(condition);
if (expandDashboard != null && expandDashboard) {
for (UtmComplianceReportConfig report : page) {
dashboardVisualizationService.findAllByIdDashboard(report.getDashboardId()).ifPresent(report::setDashboard);
}
}

if (StringUtils.hasText(solution)) {
pageable.getSort();
String sortField = pageable.getSort().iterator().next().getProperty();
String sortDirection = pageable.getSort().iterator().next().getDirection().name();
script.append(" ORDER BY ").append(sortField).append(" ").append(sortDirection);
if (setStatus) {
for (UtmComplianceReportConfig report : page) {
report.setConfigReportStatus(this.getStatus(report.getAssociatedDashboard()));
}
}

List<UtmComplianceReportConfig> results = em.createNativeQuery(script.toString(), UtmComplianceReportConfig.class)
.setFirstResult(UtilPagination.getFirstForNativeSql(pageable.getPageSize(), pageable.getPageNumber()))
.setMaxResults(pageable.getPageSize())
.getResultList();

long total = ((Number) em.createNativeQuery(countScript.toString()).getSingleResult()).longValue();
return page;

return new PageImpl<>(results, pageable, total);
}


public void deleteAllByConfigSolutionAndSectionIdAndDashboardId(String configSolution, Long sectionId, Long dashboardId) {
complianceReportConfigRepository.deleteAllByConfigSolutionAndStandardSectionIdAndDashboardId(configSolution, sectionId, dashboardId);
}

/**
* @param reports
* @param override
*/
public void importReports(List<UtmComplianceReportConfig> reports, boolean override) throws Exception {
final String ctx = CLASSNAME + ".importReports";
try {
Expand Down Expand Up @@ -200,4 +177,23 @@ public void importReports(List<UtmComplianceReportConfig> reports, boolean overr
throw new Exception(msg);
}
}

private ComplianceStatus getStatus(UtmDashboard dashboard) throws UtmElasticsearchException {
List<UtmDashboardVisualization> dashboardVisualizations = dashboardVisualizationService.findAllByIdDashboard(dashboard.getId())
.orElse(Collections.emptyList());

UtmVisualization visualization = dashboardVisualizations.stream().filter(d -> d.getVisualization().getChartType().equals(ChartType.LIST_CHART)
|| d.getVisualization().getChartType().equals(ChartType.TABLE_CHART))
.map(UtmDashboardVisualization::getVisualization)
.findFirst()
.orElse(null);

if(Objects.nonNull(visualization)){
RequestDsl requestQuery = new RequestDsl(visualization);
SearchResponse<ObjectNode> result = elasticsearchService.search(requestQuery.getSearchSourceBuilderForCount().build(), ObjectNode.class);
return result.hits().total().value() > 0 ? ComplianceStatus.COMPLAINT : ComplianceStatus.NON_COMPLAINT;
} else {
return ComplianceStatus.NON_COMPLAINT;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,27 @@ public SearchRequest.Builder getSearchSourceBuilder() throws UtmElasticsearchExc
}
}

public SearchRequest.Builder getSearchSourceBuilderForCount() throws UtmElasticsearchException {
final String ctx = CLASSNAME + ".getSearchSourceBuilderForCount";
try {
List<FilterType> filters = visualization.getFilterType();

if (CollectionUtils.isEmpty(filters))
filters = new ArrayList<>();

searchRequestBuilder.query(SearchUtil.toQuery(filters));

searchRequestBuilder.size(0); // Esto asegura que no se devuelvan los documentos
searchRequestBuilder.trackTotalHits(TrackHits.of(t -> t.enabled(true)));

return searchRequestBuilder;
} catch (Exception e) {
throw new UtmElasticsearchException(ctx + ": " + e.getMessage());
}
}



/**
* Build an aggregation section for an elasticsearch dsl request
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,17 +173,14 @@ public ResponseEntity<List<UtmComplianceReportConfig>> getReportsByFilters(@Requ
@RequestParam(required = false) String solution,
@RequestParam(required = false) Long sectionId,
@RequestParam(required = false) String search,
@RequestParam(required = false) Boolean expandDashboard,
@RequestParam(required = false, defaultValue = "false") Boolean setStatus,
@RequestParam(required = false, defaultValue = "false") Boolean expandDashboard,
Pageable pageable) {
final String ctx = CLASS_NAME + ".getReportsByFilters";
try {
Page<UtmComplianceReportConfig> page = complianceReportConfigService.getReportsByFilters(standardId, solution, sectionId, search, pageable);
Page<UtmComplianceReportConfig> page = complianceReportConfigService.getReportsByFilters(standardId, solution, sectionId, search, expandDashboard, setStatus, pageable);

if (!Objects.isNull(expandDashboard) && expandDashboard) {
for (UtmComplianceReportConfig report : page)
dashboardVisualizationService.findAllByIdDashboard(report.getDashboardId()).ifPresent(report::setDashboard);
}
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/utm-asset-groups/searchGroupsByFilter");
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/report-config/get-by-filters");
return ResponseEntity.ok().headers(headers).body(page.getContent());
} catch (Exception e) {
String msg = ctx + ": " + e.getMessage();
Expand Down
Loading