Skip to content

Commit 48d6b67

Browse files
scalbertmSCALBERT Mathieu
andauthored
feat: Add endpoint to import a model and another to delete a set (#11)
Co-authored-by: SCALBERT Mathieu <[email protected]>
1 parent ffb9cc1 commit 48d6b67

File tree

7 files changed

+212
-10
lines changed

7 files changed

+212
-10
lines changed

src/main/java/org/gridsuite/mapping/server/controller/ModelController.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1212
import io.swagger.v3.oas.annotations.tags.Tag;
1313
import lombok.AllArgsConstructor;
14-
import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition;
15-
import org.gridsuite.mapping.server.dto.models.ParametersSet;
16-
import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup;
17-
import org.gridsuite.mapping.server.dto.models.SimpleModel;
14+
import org.gridsuite.mapping.server.dto.models.*;
1815
import org.gridsuite.mapping.server.service.ModelService;
1916
import org.gridsuite.mapping.server.service.implementation.ModelServiceImpl;
2017
import org.gridsuite.mapping.server.utils.SetGroupType;
@@ -78,4 +75,20 @@ public ResponseEntity<List<ModelParameterDefinition>> getParametersDefinitionsFr
7875
public ResponseEntity<List<SimpleModel>> getModels() {
7976
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getModels());
8077
}
78+
79+
@PostMapping(value = "/")
80+
@Operation(summary = "Post a model")
81+
@ApiResponses(value = {
82+
@ApiResponse(responseCode = "200", description = "saved model")})
83+
public ResponseEntity<Model> saveModel(@RequestBody Model model) {
84+
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveModel(model));
85+
}
86+
87+
@DeleteMapping(value = "/{modelName}/parameters/sets/{groupName}/{groupType}/{setName}")
88+
@Operation(summary = "Delete a parameter set")
89+
@ApiResponses(value = {
90+
@ApiResponse(responseCode = "200", description = "updated parameter group")})
91+
public ResponseEntity<ParametersSetsGroup> deleteSet(@PathVariable("modelName") String modelName, @PathVariable("groupName") String groupName, @PathVariable("groupType") SetGroupType groupType, @PathVariable("setName") String setName) {
92+
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.deleteSet(modelName, groupName, groupType, setName));
93+
}
8194
}

src/main/java/org/gridsuite/mapping/server/dto/models/Model.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.gridsuite.mapping.server.dto.models;
88

9+
import lombok.AllArgsConstructor;
910
import lombok.Data;
1011
import org.gridsuite.mapping.server.model.ModelEntity;
1112
import org.gridsuite.mapping.server.utils.EquipmentType;
@@ -19,6 +20,7 @@
1920
* @author Mathieu Scalbert <mathieu.scalbert at rte-france.com>
2021
*/
2122
@Data
23+
@AllArgsConstructor
2224
public class Model {
2325

2426
private String modelName;

src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.gridsuite.mapping.server.dto.models;
88

9+
import lombok.AllArgsConstructor;
910
import lombok.Data;
1011
import org.gridsuite.mapping.server.model.ModelParameterDefinitionEntity;
1112
import org.gridsuite.mapping.server.utils.ParameterOrigin;
@@ -15,6 +16,7 @@
1516
* @author Mathieu Scalbert <mathieu.scalbert at rte-france.com>
1617
*/
1718
@Data
19+
@AllArgsConstructor
1820
public class ModelParameterDefinition {
1921

2022
private String name;

src/main/java/org/gridsuite/mapping/server/service/ModelService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
*/
77
package org.gridsuite.mapping.server.service;
88

9-
import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition;
10-
import org.gridsuite.mapping.server.dto.models.ParametersSet;
11-
import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup;
12-
import org.gridsuite.mapping.server.dto.models.SimpleModel;
9+
import org.gridsuite.mapping.server.dto.models.*;
1310
import org.gridsuite.mapping.server.utils.SetGroupType;
1411

1512
import java.util.List;
@@ -26,4 +23,8 @@ public interface ModelService {
2623
List<ParametersSet> getSetsFromGroup(String modelName, String groupName, SetGroupType groupType);
2724

2825
ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersSetsGroup setsGroup, Boolean strict);
26+
27+
Model saveModel(Model model);
28+
29+
ParametersSetsGroup deleteSet(String modelName, String groupName, SetGroupType groupType, String setName);
2930
}

src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import org.gridsuite.mapping.server.dto.models.*;
1010
import org.gridsuite.mapping.server.model.ModelEntity;
11+
import org.gridsuite.mapping.server.model.ModelParameterSetEntity;
1112
import org.gridsuite.mapping.server.model.ModelSetsGroupEntity;
1213
import org.gridsuite.mapping.server.repository.ModelRepository;
1314
import org.gridsuite.mapping.server.service.ModelService;
@@ -95,5 +96,29 @@ public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersS
9596
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
9697
}
9798
}
99+
100+
@Override
101+
public Model saveModel(Model model) {
102+
modelRepository.save(new ModelEntity(model));
103+
return model;
104+
}
105+
106+
@Override
107+
public ParametersSetsGroup deleteSet(String modelName, String groupName, SetGroupType groupType, String setName) {
108+
Optional<ModelEntity> foundModel = modelRepository.findById(modelName);
109+
if (foundModel.isPresent()) {
110+
ModelEntity modelToEdit = foundModel.get();
111+
ModelSetsGroupEntity setsGroup = modelToEdit.getSetsGroups().stream()
112+
.filter(setGroup -> setGroup.getName().equals(groupName) && setGroup.getType().equals(groupType))
113+
.findAny()
114+
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No group found"));
115+
List<ModelParameterSetEntity> sets = setsGroup.getSets();
116+
setsGroup.setSets(sets.stream().filter(set -> !set.getName().equals(setName)).collect(Collectors.toList()));
117+
modelRepository.save(modelToEdit);
118+
return new ParametersSetsGroup(setsGroup);
119+
} else {
120+
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No model found with this name");
121+
}
122+
}
98123
}
99124

src/test/java/org/gridsuite/mapping/server/ModelControllerTest.java

Lines changed: 120 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@
2323
import org.springframework.test.web.servlet.MockMvc;
2424
import org.springframework.transaction.annotation.Transactional;
2525

26+
import java.nio.file.Files;
27+
import java.nio.file.Paths;
2628
import java.util.ArrayList;
2729
import java.util.Date;
2830
import java.util.List;
2931

3032
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
33+
import static org.junit.Assert.assertEquals;
3134
import static org.springframework.http.MediaType.APPLICATION_JSON;
32-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
33-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
35+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
3436
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
3537
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
3638

@@ -218,4 +220,120 @@ public void getTest() throws Exception {
218220
"{\"name\":\"GeneratorThreeWindings\",\n \"type\":\"GENERATOR\",\"groups\":[{\"name\": \"GSTWPR\", \"type\": \"PREFIX\", \"setsNumber\": 0}]}\n" +
219221
"]", true));
220222
}
223+
224+
public static String readFileAsString(String file) throws Exception {
225+
return new String(Files.readAllBytes(Paths.get(file)));
226+
}
227+
228+
@Test
229+
@Transactional
230+
public void testSave() throws Exception {
231+
String modelName = "LoadAlphaBeta";
232+
ModelEntity previousModel = modelRepository.findById(modelName).orElseThrow();
233+
String newModel = readFileAsString("src/test/resources/loadAlphaBeta.json");
234+
235+
cleanDB();
236+
// Put data
237+
mvc.perform(post("/models/")
238+
.content(newModel)
239+
.contentType(APPLICATION_JSON))
240+
.andExpect(status().isOk());
241+
242+
// Get Data
243+
ModelEntity savedModel = modelRepository.findById(modelName).orElseThrow();
244+
245+
assertEquals(previousModel.getModelName(), savedModel.getModelName());
246+
assertEquals(previousModel.getEquipmentType(), savedModel.getEquipmentType());
247+
List<ModelParameterDefinitionEntity> previousDefinitions = previousModel.getParameterDefinitions();
248+
List<ModelParameterDefinitionEntity> savedDefinitions = savedModel.getParameterDefinitions();
249+
assertEquals(previousDefinitions.size(), savedDefinitions.size());
250+
for (int i = 0; i < previousDefinitions.size(); i++) {
251+
ModelParameterDefinitionEntity previousDefinition = previousDefinitions.get(i);
252+
ModelParameterDefinitionEntity savedDefinition = savedDefinitions.get(i);
253+
assertEquals(previousDefinition.getName(), savedDefinition.getName());
254+
assertEquals(previousDefinition.getModelName(), savedDefinition.getModelName());
255+
assertEquals(previousDefinition.getType(), savedDefinition.getType());
256+
assertEquals(previousDefinition.getOrigin(), savedDefinition.getOrigin());
257+
assertEquals(previousDefinition.getOriginName(), savedDefinition.getOriginName());
258+
assertEquals(previousDefinition.getFixedValue(), savedDefinition.getFixedValue());
259+
}
260+
// Import does not check sets because it is not part of the typical model import
261+
}
262+
263+
@Test
264+
@Transactional
265+
public void deleteTest() throws Exception {
266+
267+
String name = "setName";
268+
String modelName = "LoadAlphaBeta";
269+
String set = "{\n" +
270+
" \"name\": \"" + name + "\",\n" +
271+
" \"parameters\": [\n" +
272+
" {\n" +
273+
" \"name\": \"load_alpha\",\n" +
274+
" \"value\": \"1.5\"\n" +
275+
" },\n" +
276+
" {\n" +
277+
" \"name\": \"load_beta\",\n" +
278+
" \"value\": \"2.5\"\n" +
279+
" }\n" +
280+
" ]\n" +
281+
"}";
282+
String setGroup = "{\n" +
283+
" \"name\": \"" + name + "\",\n" +
284+
" \"modelName\": \"" + modelName + "\",\n" +
285+
" \"type\": \"FIXED\",\n" +
286+
" \"sets\": [\n" +
287+
set +
288+
" ]\n" +
289+
"}";
290+
291+
// Put data
292+
mvc.perform(post("/models/" + modelName + "/parameters/sets/strict")
293+
.content(setGroup)
294+
.contentType(APPLICATION_JSON))
295+
.andExpect(status().isOk());
296+
297+
mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED")
298+
.contentType(APPLICATION_JSON))
299+
.andExpect(status().isOk())
300+
.andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON))
301+
.andExpect(content().json("[" + set + "]", true));
302+
303+
// Trying to delete from a non-existing model will throw
304+
mvc.perform(delete("/models/" + "unknownModel" + "/parameters/sets/" + name + "/" + "FIXED" + "/" + name))
305+
.andExpect(status().isNotFound());
306+
307+
// Trying to delete from a non-existing setGroup will throw
308+
mvc.perform(delete("/models/" + modelName + "/parameters/sets/" + "unknownGroup" + "/" + "FIXED" + "/" + name))
309+
.andExpect(status().isNotFound());
310+
311+
// Trying to delete a non-existing set will do nothing
312+
mvc.perform(delete("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED" + "/" + "unusedName"))
313+
.andExpect(status().isOk())
314+
.andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON))
315+
.andExpect(content().json(setGroup));
316+
317+
mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED")
318+
.contentType(APPLICATION_JSON))
319+
.andExpect(status().isOk())
320+
.andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON))
321+
.andExpect(content().json("[" + set + "]", true));
322+
323+
// Delete the set
324+
mvc.perform(delete("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED" + "/" + name))
325+
.andExpect(status().isOk())
326+
.andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON))
327+
.andExpect(content().json("{\n" +
328+
" \"name\": \"" + name + "\",\n" +
329+
" \"modelName\": \"" + modelName + "\",\n" +
330+
" \"type\": \"FIXED\",\n" +
331+
" \"sets\": []\n" +
332+
"}"));
333+
mvc.perform(get("/models/" + modelName + "/parameters/sets/" + name + "/" + "FIXED")
334+
.contentType(APPLICATION_JSON))
335+
.andExpect(status().isOk())
336+
.andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON))
337+
.andExpect(content().json("[]", true));
338+
}
221339
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"modelName": "LoadAlphaBeta",
3+
"equipmentType": "LOAD",
4+
"parameterDefinitions": [
5+
{
6+
"name": "load_alpha",
7+
"type": "DOUBLE",
8+
"origin": "USER"
9+
},
10+
{
11+
"name": "load_beta",
12+
"type": "DOUBLE",
13+
"origin": "USER"
14+
},
15+
{
16+
"name": "load_P0Pu",
17+
"type": "DOUBLE",
18+
"origin": "NETWORK",
19+
"originName": "p_pu"
20+
},
21+
{
22+
"name": "load_Q0Pu",
23+
"type": "DOUBLE",
24+
"origin": "NETWORK",
25+
"originName": "q_pu"
26+
},
27+
{
28+
"name": "load_U0Pu",
29+
"type": "DOUBLE",
30+
"origin": "NETWORK",
31+
"originName": "v_pu"
32+
},
33+
{
34+
"name": "load_UPhase0",
35+
"type": "DOUBLE",
36+
"origin": "NETWORK",
37+
"originName": "angle_pu"
38+
}
39+
],
40+
"setsGroups": []
41+
}

0 commit comments

Comments
 (0)