Skip to content
Open
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 @@ -11,6 +11,7 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.gridsuite.monitor.server.dto.processconfig.MetadataInfos;
import org.gridsuite.monitor.server.dto.processconfig.PersistedProcessConfig;
import org.gridsuite.monitor.commons.types.processconfig.ProcessConfig;
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;
Expand Down Expand Up @@ -67,6 +68,15 @@ public ResponseEntity<PersistedProcessConfig> getProcessConfig(
return processConfig.map(config -> ResponseEntity.ok().body(config)).orElseGet(() -> ResponseEntity.notFound().build());
}

@GetMapping(value = "/metadata", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Get process configs metadata")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "process configs metadata were returned")})
public ResponseEntity<List<MetadataInfos>> getProcessConfigsMetadata(@RequestParam("ids") List<UUID> processConfigIds) {
List<MetadataInfos> processConfigs = processConfigService.getProcessConfigsMetadata(processConfigIds);
return ResponseEntity.ok().body(processConfigs);
}

@PutMapping(value = "/{uuid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Update process config")
@ApiResponses(value = {
Expand All @@ -80,6 +90,19 @@ public ResponseEntity<Void> updateProcessConfig(
ResponseEntity.notFound().build();
}

@PostMapping(value = "/duplication", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Duplicate a process config")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "process config was duplicated"),
@ApiResponse(responseCode = "404", description = "process config to duplicate was not found")})
public ResponseEntity<UUID> duplicateProcessConfig(
@Parameter(description = "UUID of the process config to duplicate") @RequestParam("duplicateFrom") UUID sourceProcessConfigUuid) {
Optional<UUID> newProcessConfigUuid = processConfigService.duplicateProcessConfig(sourceProcessConfigUuid);
return newProcessConfigUuid
.map(configUuid -> ResponseEntity.ok().body(configUuid))
.orElseGet(() -> ResponseEntity.notFound().build());
}

@DeleteMapping(value = "/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Delete process config")
@ApiResponses(value = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2026, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.monitor.server.dto.processconfig;

import org.gridsuite.monitor.commons.types.processexecution.ProcessType;

import java.util.UUID;

/**
* @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>}
*/
public record MetadataInfos(
UUID id,
ProcessType type
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.gridsuite.monitor.commons.types.processconfig.ProcessConfig;
import org.gridsuite.monitor.commons.types.processconfig.SecurityAnalysisConfig;
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;
import org.gridsuite.monitor.server.dto.processconfig.MetadataInfos;
import org.gridsuite.monitor.server.dto.processconfig.ProcessConfigComparison;
import org.gridsuite.monitor.server.dto.processconfig.ProcessConfigFieldComparison;
import org.gridsuite.monitor.server.dto.processconfig.PersistedProcessConfig;
Expand Down Expand Up @@ -36,6 +37,10 @@ public ProcessConfigService(ProcessConfigRepository processConfigRepository, Sec

@Transactional
public UUID createProcessConfig(ProcessConfig processConfig) {
return doCreateProcessConfig(processConfig);
}

private UUID doCreateProcessConfig(ProcessConfig processConfig) {
switch (processConfig) {
case SecurityAnalysisConfig sac -> {
return processConfigRepository.save(securityAnalysisConfigMapper.toEntity(sac)).getId();
Expand All @@ -49,6 +54,13 @@ public Optional<PersistedProcessConfig> getProcessConfig(UUID processConfigUuid)
return processConfigRepository.findById(processConfigUuid).map(this::toPersistedProcessConfig);
}

@Transactional(readOnly = true)
public List<MetadataInfos> getProcessConfigsMetadata(List<UUID> processConfigUuids) {
return processConfigRepository.findAllById(processConfigUuids).stream()
.map(entity -> new MetadataInfos(entity.getId(), entity.getProcessType()))
.toList();
}

@Transactional
public boolean updateProcessConfig(UUID processConfigUuid, ProcessConfig processConfig) {
return processConfigRepository.findById(processConfigUuid)
Expand All @@ -66,6 +78,12 @@ public boolean updateProcessConfig(UUID processConfigUuid, ProcessConfig process
.orElse(false);
}

@Transactional
public Optional<UUID> duplicateProcessConfig(UUID sourceProcessConfigUuid) {
return processConfigRepository.findById(sourceProcessConfigUuid)
.map(sourceEntity -> doCreateProcessConfig(toProcessConfig(sourceEntity)));
}

@Transactional
public boolean deleteProcessConfig(UUID processConfigUuid) {
if (processConfigRepository.existsById(processConfigUuid)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.gridsuite.monitor.server.controllers;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.gridsuite.monitor.server.dto.processconfig.MetadataInfos;
import org.gridsuite.monitor.server.dto.processconfig.PersistedProcessConfig;
import org.gridsuite.monitor.commons.types.processconfig.ProcessConfig;
import org.gridsuite.monitor.commons.types.processconfig.SecurityAnalysisConfig;
Expand Down Expand Up @@ -110,6 +111,28 @@ void getSecurityAnalysisConfigNotFound() throws Exception {
verify(processConfigService).getProcessConfig(any(UUID.class));
}

@Test
void getSecurityAnalysisConfigsMetadata() throws Exception {
UUID processConfigId1 = UUID.randomUUID();
UUID processConfigId2 = UUID.randomUUID();

List<MetadataInfos> expectedMetadata = List.of(
new MetadataInfos(processConfigId1, ProcessType.SECURITY_ANALYSIS),
new MetadataInfos(processConfigId2, ProcessType.SECURITY_ANALYSIS)
);

when(processConfigService.getProcessConfigsMetadata(List.of(processConfigId1, processConfigId2)))
.thenReturn(expectedMetadata);

mockMvc.perform(get("/v1/process-configs/metadata")
.param("ids", processConfigId1.toString(), processConfigId2.toString()))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(content().json(objectMapper.writeValueAsString(expectedMetadata)));

verify(processConfigService).getProcessConfigsMetadata(List.of(processConfigId1, processConfigId2));
}

@Test
void updateSecurityAnalysisConfig() throws Exception {
UUID processConfigId = UUID.randomUUID();
Expand Down Expand Up @@ -150,6 +173,35 @@ void updateSecurityAnalysisConfigNotFound() throws Exception {
verify(processConfigService).updateProcessConfig(any(UUID.class), any(ProcessConfig.class));
}

@Test
void duplicateProcessConfig() throws Exception {
UUID processConfigId = UUID.randomUUID();
UUID newProcessConfigId = UUID.randomUUID();

when(processConfigService.duplicateProcessConfig(processConfigId))
.thenReturn(Optional.of(newProcessConfigId));

mockMvc.perform(post("/v1/process-configs/duplication?duplicateFrom={uuid}", processConfigId))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$").value(newProcessConfigId.toString()));

verify(processConfigService).duplicateProcessConfig(processConfigId);
}

@Test
void duplicateProcessConfigNotFound() throws Exception {
UUID processConfigId = UUID.randomUUID();

when(processConfigService.duplicateProcessConfig(processConfigId))
.thenReturn(Optional.empty());

mockMvc.perform(post("/v1/process-configs/duplication?duplicateFrom={uuid}", processConfigId))
.andExpect(status().isNotFound());

verify(processConfigService).duplicateProcessConfig(processConfigId);
}

@Test
void deleteSecurityAnalysisConfig() throws Exception {
UUID processConfigId = UUID.randomUUID();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.gridsuite.monitor.server.services.processconfig;

import org.gridsuite.monitor.server.dto.processconfig.MetadataInfos;
import org.gridsuite.monitor.server.dto.processconfig.PersistedProcessConfig;
import org.gridsuite.monitor.commons.types.processconfig.SecurityAnalysisConfig;
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;
Expand Down Expand Up @@ -104,6 +105,28 @@
assertThat(processConfig).isEmpty();
}

@Test
void getProcessConfigsMetadata() {
UUID processConfigId1 = UUID.randomUUID();
UUID processConfigId2 = UUID.randomUUID();

SecurityAnalysisConfigEntity entity1 = securityAnalysisConfigMapper.toEntity(securityAnalysisConfig);
entity1.setId(processConfigId1);
SecurityAnalysisConfigEntity entity2 = securityAnalysisConfigMapper.toEntity(securityAnalysisConfig);
entity2.setId(processConfigId2);

when(processConfigRepository.findAllById(List.of(processConfigId1, processConfigId2)))
.thenReturn(List.of(entity1, entity2));

List<MetadataInfos> metadataInfos = processConfigService.getProcessConfigsMetadata(List.of(processConfigId1, processConfigId2));

verify(processConfigRepository).findAllById(List.of(processConfigId1, processConfigId2));
assertThat(metadataInfos).isEqualTo(List.of(
new MetadataInfos(processConfigId1, ProcessType.SECURITY_ANALYSIS),
new MetadataInfos(processConfigId2, ProcessType.SECURITY_ANALYSIS)
));
}

@Test
void updateSecurityAnalysisConfig() {
UUID processConfigId = UUID.randomUUID();
Expand Down Expand Up @@ -144,6 +167,41 @@
verify(processConfigRepository).findById(processConfigId);
}

@Test
void duplicateSecurityAnalysisConfig() {
UUID processConfigId = UUID.randomUUID();
UUID expectedNewProcessConfigId = UUID.randomUUID();

when(processConfigRepository.findById(processConfigId))
.thenReturn(Optional.of(mock(SecurityAnalysisConfigEntity.class)));
when(processConfigRepository.save(any(SecurityAnalysisConfigEntity.class)))
.thenAnswer(invocation -> {
SecurityAnalysisConfigEntity entity = invocation.getArgument(0);
entity.setId(expectedNewProcessConfigId);
return entity;
});

Optional<UUID> newProcessConfigId = processConfigService.duplicateProcessConfig(processConfigId);

assertThat(newProcessConfigId).isPresent();
assertThat(newProcessConfigId.get()).isEqualTo(expectedNewProcessConfigId);

Check warning on line 187 in monitor-server/src/test/java/org/gridsuite/monitor/server/services/processconfig/ProcessConfigServiceTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use assertThat(actual).contains(expected) instead.

See more on https://sonarcloud.io/project/issues?id=org.gridsuite%3Amonitor-core&issues=AZ0Lmpn5J3eRK4OmZ2zT&open=AZ0Lmpn5J3eRK4OmZ2zT&pullRequest=74

verify(processConfigRepository).findById(processConfigId);
ArgumentCaptor<SecurityAnalysisConfigEntity> captor = ArgumentCaptor.forClass(SecurityAnalysisConfigEntity.class);
verify(processConfigRepository).save(captor.capture());
}

@Test
void duplicateSecurityAnalysisConfigNotFound() {
UUID processConfigId = UUID.randomUUID();

when(processConfigRepository.findById(processConfigId)).thenReturn(Optional.empty());

Optional<UUID> newProcessConfigId = processConfigService.duplicateProcessConfig(processConfigId);
assertThat(newProcessConfigId).isEmpty();
verify(processConfigRepository).findById(processConfigId);
}

@Test
void deleteSecurityAnalysisConfig() {
UUID processConfigId = UUID.randomUUID();
Expand Down
Loading