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 @@ -21,7 +21,6 @@
import org.gridsuite.filter.utils.EquipmentType;
import org.gridsuite.study.server.StudyApi;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.dto.computation.LoadFlowComputationInfos;
import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos;
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
import org.gridsuite.study.server.dto.modification.CompositeInfos;
Expand Down Expand Up @@ -81,7 +80,7 @@ public class StudyController {
private final RemoteServicesInspector remoteServicesInspector;
private final RootNetworkService rootNetworkService;
private final RootNetworkNodeInfoService rootNetworkNodeInfoService;
private final SensitivityAnalysisService sensitivityAnalysisService;
private final SensitivityAnalysisRestService sensitivityAnalysisService;
private final RebuildNodeService rebuildNodeService;

public StudyController(StudyService studyService,
Expand All @@ -93,7 +92,7 @@ public StudyController(StudyService studyService,
RemoteServicesInspector remoteServicesInspector,
RootNetworkService rootNetworkService,
RootNetworkNodeInfoService rootNetworkNodeInfoService,
SensitivityAnalysisService sensitivityAnalysisService,
SensitivityAnalysisRestService sensitivityAnalysisService,
RebuildNodeService rebuildNodeService) {
this.studyService = studyService;
this.networkModificationTreeService = networkModificationTreeService;
Expand Down Expand Up @@ -768,104 +767,6 @@ private void handleDuplicateNetworkModifications(UUID targetStudyUuid, UUID targ
}
}

@PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/run")
@Operation(summary = "run loadflow on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow has started")})
public ResponseEntity<Void> runLoadFlow(
@PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@PathVariable("nodeUuid") UUID nodeUuid,
@RequestParam(value = "withRatioTapChangers", required = false, defaultValue = "false") boolean withRatioTapChangers,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertIsNodeNotReadOnly(nodeUuid);
studyService.assertOnQuotasAvailability(LOAD_FLOW, userId);
studyService.assertNoBlockedNodeInTree(nodeUuid, rootNetworkUuid);
studyService.assertCanRunOnConstructionNode(studyUuid, nodeUuid, List.of(DYNA_FLOW_PROVIDER), studyService::getLoadFlowProvider);
UUID prevResultUuid = rootNetworkNodeInfoService.getComputationResultUuid(nodeUuid, rootNetworkUuid, LOAD_FLOW);
if (prevResultUuid != null) {
handleRerunLoadFlow(studyUuid, nodeUuid, rootNetworkUuid, prevResultUuid, withRatioTapChangers, userId);
} else {
studyService.sendLoadflowRequest(studyUuid, nodeUuid, rootNetworkUuid, null, withRatioTapChangers, userId);
}
return ResponseEntity.ok().build();
}

/**
* Need to have several transactions to send notifications by step
* Disadvantage is that it is not atomic so need a try/catch to rollback
*/
private void handleRerunLoadFlow(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, UUID prevResultUuid, Boolean withRatioTapChangers, String userId) {
UUID loadflowResultUuid = null;
try {
studyService.deleteLoadflowResult(studyUuid, nodeUuid, rootNetworkUuid, prevResultUuid);
loadflowResultUuid = studyService.createLoadflowRunningStatus(studyUuid, nodeUuid, rootNetworkUuid, withRatioTapChangers);
studyService.rerunLoadflow(studyUuid, nodeUuid, rootNetworkUuid, loadflowResultUuid, withRatioTapChangers, userId);
} catch (Exception e) {
if (loadflowResultUuid != null) {
studyService.deleteLoadflowResult(studyUuid, nodeUuid, rootNetworkUuid, loadflowResultUuid);
}
throw e;
}
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/result")
@Operation(summary = "Get a loadflow result on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow result"),
@ApiResponse(responseCode = "204", description = "No loadflow has been done yet"),
@ApiResponse(responseCode = "404", description = "The loadflow result has not been found")})
public ResponseEntity<String> getLoadflowResult(@Parameter(description = "study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
@Parameter(description = "JSON array of filters") @RequestParam(name = "filters", required = false) String filters,
Sort sort) {
String result = rootNetworkNodeInfoService.getLoadFlowResult(nodeUuid, rootNetworkUuid, filters, sort);
return result != null ? ResponseEntity.ok().body(result) :
ResponseEntity.noContent().build();
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/status")
@Operation(summary = "Get the loadflow status on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow status"),
@ApiResponse(responseCode = "204", description = "No loadflow has been done yet"),
@ApiResponse(responseCode = "404", description = "The loadflow status has not been found")})
public ResponseEntity<String> getLoadFlowStatus(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) {
String result = rootNetworkNodeInfoService.getLoadFlowStatus(nodeUuid, rootNetworkUuid);
return result != null ? ResponseEntity.ok().body(result) : ResponseEntity.noContent().build();
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/computation-infos")
@Operation(summary = "Get the loadflow computation infos on study node and root network")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow computation infos"),
@ApiResponse(responseCode = "404", description = "The loadflow computation has not been found")})
public ResponseEntity<LoadFlowComputationInfos> getLoadFlowComputationInfos(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(rootNetworkNodeInfoService.getLoadFlowComputationInfos(nodeUuid, rootNetworkUuid));
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/modifications")
@Operation(summary = "Get the loadflow modifications on study node and root network")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow computation infos"),
@ApiResponse(responseCode = "404", description = "The loadflow computation has not been found")})
public ResponseEntity<String> getLoadFlowModifications(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(rootNetworkNodeInfoService.getLoadFlowModifications(nodeUuid, rootNetworkUuid));
}

@PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/loadflow/stop")
@Operation(summary = "stop loadflow on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow has been stopped")})
public ResponseEntity<Void> stopLoadFlow(@Parameter(description = "Study uuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
rootNetworkNodeInfoService.stopLoadFlow(studyUuid, nodeUuid, rootNetworkUuid, userId);
return ResponseEntity.ok().build();
}

@PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/shortcircuit/run")
@Operation(summary = "run short circuit analysis on study")
@ApiResponse(responseCode = "200", description = "The short circuit analysis has started")
Expand Down Expand Up @@ -1177,37 +1078,6 @@ public ResponseEntity<List<String>> getResultEnumValues(@Parameter(description =
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getResultEnumValues(nodeUuid, rootNetworkUuid, computingType, enumName));
}

@PostMapping(value = "/studies/{studyUuid}/loadflow/parameters")
@Operation(summary = "set loadflow parameters on study, reset to default ones if empty body")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow parameters are set"),
@ApiResponse(responseCode = "204", description = "Reset with user profile cannot be done")})
public ResponseEntity<Void> setLoadflowParameters(
@PathVariable("studyUuid") UUID studyUuid,
@RequestBody(required = false) String lfParameter,
@RequestHeader(HEADER_USER_ID) String userId) {
studyService.assertNoBlockedNodeInStudy(studyUuid, networkModificationTreeService.getStudyRootNodeUuid(studyUuid));
return studyService.setLoadFlowParameters(studyUuid, lfParameter, userId) ? ResponseEntity.noContent().build() : ResponseEntity.ok().build();
}

@GetMapping(value = "/studies/{studyUuid}/loadflow/parameters")
@Operation(summary = "Get loadflow parameters on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow parameters")})
public ResponseEntity<LoadFlowParametersInfos> getLoadflowParameters(
@PathVariable("studyUuid") UUID studyUuid) {
return ResponseEntity.ok().body(studyService.getLoadFlowParametersInfos(studyUuid));
}

@GetMapping(value = "/studies/{studyUuid}/loadflow/parameters/id")
@Operation(summary = "Get loadflow parameters ID for study")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "The loadflow parameters ID"),
@ApiResponse(responseCode = "404", description = "The study is not found")
})
public ResponseEntity<UUID> getLoadflowParametersId(@PathVariable("studyUuid") UUID studyUuid) {
UUID parametersId = studyService.getLoadFlowParametersId(studyUuid);
return ResponseEntity.ok().body(parametersId);
}

@GetMapping(value = "/studies/{studyUuid}/dynamic-simulation/provider")
@Operation(summary = "Get dynamic simulation provider for a specified study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The dynamic simulation provider is returned")})
Expand Down Expand Up @@ -2530,13 +2400,6 @@ public ResponseEntity<Void> setNodeAliases(
return ResponseEntity.ok().build();
}

@GetMapping(value = "/studies/{studyUuid}/loadflow/provider")
@Operation(summary = "Get loadflow provider for a specified study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow provider is returned")})
public ResponseEntity<String> getLoadFlowProvider(@PathVariable("studyUuid") UUID studyUuid) {
return ResponseEntity.ok().body(studyService.getLoadFlowProvider(studyUuid));
}

@GetMapping(value = "/studies/{studyUuid}/spreadsheet/parameters", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Get global parameters of the spreadsheets")
@ApiResponse(responseCode = "200", description = "Get the parameters")
Expand Down
Loading
Loading