Skip to content

Commit 776424c

Browse files
authored
feat: duplicate spreadsheet column (#64)
Signed-off-by: Abdelsalem <[email protected]>
1 parent 137a6d1 commit 776424c

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

src/main/java/org/gridsuite/studyconfig/server/controller/SpreadsheetConfigController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ public ResponseEntity<Void> deleteColumn(
166166
return ResponseEntity.noContent().build();
167167
}
168168

169+
@PostMapping("/{id}/columns/{columnId}/duplicate")
170+
@Operation(summary = "Duplicate a column", description = "Duplicate a column and place it after the source column")
171+
@ApiResponse(responseCode = "204", description = "Column duplicated")
172+
@ApiResponse(responseCode = "404", description = "Column not found")
173+
public ResponseEntity<Void> duplicateColumn(
174+
@Parameter(description = "ID of the spreadsheet config") @PathVariable UUID id,
175+
@Parameter(description = "ID of the column to duplicate") @PathVariable UUID columnId) {
176+
spreadsheetConfigService.duplicateColumn(id, columnId);
177+
return ResponseEntity.noContent().build();
178+
}
179+
169180
@PutMapping("/{id}/columns/reorder")
170181
@Operation(summary = "Reorder columns", description = "Reorders the columns of a spreadsheet configuration")
171182
@ApiResponse(responseCode = "204", description = "Columns reordered")

src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
@Setter
2323
@NoArgsConstructor
2424
@AllArgsConstructor
25-
@Builder
25+
@Builder(toBuilder = true)
2626
public class ColumnEntity {
2727

2828
@Id

src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,22 @@ private static void reorderColumns(List<UUID> columnOrder, List<ColumnEntity> co
371371
columns.sort(Comparator.comparingInt(column -> columnOrder.indexOf(column.getUuid())));
372372
}
373373

374+
@Transactional
375+
public void duplicateColumn(UUID id, UUID columnId) {
376+
SpreadsheetConfigEntity entity = findEntityById(id);
377+
ColumnEntity columnEntity = entity.getColumns().stream().filter(col -> col.getUuid().equals(columnId))
378+
.findFirst().orElseThrow(() -> new EntityNotFoundException(COLUMN_NOT_FOUND + columnId));
379+
ColumnEntity columnCopy = columnEntity.toBuilder().build();
380+
columnCopy.setUuid(UUID.randomUUID());
381+
columnCopy.setId(columnCopy.getId() + "copy");
382+
columnCopy.setName(columnCopy.getName() + "-copy");
383+
384+
List<ColumnEntity> columns = entity.getColumns();
385+
columns.add(columns.indexOf(columnEntity) + 1, columnCopy);
386+
entity.setColumns(columns);
387+
spreadsheetConfigRepository.save(entity);
388+
}
389+
374390
@Transactional
375391
public void updateColumnStates(UUID id, List<ColumnStateUpdateInfos> columnStates) {
376392
SpreadsheetConfigEntity entity = findEntityById(id);

src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,34 @@ void testDeleteColumn() throws Exception {
310310
.doesNotContain(columnId);
311311
}
312312

313+
@Test
314+
void testDuplicateColumn() throws Exception {
315+
SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "Battery", SheetType.BATTERY, createColumns(), null, List.of());
316+
UUID configId = saveAndReturnId(config);
317+
318+
SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId);
319+
UUID columnId = savedConfig.columns().get(0).uuid();
320+
assertThat(savedConfig.columns()).hasSize(4);
321+
322+
mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE + "/" + columnId + "/duplicate"))
323+
.andExpect(status().isNoContent());
324+
325+
SpreadsheetConfigInfos configAfterDuplicate = getSpreadsheetConfig(configId);
326+
assertThat(configAfterDuplicate.columns()).hasSize(5);
327+
ColumnInfos columnInfos = configAfterDuplicate.columns().get(0);
328+
ColumnInfos duplicatedColumnInfos = configAfterDuplicate.columns().get(1);
329+
330+
assertThat(columnInfos.uuid()).isNotEqualTo(duplicatedColumnInfos.uuid());
331+
assertThat(columnInfos.id()).isNotEqualTo(duplicatedColumnInfos.id());
332+
assertThat(columnInfos.visible()).isEqualTo(duplicatedColumnInfos.visible());
333+
assertThat(columnInfos.formula()).isEqualTo(duplicatedColumnInfos.formula());
334+
assertThat(columnInfos.dependencies()).isEqualTo(duplicatedColumnInfos.dependencies());
335+
assertThat(columnInfos.precision()).isEqualTo(duplicatedColumnInfos.precision());
336+
337+
mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE + "/" + UUID.randomUUID() + "/duplicate"))
338+
.andExpect(status().isNotFound());
339+
}
340+
313341
@Test
314342
void testGetColumn() throws Exception {
315343
SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "Battery", SheetType.BATTERY, createColumns(), null, List.of());

0 commit comments

Comments
 (0)