Skip to content

Commit 40927f4

Browse files
authored
Refactor duplication endpoint (#548)
* Refactor duplication endpoint --------- Signed-off-by: TOURI ANIS <[email protected]>
1 parent 7d07a9c commit 40927f4

File tree

9 files changed

+46
-47
lines changed

9 files changed

+46
-47
lines changed

src/main/java/org/gridsuite/study/server/StudyConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ private StudyConstants() {
7171
public static final String HEADER_USER_ID = "userId";
7272
public static final String QUERY_PARAM_ONLY_STASHED = "onlyStashed";
7373
public static final String QUERY_PARAM_STASHED = "stashed";
74+
public static final String PATH_PARAM_PARAMETERS = "parameters";
7475

7576
public enum SldDisplayMode {
7677
FEEDER_POSITION,

src/main/java/org/gridsuite/study/server/StudyController.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,16 +158,15 @@ public ResponseEntity<BasicStudyInfos> createStudy(@PathVariable("caseUuid") UUI
158158
return ResponseEntity.ok().body(createStudy);
159159
}
160160

161-
@PostMapping(value = "/studies")
161+
@PostMapping(value = "/studies", params = "duplicateFrom")
162162
@Operation(summary = "create a study from an existing one")
163163
@ApiResponses(value = {
164164
@ApiResponse(responseCode = "200", description = "The study was successfully created"),
165165
@ApiResponse(responseCode = "404", description = "The source study doesn't exist")})
166-
public ResponseEntity<BasicStudyInfos> duplicateStudy(@RequestParam("duplicateFrom") UUID sourceStudyUuid,
167-
@RequestParam(required = false, value = "studyUuid") UUID studyUuid,
166+
public ResponseEntity<UUID> duplicateStudy(@RequestParam("duplicateFrom") UUID studyId,
168167
@RequestHeader(HEADER_USER_ID) String userId) {
169-
BasicStudyInfos createStudy = studyService.duplicateStudy(sourceStudyUuid, studyUuid, userId);
170-
return createStudy != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(createStudy) :
168+
UUID newStudyId = studyService.duplicateStudy(studyId, userId);
169+
return newStudyId != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(newStudyId) :
171170
ResponseEntity.notFound().build();
172171
}
173172

src/main/java/org/gridsuite/study/server/service/LoadFlowService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,8 @@ public UUID duplicateLoadFlowParameters(UUID sourceParametersUuid) {
282282
Objects.requireNonNull(sourceParametersUuid);
283283

284284
var path = UriComponentsBuilder
285-
.fromPath(DELIMITER + LOADFLOW_API_VERSION + PARAMETERS_URI)
285+
.fromPath(DELIMITER + LOADFLOW_API_VERSION + DELIMITER + PATH_PARAM_PARAMETERS)
286+
.queryParam("duplicateFrom", sourceParametersUuid)
286287
.buildAndExpand(sourceParametersUuid).toUriString();
287288

288289
try {

src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,9 @@ public void updateSecurityAnalysisParameters(UUID parametersUuid, String paramet
281281
public UUID duplicateSecurityAnalysisParameters(UUID sourceParametersUuid) {
282282
Objects.requireNonNull(sourceParametersUuid);
283283

284-
var path = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + "/parameters/{sourceParametersUuid}")
285-
.buildAndExpand(sourceParametersUuid).toUriString();
284+
var path = UriComponentsBuilder.fromPath(DELIMITER + SECURITY_ANALYSIS_API_VERSION + DELIMITER + PATH_PARAM_PARAMETERS)
285+
.queryParam("duplicateFrom", sourceParametersUuid)
286+
.buildAndExpand().toUriString();
286287

287288
HttpHeaders headers = new HttpHeaders();
288289
headers.setContentType(MediaType.APPLICATION_JSON);

src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,9 @@ public UUID duplicateSensitivityAnalysisParameters(UUID sourceParametersUuid) {
332332
Objects.requireNonNull(sourceParametersUuid);
333333

334334
var path = UriComponentsBuilder
335-
.fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + PARAMETERS_URI)
336-
.buildAndExpand(sourceParametersUuid)
335+
.fromPath(DELIMITER + SENSITIVITY_ANALYSIS_API_VERSION + DELIMITER + PATH_PARAM_PARAMETERS)
336+
.queryParam("duplicateFrom", sourceParametersUuid)
337+
.buildAndExpand()
337338
.toUriString();
338339

339340
try {

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,18 +309,18 @@ private void recreateStudyRootNetwork(UUID caseUuid, String userId, UUID studyUu
309309
persistentStoreWithNotificationOnError(caseUuid, studyUuid, userId, importReportUuid, caseFormat, importParametersToUse);
310310
}
311311

312-
public BasicStudyInfos duplicateStudy(UUID sourceStudyUuid, UUID studyUuid, String userId) {
312+
public UUID duplicateStudy(UUID sourceStudyUuid, String userId) {
313313
Objects.requireNonNull(sourceStudyUuid);
314314

315315
StudyEntity sourceStudy = studyRepository.findById(sourceStudyUuid).orElse(null);
316316
if (sourceStudy == null) {
317317
return null;
318318
}
319-
BasicStudyInfos basicStudyInfos = StudyService.toBasicStudyInfos(insertStudyCreationRequest(userId, studyUuid));
319+
BasicStudyInfos basicStudyInfos = StudyService.toBasicStudyInfos(insertStudyCreationRequest(userId, null));
320320

321321
studyServerExecutionService.runAsync(() -> self.duplicateStudyAsync(basicStudyInfos, sourceStudyUuid, userId));
322322

323-
return basicStudyInfos;
323+
return basicStudyInfos.getId();
324324
}
325325

326326
@Transactional

src/main/java/org/gridsuite/study/server/service/VoltageInitService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ public UUID duplicateVoltageInitParameters(UUID sourceParametersUuid) {
190190

191191
Objects.requireNonNull(sourceParametersUuid);
192192

193-
var path = UriComponentsBuilder
194-
.fromPath(DELIMITER + VOLTAGE_INIT_API_VERSION + "/parameters")
193+
String path = UriComponentsBuilder
194+
.fromPath(DELIMITER + VOLTAGE_INIT_API_VERSION + DELIMITER + PATH_PARAM_PARAMETERS)
195195
.queryParam("duplicateFrom", sourceParametersUuid)
196196
.buildAndExpand()
197197
.toUriString();

src/test/java/org/gridsuite/study/server/LoadFlowTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,10 @@ public MockResponse dispatch(RecordedRequest request) {
311311
} else if (path.matches("/v1/users/" + INVALID_PARAMS_IN_PROFILE_USER_ID + "/profile")) {
312312
return new MockResponse().setResponseCode(200).setBody(USER_PROFILE_INVALID_PARAMS_JSON)
313313
.addHeader("Content-Type", "application/json; charset=utf-8");
314-
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
314+
} else if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
315315
// params duplication request KO
316316
return new MockResponse().setResponseCode(404);
317-
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
317+
} else if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING) && method.equals("POST")) {
318318
// params duplication request OK
319319
return new MockResponse().setResponseCode(200).setBody(DUPLICATED_PARAMS_JSON)
320320
.addHeader("Content-Type", "application/json; charset=utf-8");
@@ -656,7 +656,7 @@ public void testResetLoadFlowParametersUserHasInvalidParamsInProfile() throws Ex
656656
var requests = TestUtils.getRequestsDone(3, server);
657657
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + INVALID_PARAMS_IN_PROFILE_USER_ID + "/profile")));
658658
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + LOADFLOW_PARAMETERS_UUID_STRING))); // update existing with dft
659-
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING))); // post duplicate ko
659+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters?duplicateFrom=" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING))); // post duplicate ko
660660
}
661661

662662
@Test
@@ -668,7 +668,7 @@ public void testResetLoadFlowParametersUserHasValidParamsInProfile() throws Exce
668668
var requests = TestUtils.getRequestsDone(3, server);
669669
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + VALID_PARAMS_IN_PROFILE_USER_ID + "/profile")));
670670
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + LOADFLOW_PARAMETERS_UUID_STRING))); // delete existing
671-
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING))); // post duplicate ok
671+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters?duplicateFrom=" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING))); // post duplicate ok
672672
}
673673

674674
@Test

src/test/java/org/gridsuite/study/server/StudyTest.java

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -473,19 +473,17 @@ public MockResponse dispatch(RecordedRequest request) {
473473
} else if (path.matches("/v1/networks\\?caseUuid=" + CLONED_CASE_UUID_STRING + "&variantId=" + FIRST_VARIANT_ID + "&reportUuid=.*&receiver=.*")) {
474474
sendCaseImportSucceededMessage(path, NETWORK_INFOS, "UCTE");
475475
return new MockResponse().setResponseCode(200);
476-
} else if (path.matches("/v1/parameters\\?duplicateFrom=.*") && POST.equals(request.getMethod())) {
477-
return new MockResponse().setResponseCode(200).addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).setBody(mapper.writeValueAsString(UUID.randomUUID()));
478-
} else if (path.matches("/v1/parameters/default") && POST.equals(request.getMethod())) {
479-
return new MockResponse().setResponseCode(200).addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).setBody(mapper.writeValueAsString(UUID.randomUUID()));
480-
} else if (path.matches("/v1/parameters/.*") && POST.equals(request.getMethod())) {
481-
if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING)) {
476+
} else if (path.matches("/v1/parameters.*") && POST.equals(request.getMethod())) {
477+
if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_INVALID_PARAMETERS_UUID_STRING)) {
482478
return new MockResponse().setResponseCode(404); // params duplication request KO
483-
} else if (path.matches("/v1/parameters/" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING)) {
479+
} else if (path.matches("/v1/parameters\\?duplicateFrom=" + PROFILE_LOADFLOW_VALID_PARAMETERS_UUID_STRING)) {
484480
return new MockResponse().setResponseCode(200).setBody(DUPLICATED_PARAMS_JSON) // params duplication request OK
485481
.addHeader("Content-Type", "application/json; charset=utf-8");
486482
} else {
487483
return new MockResponse().setResponseCode(200).addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).setBody(mapper.writeValueAsString(UUID.randomUUID()));
488484
}
485+
} else if (path.matches("/v1/parameters/default") && POST.equals(request.getMethod())) {
486+
return new MockResponse().setResponseCode(200).addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).setBody(mapper.writeValueAsString(UUID.randomUUID()));
489487
} else if (path.matches("/v1/parameters/.*") && DELETE.equals(request.getMethod())) {
490488
return new MockResponse().setResponseCode(200);
491489
} else if (path.matches("/v1/parameters/.*/provider")) {
@@ -1053,7 +1051,7 @@ private UUID createStudy(String userId, UUID caseUuid, String parameterDuplicate
10531051
assertTrue(requests.contains(String.format("/v1/cases/%s/disableExpiration", caseUuid)));
10541052
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/users/" + userId + "/profile")));
10551053
if (parameterDuplicatedUuid != null) {
1056-
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters/" + parameterDuplicatedUuid))); // post duplicate
1054+
assertTrue(requests.stream().anyMatch(r -> r.equals("/v1/parameters?duplicateFrom=" + parameterDuplicatedUuid))); // post duplicate
10571055
}
10581056

10591057
return studyUuid;
@@ -1101,7 +1099,7 @@ private UUID createStudyWithDuplicateCase(String userId, UUID caseUuid) throws E
11011099
// assert that all http requests have been sent to remote services
11021100
var requests = TestUtils.getRequestsDone(8, server);
11031101
assertTrue(requests.contains(String.format("/v1/cases/%s/exists", caseUuid)));
1104-
assertTrue(requests.contains(String.format("/v1/cases?duplicateFrom=%s&withExpiration=true", caseUuid)));
1102+
assertTrue(requests.contains(String.format("/v1/cases?duplicateFrom=%s&withExpiration=%s", caseUuid, true)));
11051103
// note : it's a new case UUID
11061104
assertTrue(requests.stream().anyMatch(r -> r.matches("/v1/networks\\?caseUuid=" + CLONED_CASE_UUID_STRING + "&variantId=" + FIRST_VARIANT_ID + "&reportUuid=.*&receiver=.*")));
11071105
assertTrue(requests.contains(String.format("/v1/cases/%s/disableExpiration", CLONED_CASE_UUID_STRING)));
@@ -1458,7 +1456,7 @@ private void testDuplicateStudy(UUID study1Uuid) throws Exception {
14581456
assertNotEquals(study1Uuid, duplicatedStudy.getId());
14591457

14601458
//Test duplication from a non existing source study
1461-
mockMvc.perform(post(STUDIES_URL + "?duplicateFrom={sourceStudyUuid}&studyUuid={studyUuid}", UUID.randomUUID(), DUPLICATED_STUDY_UUID)
1459+
mockMvc.perform(post(STUDIES_URL + "?duplicateFrom={studyUuid}", UUID.randomUUID())
14621460
.header(USER_ID_HEADER, "userId"))
14631461
.andExpect(status().isNotFound());
14641462
}
@@ -1496,46 +1494,44 @@ public void testDuplicateStudyWithErrorDuringCaseDuplication() throws Exception
14961494
throw new RuntimeException();
14971495
}).when(caseService).duplicateCase(any(), any());
14981496

1499-
mockMvc.perform(post(STUDIES_URL)
1500-
.param("duplicateFrom", studyUuid.toString())
1501-
.param("studyUuid", DUPLICATED_STUDY_UUID)
1497+
String response = mockMvc.perform(post(STUDIES_URL + "?duplicateFrom={studyUuid}", studyUuid)
15021498
.param(CASE_FORMAT, "XIIDM")
15031499
.header(USER_ID_HEADER, "userId"))
1504-
.andExpect(status().isOk());
1500+
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
15051501

1502+
ObjectMapper mapper = new ObjectMapper();
1503+
String duplicatedStudyUuid = mapper.readValue(response, String.class);
15061504
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15071505

1508-
assertNull(studyRepository.findById(UUID.fromString(DUPLICATED_STUDY_UUID)).orElse(null));
1506+
assertNull(studyRepository.findById(UUID.fromString(duplicatedStudyUuid)).orElse(null));
15091507
}
15101508

15111509
private StudyEntity duplicateStudy(UUID studyUuid, String userId, String caseFormat) throws Exception {
15121510
UUID stubUuid = wireMockUtils.stubDuplicateModificationGroup();
1513-
mockMvc.perform(post(STUDIES_URL)
1514-
.param("duplicateFrom", studyUuid.toString())
1515-
.param("studyUuid", DUPLICATED_STUDY_UUID)
1516-
.param(CASE_FORMAT, caseFormat)
1511+
String response = mockMvc.perform(post(STUDIES_URL + "?duplicateFrom={studyUuid}", studyUuid)
15171512
.header(USER_ID_HEADER, "userId"))
1518-
.andExpect(status().isOk());
1519-
1513+
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
1514+
ObjectMapper mapper = new ObjectMapper();
1515+
String newUuid = mapper.readValue(response, String.class);
15201516
StudyEntity sourceStudy = studyRepository.findById(studyUuid).orElseThrow();
15211517
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15221518
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15231519
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15241520
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15251521
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15261522
Message<byte[]> indexationStatusMessageOnGoing = output.receive(TIMEOUT, studyUpdateDestination);
1527-
assertEquals(DUPLICATED_STUDY_UUID, indexationStatusMessageOnGoing.getHeaders().get(NotificationService.HEADER_STUDY_UUID).toString());
1523+
assertEquals(newUuid, indexationStatusMessageOnGoing.getHeaders().get(NotificationService.HEADER_STUDY_UUID).toString());
15281524
assertEquals(NotificationService.UPDATE_TYPE_INDEXATION_STATUS, indexationStatusMessageOnGoing.getHeaders().get(HEADER_UPDATE_TYPE));
15291525
assertEquals(StudyIndexationStatus.INDEXING_ONGOING.name(), indexationStatusMessageOnGoing.getHeaders().get(NotificationService.HEADER_INDEXATION_STATUS));
15301526
Message<byte[]> indexationStatusMessageDone = output.receive(TIMEOUT, studyUpdateDestination);
1531-
assertEquals(DUPLICATED_STUDY_UUID, indexationStatusMessageDone.getHeaders().get(NotificationService.HEADER_STUDY_UUID).toString());
1527+
assertEquals(newUuid, indexationStatusMessageDone.getHeaders().get(NotificationService.HEADER_STUDY_UUID).toString());
15321528
assertEquals(NotificationService.UPDATE_TYPE_INDEXATION_STATUS, indexationStatusMessageDone.getHeaders().get(HEADER_UPDATE_TYPE));
15331529
assertEquals(StudyIndexationStatus.INDEXED.name(), indexationStatusMessageDone.getHeaders().get(NotificationService.HEADER_INDEXATION_STATUS));
15341530
assertNotNull(output.receive(TIMEOUT, studyUpdateDestination));
15351531

1536-
StudyEntity duplicatedStudy = studyRepository.findById(UUID.fromString(DUPLICATED_STUDY_UUID)).orElse(null);
1532+
StudyEntity duplicatedStudy = studyRepository.findById(UUID.fromString(newUuid)).orElse(null);
15371533
assertNotNull(duplicatedStudy);
1538-
RootNode duplicatedRootNode = networkModificationTreeService.getStudyTree(UUID.fromString(DUPLICATED_STUDY_UUID));
1534+
RootNode duplicatedRootNode = networkModificationTreeService.getStudyTree(UUID.fromString(newUuid));
15391535
assertNotNull(duplicatedRootNode);
15401536

15411537
//Check tree node has been duplicated
@@ -1589,13 +1585,13 @@ private StudyEntity duplicateStudy(UUID studyUuid, String userId, String caseFor
15891585
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters\\?duplicateFrom=" + sourceStudy.getVoltageInitParametersUuid())).count());
15901586
}
15911587
if (sourceStudy.getLoadFlowParametersUuid() != null) {
1592-
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters/" + sourceStudy.getLoadFlowParametersUuid())).count());
1588+
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters\\?duplicateFrom=" + sourceStudy.getLoadFlowParametersUuid())).count());
15931589
}
15941590
if (sourceStudy.getSecurityAnalysisParametersUuid() != null) {
1595-
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters/" + sourceStudy.getSecurityAnalysisParametersUuid())).count());
1591+
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters\\?duplicateFrom=" + sourceStudy.getSecurityAnalysisParametersUuid())).count());
15961592
}
15971593
if (sourceStudy.getSensitivityAnalysisParametersUuid() != null) {
1598-
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters/" + sourceStudy.getSensitivityAnalysisParametersUuid())).count());
1594+
assertEquals(1, requests.stream().filter(r -> r.getPath().matches("/v1/parameters\\?duplicateFrom=" + sourceStudy.getSensitivityAnalysisParametersUuid())).count());
15991595
}
16001596
return duplicatedStudy;
16011597
}

0 commit comments

Comments
 (0)