Skip to content

Commit

Permalink
Add multiple filters export endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
Hugo Marcellin committed Jan 27, 2025
1 parent 123f922 commit 9c673a2
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ private StudyConstants() {
public static final String GROUP_UUID = "groupUuid";
public static final String REPORT_UUID = "reportUuid";
public static final String UUIDS = "uuids";
public static final String IDS = "ids";
public static final String QUERY_PARAM_ERROR_ON_GROUP_NOT_FOUND = "errorOnGroupNotFound";
public static final String QUERY_PARAM_REPORT_DEFAULT_NAME = "defaultName";
public static final String QUERY_PARAM_REPORT_SEVERITY_LEVEL = "severityLevels";
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/gridsuite/study/server/StudyController.java
Original file line number Diff line number Diff line change
Expand Up @@ -1991,6 +1991,15 @@ public ResponseEntity<String> exportFilter(
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.exportFilter(studyService.getStudyFirstRootNetworkUuid(studyUuid), filterUuid));
}

@GetMapping(value = "/studies/{studyUuid}/filters/elements")
@Operation(summary = "Evaluate a list of filters on root node to get matched elements")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The list of matched elements")})
public ResponseEntity<String> exportFilters(
@Parameter(description = "Study uuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "Filters uuid to be resolved") @RequestParam("filtersUuid") List<UUID> filtersUuid) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.exportFilters(studyService.getStudyFirstRootNetworkUuid(studyUuid), filtersUuid));
}

@PostMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/state-estimation/run")
@Operation(summary = "run state estimation on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The state estimation has started")})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

import static org.gridsuite.study.server.StudyConstants.DELIMITER;
import static org.gridsuite.study.server.StudyConstants.FILTER_API_VERSION;
import static org.gridsuite.study.server.StudyException.Type.*;
import static org.gridsuite.study.server.StudyException.Type.EVALUATE_FILTER_FAILED;
import static org.gridsuite.study.server.StudyException.Type.NETWORK_NOT_FOUND;
import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError;

/**
Expand All @@ -35,6 +37,7 @@ public class FilterService {

public static final String FILTER_END_POINT_EVALUATE = "/filters/evaluate";
public static final String FILTER_END_POINT_EXPORT = "/filters/{id}/export";
public static final String FILTERS_END_POINT_EXPORT = "/filters/export";

private final RestTemplate restTemplate;

Expand Down Expand Up @@ -90,4 +93,17 @@ public String exportFilter(UUID networkUuid, UUID filterUuid) {

return restTemplate.getForObject(uriComponent.toUriString(), String.class);
}

public String exportFilters(UUID networkUuid, List<UUID> filtersUuid) {
Objects.requireNonNull(networkUuid);
Objects.requireNonNull(filtersUuid);
String endPointUrl = getBaseUri() + DELIMITER + FILTER_API_VERSION + FILTERS_END_POINT_EXPORT;

UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endPointUrl);
uriComponentsBuilder.queryParam("networkUuid", networkUuid);
uriComponentsBuilder.queryParam("ids", filtersUuid);
var uriComponent = uriComponentsBuilder.buildAndExpand();

return restTemplate.getForObject(uriComponent.toUriString(), String.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2361,6 +2361,12 @@ public String exportFilter(UUID rootNetworkUuid, UUID filterUuid) {
return filterService.exportFilter(rootNetworkService.getNetworkUuid(rootNetworkUuid), filterUuid);
}

public String exportFilters(UUID rootNetworkUuid, List<UUID> filtersUuid) {
//Same choice of root node network as the function for a single filter
//TODO update this function too when root network logic has been refined for filters
return filterService.exportFilters(rootNetworkService.getNetworkUuid(rootNetworkUuid), filtersUuid);
}

@Transactional
public UUID runStateEstimation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, String userId) {
Objects.requireNonNull(studyUuid);
Expand Down
50 changes: 50 additions & 0 deletions src/test/java/org/gridsuite/study/server/FilterServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;

import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand All @@ -53,6 +55,7 @@ class FilterServiceTest {
private static final String NETWORK_UUID_STRING = "38400000-8cf0-11bd-b23e-10b96e4ef00d";
private static final String CASE_UUID_STRING = "00000000-8cf0-11bd-b23e-10b96e4ef00d";
private static final String FILTER_UUID_STRING = "c6c15d08-81e9-47a1-9cdb-7be22f017ad5";
private static final List<String> FILTERS_UUID_STRING = List.of("fc3aa057-5fa4-4173-b1a8-16028f5eefd1", "f8773f32-f77c-4126-8c6f-a4af8bf6f788");
private static final UUID CASE_UUID = UUID.fromString(CASE_UUID_STRING);

@Autowired
Expand Down Expand Up @@ -255,4 +258,51 @@ void testExportFilter() throws Exception {

wireMockUtils.verifyFilterExport(stubUuid, FILTER_UUID_STRING, NETWORK_UUID_STRING);
}

@Test
void testExportFilters() throws Exception {
StudyEntity studyEntity = insertDummyStudy(UUID.fromString(NETWORK_UUID_STRING), CASE_UUID);
UUID studyUuid = studyEntity.getId();
String responseBody = """
[
{
"filterId":"fc3aa057-5fa4-4173-b1a8-16028f5eefd1",
"identifiableAttributes":[
{
"id":".TMP",
"type":"SUBSTATION",
"distributionKey":null
}
],
"notFoundEquipments":null
},
{
"filterId":"f8773f32-f77c-4126-8c6f-a4af8bf6f788",
"identifiableAttributes":[
{
"id":".TMP2",
"type":"SUBSTATION",
"distributionKey":null
},
{
"id":".TMP3",
"type":"SUBSTATION",
"distributionKey":null
},
],
"notFoundEquipments":null
}
]
""";
UUID stubUuid = wireMockUtils.stubFiltersExport(NETWORK_UUID_STRING, FILTERS_UUID_STRING, responseBody);

MvcResult mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/filters/elements?filtersUuid=" + FILTERS_UUID_STRING.stream().collect(Collectors.joining(",")),
studyUuid))
.andExpect(status().isOk())
.andReturn();
String resultAsString = mvcResult.getResponse().getContentAsString();
assertEquals(responseBody, resultAsString);

wireMockUtils.verifyFiltersExport(stubUuid, FILTERS_UUID_STRING, NETWORK_UUID_STRING);
}
}
18 changes: 18 additions & 0 deletions src/test/java/org/gridsuite/study/server/utils/WireMockUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -458,8 +458,26 @@ public UUID stubFilterExport(String networkUuid, String filterUuid, String respo
).getId();
}

public UUID stubFiltersExport(String networkUuid, List<String> filtersUuid, String responseBody) {
MappingBuilder requestPatternBuilder = WireMock.get(WireMock.urlPathEqualTo("/v1/filters/export"))
.withQueryParam(NETWORK_UUID, WireMock.equalTo(networkUuid));
for (String filterUuid : filtersUuid) {
requestPatternBuilder.withQueryParam(IDS, WireMock.equalTo(filterUuid));
}
return wireMock.stubFor(requestPatternBuilder.willReturn(WireMock.ok().withBody(responseBody))).getId();
}

public void verifyFilterExport(UUID stubUuid, String filterUuid, String networkUuid) {
verifyGetRequest(stubUuid, "/v1/filters/" + filterUuid + "/export",
Map.of(NETWORK_UUID, WireMock.equalTo(networkUuid)));
}

public void verifyFiltersExport(UUID stubUuid, List<String> filtersUuid, String networkUuid) {
Map<String, StringValuePattern> queryParams = new HashMap<>();
queryParams.put(NETWORK_UUID, WireMock.equalTo(networkUuid));
for (String filterUuid : filtersUuid) {
queryParams.put(IDS, WireMock.equalTo(filterUuid));
}
verifyGetRequest(stubUuid, "/v1/filters/export", queryParams);
}
}

0 comments on commit 9c673a2

Please sign in to comment.