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 @@ -147,7 +147,17 @@ public CompletableFuture<ResponseEntity<NetworkModificationsResult>> handleNetwo
public ResponseEntity<Void> deleteModificationGroup(@Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid,
@Parameter(description = "Return 404 if group is not found") @RequestParam(name = "errorOnGroupNotFound", required = false,
defaultValue = "true") Boolean errorOnGroupNotFound) {
networkModificationService.deleteModificationGroup(groupUuid, errorOnGroupNotFound);
networkModificationService.deleteModificationGroups(List.of(groupUuid), errorOnGroupNotFound);
return ResponseEntity.ok().build();
}

@DeleteMapping(value = "/groups")
@Operation(summary = "Delete the modifications group")
@ApiResponse(responseCode = "200", description = "Modifications group deleted")
public ResponseEntity<Void> deleteModificationGroups(@Parameter(description = "Return 404 if group is not found") @RequestParam(name = "errorOnGroupNotFound", required = false,
defaultValue = "true") Boolean errorOnGroupNotFound,
@Parameter(description = "Group UUIDs") @RequestBody List<UUID> groupUuids) {
networkModificationService.deleteModificationGroups(groupUuids, errorOnGroupNotFound);
return ResponseEntity.ok().build();
}

Expand Down Expand Up @@ -318,6 +328,17 @@ public ResponseEntity<Void> updateNetworkModificationMetadata(
return ResponseEntity.ok().build();
}

@DeleteMapping(value = "/groups/stashed-modifications")
@Operation(summary = "Delete all the stashed modifications in all specified groups")
@ApiResponse(responseCode = "200", description = "All stashed modifications in all the groups are deleted")
public ResponseEntity<Void> deleteStashedModificationInAllGroups(
@Parameter(description = "Return 404 if group is not found") @RequestParam(name = "errorOnGroupNotFound", required = false,
defaultValue = "true") Boolean errorOnGroupNotFound,
@Parameter(description = "Group UUIDs") @RequestBody List<UUID> groupUuids) {
networkModificationService.deleteStashedModificationInAllGroups(groupUuids, errorOnGroupNotFound);
return ResponseEntity.ok().build();
}

@PutMapping(value = "/network-modifications/root-network-applicability")
@Operation(summary = "Updates the applicability of network modifications for a root network tag")
@ApiResponse(responseCode = "200", description = "The applicability of the network modifications has been successfully updated")
Expand Down Expand Up @@ -356,7 +377,7 @@ public ResponseEntity<Void> deleteRootNetworkTags(
public ResponseEntity<Void> deleteStashedModificationInGroup(@Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid,
@Parameter(description = "Return 404 if group is not found") @RequestParam(name = "errorOnGroupNotFound", required = false,
defaultValue = "true") Boolean errorOnGroupNotFound) {
networkModificationService.deleteStashedModificationInGroup(groupUuid, errorOnGroupNotFound);
networkModificationService.deleteStashedModificationInAllGroups(List.of(groupUuid), errorOnGroupNotFound);
return ResponseEntity.ok().build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -793,14 +793,19 @@ public ModificationEntity getModificationEntity(UUID modificationUuid) {
}

@Transactional
public void deleteModificationGroup(UUID groupUuid, boolean errorOnGroupNotFound) {
public void deleteModificationGroup(List<UUID> groupUuids, boolean errorOnGroupNotFound) {
try {
ModificationGroupEntity groupEntity = getModificationGroup(groupUuid);
if (!groupEntity.getModifications().isEmpty()) {
deleteModifications(groupEntity.getModifications().stream().filter(Objects::nonNull).toList());
List<ModificationGroupEntity> groupEntities = getModificationGroups(groupUuids);
if (groupEntities.size() != groupUuids.size()) {
List<UUID> notFoundGroups = groupUuids.stream().filter(uuid -> groupEntities.stream().noneMatch(groupEntity -> uuid.equals(groupEntity.getId()))).toList();
throw new NetworkModificationServerException(MODIFICATION_CONTAINER_NOT_FOUND, notFoundGroups.toString());
}
List<ModificationEntity> modifications = groupEntities.stream().flatMap(groupEntity -> groupEntity.getModifications().stream()).toList();
if (!modifications.isEmpty()) {
deleteModifications(modifications);
}
// deleting the group deletes its modification_container row (JOINED subtype delete)
modificationGroupRepository.delete(groupEntity);
modificationGroupRepository.deleteAll(groupEntities);
} catch (NetworkModificationServerException e) {
if (e.getBusinessErrorCode() == MODIFICATION_CONTAINER_NOT_FOUND && !errorOnGroupNotFound) {
return;
Expand Down Expand Up @@ -841,6 +846,10 @@ private ModificationGroupEntity getModificationGroup(UUID groupUuid) {
.orElseThrow(() -> getModificationContainerNotFoundException(groupUuid.toString(), ModificationContainerType.GROUP));
}

private List<ModificationGroupEntity> getModificationGroups(List<UUID> groupUuids) {
return this.modificationGroupRepository.findAllById(groupUuids);
}

private ModificationGroupEntity getOrCreateModificationGroup(UUID groupUuid) {
return this.modificationGroupRepository.findById(groupUuid)
.orElseGet(
Expand Down Expand Up @@ -1136,9 +1145,10 @@ public void updateModification(@NonNull UUID modificationUuid, @NonNull Modifica
}

@Transactional
public void deleteStashedModificationInGroup(UUID groupUuid, boolean errorOnGroupNotFound) {
public void deleteStashedModificationInAllGroup(List<UUID> groupUuids, boolean errorOnGroupNotFound) {
try {
List<ModificationEntity> modifications = getModificationGroup(groupUuid).removeAllStashedModifications();
List<ModificationEntity> modifications = getModificationGroups(groupUuids).stream()
.flatMap(group -> group.removeAllStashedModifications().stream()).collect(Collectors.toList());
if (!modifications.isEmpty()) {
deleteModifications(modifications);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,9 @@ public Integer getNetworkModificationsCount(UUID groupUuid, boolean stashed) {
}

@Transactional
public void deleteModificationGroup(UUID groupUuid, boolean errorOnGroupNotFound) {
deleteIndexedModificationGroup(List.of(groupUuid));
networkModificationRepository.deleteModificationGroup(groupUuid, errorOnGroupNotFound);
public void deleteModificationGroups(List<UUID> groupUuids, boolean errorOnGroupNotFound) {
deleteIndexedModificationGroup(groupUuids);
networkModificationRepository.deleteModificationGroup(groupUuids, errorOnGroupNotFound);
}

private void deleteIndexedModificationGroup(List<UUID> groupUuids) {
Expand Down Expand Up @@ -612,8 +612,8 @@ public void replaceCompositeModification(@NonNull UUID compositeUuid, String nam
networkModificationRepository.replaceCompositeModification(compositeUuid, name, modificationUuids);
}

public void deleteStashedModificationInGroup(UUID groupUuid, boolean errorOnGroupNotFound) {
networkModificationRepository.deleteStashedModificationInGroup(groupUuid, errorOnGroupNotFound);
public void deleteStashedModificationInAllGroups(List<UUID> groupUuids, boolean errorOnGroupNotFound) {
networkModificationRepository.deleteStashedModificationInAllGroup(groupUuids, errorOnGroupNotFound);
}

public List<ModificationMetadata> getModificationsMetadata(List<UUID> ids) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ class ModificationControllerTest {
private static final UUID TEST_NETWORK_WITH_FLUSH_ERROR_ID = UUID.fromString("eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee");
private static final UUID TEST_GROUP_ID = UUID.randomUUID();
private static final UUID TEST_GROUP2_ID = UUID.randomUUID();
private static final UUID TEST_GROUP3_ID = UUID.randomUUID();
private static final UUID TEST_NETWORK_BUS_BREAKER_ID = UUID.fromString("11111111-7977-4592-ba19-88027e4254e4");
private static final UUID TEST_NETWORK_MIXED_TOPOLOGY_ID = UUID.fromString("22222222-7977-4592-ba19-88027e4254e4");
private static final String VARIANT_NOT_EXISTING_ID = "variant_not_existing";
Expand All @@ -117,6 +118,8 @@ class ModificationControllerTest {

private static final String URI_NETWORK_MODIF_BASE = "/v1/network-modifications";
private static final String NETWORK_MODIFICATION_URI = URI_NETWORK_MODIF_BASE + "?groupUuid=" + TEST_GROUP_ID;
private static final String NETWORK_MODIFICATION_URI_2 = URI_NETWORK_MODIF_BASE + "?groupUuid=" + TEST_GROUP2_ID;
private static final String NETWORK_MODIFICATION_URI_3 = URI_NETWORK_MODIF_BASE + "?groupUuid=" + TEST_GROUP3_ID;

@Autowired
private MockMvc mockMvc;
Expand Down Expand Up @@ -1697,6 +1700,100 @@ void testDeleteStashedNetworkModifications() throws Exception {
mockMvc.perform(delete("/v1/groups/" + UUID.randomUUID() + "/stashed-modifications").queryParam("errorOnGroupNotFound", "false")).andExpect(status().isOk());
}

@Test
void testDeleteAllStashedNetworkModifications() throws Exception {
MvcResult mvcResult;
EquipmentAttributeModificationInfos loadModificationInfos = EquipmentAttributeModificationInfos.builder()
.equipmentType(IdentifiableType.LOAD)
.equipmentId("v1load")
.build();

// create some modifications with several groups
String modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI_2).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI_2).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI_3).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

// check creation
List<ModificationInfos> modificationsGroup1 = modificationRepository.getModifications(TEST_GROUP_ID, true, true);
assertEquals(1, modificationsGroup1.size());
List<ModificationInfos> modificationsGroup2 = modificationRepository.getModifications(TEST_GROUP2_ID, true, true);
assertEquals(2, modificationsGroup2.size());
List<ModificationInfos> modificationsGroup3 = modificationRepository.getModifications(TEST_GROUP3_ID, true, true);
assertEquals(1, modificationsGroup3.size());
String uuidString = modificationsGroup1.getFirst().getUuid().toString();

// stash
mockMvc.perform(put(URI_NETWORK_MODIF_BASE)
.queryParam("groupUuid", TEST_GROUP_ID.toString())
.queryParam("uuids", uuidString)
.queryParam("stashed", "true"))
.andExpect(status().isOk());
String uuidString2 = modificationsGroup2.getFirst().getUuid().toString();
mockMvc.perform(put(URI_NETWORK_MODIF_BASE)
.queryParam("groupUuid", TEST_GROUP2_ID.toString())
.queryParam("uuids", uuidString2)
.queryParam("stashed", "true"))
.andExpect(status().isOk());
assertEquals(1, modificationRepository.getModifications(TEST_GROUP_ID, true, true, true).size());
assertEquals(1, modificationRepository.getModifications(TEST_GROUP2_ID, true, true, true).size());
assertEquals(0, modificationRepository.getModifications(TEST_GROUP3_ID, true, true, true).size());

// remove
String body = mapper.writeValueAsString(List.of(TEST_GROUP_ID, TEST_GROUP2_ID));
mockMvc.perform(delete("/v1/groups/stashed-modifications").queryParam("errorOnGroupNotFound", "false")
.content(body)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
assertEquals(0, modificationRepository.getModifications(TEST_GROUP_ID, true, true).size());
assertEquals(1, modificationRepository.getModifications(TEST_GROUP2_ID, true, true).size());
assertEquals(1, modificationRepository.getModifications(TEST_GROUP3_ID, true, true).size());
}

@Test
void testDeleteSeveralGroups() throws Exception {
MvcResult mvcResult;
EquipmentAttributeModificationInfos loadModificationInfos = EquipmentAttributeModificationInfos.builder()
.equipmentType(IdentifiableType.LOAD)
.equipmentId("v1load")
.build();

// create some modifications with several groups
String modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI_2).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

modificationInfosJson = TestUtils.getJsonBody(loadModificationInfos, TEST_NETWORK_ID, NetworkCreation.VARIANT_ID);
mvcResult = runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI_3).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON), status().isOk());
assertApplicationStatusOK(mvcResult);

// remove the first two groups
String body = mapper.writeValueAsString(List.of(TEST_GROUP_ID, TEST_GROUP2_ID));
mockMvc.perform(delete("/v1/groups").queryParam("errorOnGroupNotFound", "false")
.content(body)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());

assertEquals(1, modificationRepository.getModificationGroupsUuids().size());
assertEquals(TEST_GROUP3_ID, modificationRepository.getModificationGroupsUuids().getFirst());
assertEquals(1, modificationRepository.getModifications(TEST_GROUP3_ID, true, true).size());
}

@Test
void testGetModificationsCount() throws Exception {
MvcResult mvcResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,8 @@ void testDeleteModificationGroup() {
/*
Delete modification group
*/
networkModificationService.deleteModificationGroup(
groupUuid1,
networkModificationService.deleteModificationGroups(
List.of(groupUuid1),
true
);

Expand Down
Loading
Loading