Skip to content

Commit 3df4723

Browse files
committed
Added: updateFeaturedItems working endpoint
1 parent b8853b7 commit 3df4723

File tree

5 files changed

+178
-65
lines changed

5 files changed

+178
-65
lines changed

src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,50 +1788,61 @@ public Response updateFeaturedItems(
17881788
@FormDataParam("content") List<String> contents,
17891789
@FormDataParam("displayOrder") List<Integer> displayOrders,
17901790
@FormDataParam("keepFile") List<Boolean> keepFiles,
1791+
@FormDataParam("fileName") List<String> fileNames,
17911792
@FormDataParam("file") List<FormDataBodyPart> files) {
17921793
try {
1793-
if (ids == null || contents == null || displayOrders == null || keepFiles == null || files == null) {
1794-
throw new WrappedResponse(error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("dataverse.update.featuredItems.error.missingInputParams")));
1794+
if (ids == null || contents == null || displayOrders == null || keepFiles == null || fileNames == null) {
1795+
throw new WrappedResponse(error(Response.Status.BAD_REQUEST,
1796+
BundleUtil.getStringFromBundle("dataverse.update.featuredItems.error.missingInputParams")));
17951797
}
17961798

17971799
int size = ids.size();
1798-
if (contents.size() != size || displayOrders.size() != size || keepFiles.size() != size || files.size() != size) {
1799-
throw new WrappedResponse(error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("dataverse.update.featuredItems.error.inputListsSizeMismatch")));
1800+
if (contents.size() != size || displayOrders.size() != size || keepFiles.size() != size || fileNames.size() != size) {
1801+
throw new WrappedResponse(error(Response.Status.BAD_REQUEST,
1802+
BundleUtil.getStringFromBundle("dataverse.update.featuredItems.error.inputListsSizeMismatch")));
18001803
}
18011804

18021805
Dataverse dataverse = findDataverseOrDie(dvIdtf);
1803-
List<NewDataverseFeaturedItemDTO> newDataverseFeaturedItemDTOs = new ArrayList<>();
1804-
Map<DataverseFeaturedItem, UpdatedDataverseFeaturedItemDTO> dataverseFeaturedItemsToUpdate = new HashMap<>();
1806+
List<NewDataverseFeaturedItemDTO> newItems = new ArrayList<>();
1807+
Map<DataverseFeaturedItem, UpdatedDataverseFeaturedItemDTO> itemsToUpdate = new HashMap<>();
18051808

18061809
for (int i = 0; i < contents.size(); i++) {
1807-
Long id = ids.get(i);
1808-
String content = contents.get(i);
1809-
Integer displayOrder = displayOrders.get(i);
1810-
boolean keepFile = keepFiles.get(i);
1811-
FormDataBodyPart fileBodyPart = files.get(i);
1812-
1813-
InputStream fileInputStream = fileBodyPart.getValueAs(InputStream.class);
1814-
FormDataContentDisposition contentDispositionHeader = fileBodyPart.getFormDataContentDisposition();
1815-
1816-
if (id == 0) {
1817-
NewDataverseFeaturedItemDTO newDTO = NewDataverseFeaturedItemDTO.fromFormData(content, displayOrder, fileInputStream, contentDispositionHeader);
1818-
newDataverseFeaturedItemDTOs.add(newDTO);
1810+
String fileName = fileNames.get(i);
1811+
InputStream fileInputStream = null;
1812+
FormDataContentDisposition contentDisposition = null;
1813+
1814+
if (files != null) {
1815+
Optional<FormDataBodyPart> matchingFile = files.stream()
1816+
.filter(file -> file.getFormDataContentDisposition().getFileName().equals(fileName))
1817+
.findFirst();
1818+
1819+
if (matchingFile.isPresent()) {
1820+
fileInputStream = matchingFile.get().getValueAs(InputStream.class);
1821+
contentDisposition = matchingFile.get().getFormDataContentDisposition();
1822+
}
1823+
}
1824+
1825+
if (ids.get(i) == 0) {
1826+
newItems.add(NewDataverseFeaturedItemDTO.fromFormData(
1827+
contents.get(i), displayOrders.get(i), fileInputStream, contentDisposition));
18191828
} else {
1820-
DataverseFeaturedItem existingItem = dataverseFeaturedItemServiceBean.findById(id);
1829+
DataverseFeaturedItem existingItem = dataverseFeaturedItemServiceBean.findById(ids.get(i));
18211830
if (existingItem == null) {
1822-
throw new WrappedResponse(error(Response.Status.NOT_FOUND, MessageFormat.format(BundleUtil.getStringFromBundle("dataverseFeaturedItems.errors.notFound"), id)));
1831+
throw new WrappedResponse(error(Response.Status.NOT_FOUND,
1832+
MessageFormat.format(BundleUtil.getStringFromBundle("dataverseFeaturedItems.errors.notFound"), ids.get(i))));
18231833
}
1824-
UpdatedDataverseFeaturedItemDTO updatedDTO = UpdatedDataverseFeaturedItemDTO.fromFormData(content, displayOrder, keepFile, fileInputStream, contentDispositionHeader);
1825-
dataverseFeaturedItemsToUpdate.put(existingItem, updatedDTO);
1834+
itemsToUpdate.put(existingItem, UpdatedDataverseFeaturedItemDTO.fromFormData(
1835+
contents.get(i), displayOrders.get(i), keepFiles.get(i), fileInputStream, contentDisposition));
18261836
}
18271837
}
18281838

18291839
List<DataverseFeaturedItem> featuredItems = execCommand(new UpdateDataverseFeaturedItemsCommand(
18301840
createDataverseRequest(getRequestUser(crc)),
18311841
dataverse,
1832-
newDataverseFeaturedItemDTOs,
1833-
dataverseFeaturedItemsToUpdate
1842+
newItems,
1843+
itemsToUpdate
18341844
));
1845+
18351846
return ok(jsonDataverseFeaturedItems(featuredItems));
18361847
} catch (WrappedResponse wr) {
18371848
return wr.getResponse();

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseFeaturedItemsCommand.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import edu.harvard.iq.dataverse.engine.command.*;
99
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
1010

11+
import java.util.ArrayList;
12+
import java.util.Comparator;
1113
import java.util.List;
1214
import java.util.Map;
1315

@@ -34,34 +36,43 @@ public UpdateDataverseFeaturedItemsCommand(DataverseRequest request, Dataverse d
3436

3537
@Override
3638
public List<DataverseFeaturedItem> execute(CommandContext ctxt) throws CommandException {
37-
updateOrDeleteExistingFeaturedItems(ctxt);
38-
createNewFeaturedItems(ctxt);
39-
40-
return ctxt.engine().submit(new ListDataverseFeaturedItemsCommand(getRequest(), dataverse));
39+
List<DataverseFeaturedItem> dataverseFeaturedItems = updateOrDeleteExistingFeaturedItems(ctxt);
40+
dataverseFeaturedItems.addAll(createNewFeaturedItems(ctxt));
41+
dataverseFeaturedItems.sort(Comparator.comparingLong(DataverseFeaturedItem::getId));
42+
return dataverseFeaturedItems;
4143
}
4244

43-
private void updateOrDeleteExistingFeaturedItems(CommandContext ctxt) throws CommandException {
45+
private List<DataverseFeaturedItem> updateOrDeleteExistingFeaturedItems(CommandContext ctxt) throws CommandException {
46+
List<DataverseFeaturedItem> updatedFeaturedItems = new ArrayList<>();
4447
List<DataverseFeaturedItem> featuredItemsToDelete = dataverse.getDataverseFeaturedItems();
4548

4649
for (Map.Entry<DataverseFeaturedItem, UpdatedDataverseFeaturedItemDTO> entry : dataverseFeaturedItemsToUpdate.entrySet()) {
4750
DataverseFeaturedItem featuredItem = entry.getKey();
4851
UpdatedDataverseFeaturedItemDTO updatedDTO = entry.getValue();
4952

50-
if (featuredItemsToDelete.contains(featuredItem)) {
51-
featuredItemsToDelete.remove(featuredItem);
52-
}
53+
featuredItemsToDelete.stream()
54+
.filter(item -> item.getId().equals(featuredItem.getId()))
55+
.findFirst().ifPresent(featuredItemsToDelete::remove);
5356

54-
ctxt.engine().submit(new UpdateDataverseFeaturedItemCommand(getRequest(), featuredItem, updatedDTO));
57+
DataverseFeaturedItem updatedFeatureItem = ctxt.engine().submit(new UpdateDataverseFeaturedItemCommand(getRequest(), featuredItem, updatedDTO));
58+
updatedFeaturedItems.add(updatedFeatureItem);
5559
}
5660

5761
for (DataverseFeaturedItem featuredItem : featuredItemsToDelete) {
5862
ctxt.engine().submit(new DeleteDataverseFeaturedItemCommand(getRequest(), featuredItem));
5963
}
64+
65+
return updatedFeaturedItems;
6066
}
6167

62-
private void createNewFeaturedItems(CommandContext ctxt) throws CommandException {
68+
private List<DataverseFeaturedItem> createNewFeaturedItems(CommandContext ctxt) throws CommandException {
69+
List<DataverseFeaturedItem> createdFeaturedItems = new ArrayList<>();
70+
6371
for (NewDataverseFeaturedItemDTO dto : newDataverseFeaturedItemDTOs) {
64-
ctxt.engine().submit(new CreateDataverseFeaturedItemCommand(getRequest(), dataverse, dto));
72+
DataverseFeaturedItem createdFeatureItem = ctxt.engine().submit(new CreateDataverseFeaturedItemCommand(getRequest(), dataverse, dto));
73+
createdFeaturedItems.add(createdFeatureItem);
6574
}
75+
76+
return createdFeaturedItems;
6677
}
6778
}

src/main/java/propertyFiles/Bundle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -982,8 +982,8 @@ dataverse.create.error.jsonparsetodataverse=Error parsing the POSTed json into a
982982
dataverse.create.featuredItem.error.imageFileProcessing=Error processing featured item file: {0}
983983
dataverse.create.featuredItem.error.fileSizeExceedsLimit=File exceeds the maximum size of {0}
984984
dataverse.create.featuredItem.error.invalidFileType=Invalid image file type
985-
dataverse.update.featuredItems.error.missingInputParams=All input parameters (id, content, displayOrder, keepFile, file) are required.
986-
dataverse.update.featuredItems.error.inputListsSizeMismatch=All input lists (id, content, displayOrder, keepFile, file) must have the same size.
985+
dataverse.update.featuredItems.error.missingInputParams=All input parameters (id, content, displayOrder, keepFile, fileNames) are required.
986+
dataverse.update.featuredItems.error.inputListsSizeMismatch=All input lists (id, content, displayOrder, keepFile, fileNames) must have the same size.
987987
# rolesAndPermissionsFragment.xhtml
988988

989989
# advanced.xhtml

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 107 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,25 +1622,125 @@ public void testCreateFeaturedItem() {
16221622
.statusCode(NOT_FOUND.getStatusCode());
16231623
}
16241624

1625-
// TODO: Complete
16261625
@Test
16271626
public void testUpdateFeaturedItems() {
16281627
Response createUserResponse = UtilIT.createRandomUser();
16291628
String apiToken = UtilIT.getApiTokenFromResponse(createUserResponse);
16301629
Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken);
16311630
createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode());
16321631
String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
1632+
String baseUri = UtilIT.getRestAssuredBaseUri();
16331633

16341634
// Create new items
1635-
List<Long> ids = Arrays.asList(0L, 0L);
1636-
List<String> contents = Arrays.asList("Content 1", "Content 2");
1637-
List<Integer> orders = Arrays.asList(1, 2);
1638-
List<Boolean> keepFiles = Arrays.asList(false, false);
1639-
List<String> pathsToFiles = Arrays.asList("src/test/resources/images/coffeeshop.png", "src/test/resources/images/coffeeshop.png");
1635+
1636+
List<Long> ids = Arrays.asList(0L, 0L, 0L);
1637+
List<String> contents = Arrays.asList("Content 1", "Content 2", "Content 3");
1638+
List<Integer> orders = Arrays.asList(0, 1, 2);
1639+
List<Boolean> keepFiles = Arrays.asList(false, false, false);
1640+
List<String> pathsToFiles = Arrays.asList("src/test/resources/images/coffeeshop.png", null, null);
16401641

16411642
Response updateDataverseFeaturedItemsResponse = UtilIT.updateDataverseFeaturedItems(dataverseAlias, ids, contents, orders, keepFiles, pathsToFiles, apiToken);
1642-
updateDataverseFeaturedItemsResponse.prettyPrint();
16431643
updateDataverseFeaturedItemsResponse.then().assertThat()
1644+
.body("data.size()", equalTo(3))
1645+
.body("data[0].content", equalTo("Content 1"))
1646+
.body("data[0].imageFileName", equalTo("coffeeshop.png"))
1647+
.body("data[0].imageFileUrl", containsString(baseUri + "/api/access/dataverseFeatureItemImage/"))
1648+
.body("data[0].displayOrder", equalTo(0))
1649+
.body("data[1].content", equalTo("Content 2"))
1650+
.body("data[1].imageFileName", equalTo(null))
1651+
.body("data[1].imageFileUrl", equalTo(null))
1652+
.body("data[1].displayOrder", equalTo(1))
1653+
.body("data[2].content", equalTo("Content 3"))
1654+
.body("data[2].imageFileName", equalTo(null))
1655+
.body("data[2].imageFileUrl", equalTo(null))
1656+
.body("data[2].displayOrder", equalTo(2))
1657+
.statusCode(OK.getStatusCode());
1658+
1659+
Long firstItemId = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[0].id");
1660+
Long secondItemId = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[1].id");
1661+
Long thirdItemId = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[2].id");
1662+
1663+
// Update first item (content, order, and keeping image), delete the rest and create new items
1664+
1665+
ids = Arrays.asList(firstItemId, 0L, 0L);
1666+
contents = Arrays.asList("Content 1 updated", "Content 2", "Content 3");
1667+
orders = Arrays.asList(1, 0, 2);
1668+
keepFiles = Arrays.asList(true, false, false);
1669+
pathsToFiles = Arrays.asList(null, null, null);
1670+
1671+
updateDataverseFeaturedItemsResponse = UtilIT.updateDataverseFeaturedItems(dataverseAlias, ids, contents, orders, keepFiles, pathsToFiles, apiToken);
1672+
updateDataverseFeaturedItemsResponse.then().assertThat()
1673+
.body("data.size()", equalTo(3))
1674+
.body("data[0].content", equalTo("Content 1 updated"))
1675+
.body("data[0].imageFileName", equalTo("coffeeshop.png"))
1676+
.body("data[0].imageFileUrl", containsString(baseUri + "/api/access/dataverseFeatureItemImage/"))
1677+
.body("data[0].displayOrder", equalTo(1))
1678+
.body("data[1].content", equalTo("Content 2"))
1679+
.body("data[1].imageFileName", equalTo(null))
1680+
.body("data[1].imageFileUrl", equalTo(null))
1681+
.body("data[1].displayOrder", equalTo(0))
1682+
.body("data[2].content", equalTo("Content 3"))
1683+
.body("data[2].imageFileName", equalTo(null))
1684+
.body("data[2].imageFileUrl", equalTo(null))
1685+
.body("data[2].displayOrder", equalTo(2))
1686+
.statusCode(OK.getStatusCode());
1687+
1688+
Long firstItemIdAfterUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[0].id");
1689+
Long secondItemIdAfterUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[1].id");
1690+
Long thirdItemIdAfterUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[2].id");
1691+
1692+
assertEquals(firstItemId, firstItemIdAfterUpdate);
1693+
assertNotEquals(secondItemId, secondItemIdAfterUpdate);
1694+
assertNotEquals(thirdItemId, thirdItemIdAfterUpdate);
1695+
1696+
// Update first item (removing image), update second item (adding image), delete the third item and create a new item
1697+
1698+
ids = Arrays.asList(firstItemId, secondItemIdAfterUpdate, 0L);
1699+
contents = Arrays.asList("Content 1 updated", "Content 2", "Content 3");
1700+
orders = Arrays.asList(1, 0, 2);
1701+
keepFiles = Arrays.asList(false, false, false);
1702+
pathsToFiles = Arrays.asList(null, "src/test/resources/images/coffeeshop.png", null);
1703+
1704+
updateDataverseFeaturedItemsResponse = UtilIT.updateDataverseFeaturedItems(dataverseAlias, ids, contents, orders, keepFiles, pathsToFiles, apiToken);
1705+
updateDataverseFeaturedItemsResponse.then().assertThat()
1706+
.body("data.size()", equalTo(3))
1707+
.body("data[0].content", equalTo("Content 1 updated"))
1708+
.body("data[0].imageFileName", equalTo(null))
1709+
.body("data[0].imageFileUrl", equalTo(null))
1710+
.body("data[0].displayOrder", equalTo(1))
1711+
.body("data[1].content", equalTo("Content 2"))
1712+
.body("data[1].imageFileName", equalTo("coffeeshop.png"))
1713+
.body("data[1].imageFileUrl", containsString(baseUri + "/api/access/dataverseFeatureItemImage/"))
1714+
.body("data[1].displayOrder", equalTo(0))
1715+
.body("data[2].content", equalTo("Content 3"))
1716+
.body("data[2].imageFileName", equalTo(null))
1717+
.body("data[2].imageFileUrl", equalTo(null))
1718+
.body("data[2].displayOrder", equalTo(2))
1719+
.statusCode(OK.getStatusCode());
1720+
1721+
Long firstItemIdAftersSecondUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[0].id");
1722+
Long secondItemIdAfterSecondUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[1].id");
1723+
Long thirdItemIdAfterSecondUpdate = JsonPath.from(updateDataverseFeaturedItemsResponse.body().asString()).getLong("data[2].id");
1724+
1725+
assertEquals(firstItemId, firstItemIdAftersSecondUpdate);
1726+
assertEquals(secondItemIdAfterUpdate, secondItemIdAfterSecondUpdate);
1727+
assertNotEquals(thirdItemIdAfterUpdate, thirdItemIdAfterSecondUpdate);
1728+
1729+
// Only keep first featured item
1730+
1731+
ids = List.of(firstItemId);
1732+
contents = List.of("Content 1 updated");
1733+
orders = List.of(0);
1734+
keepFiles = List.of(false);
1735+
pathsToFiles = null;
1736+
1737+
updateDataverseFeaturedItemsResponse = UtilIT.updateDataverseFeaturedItems(dataverseAlias, ids, contents, orders, keepFiles, pathsToFiles, apiToken);
1738+
updateDataverseFeaturedItemsResponse.then().assertThat()
1739+
.body("data.size()", equalTo(1))
1740+
.body("data[0].content", equalTo("Content 1 updated"))
1741+
.body("data[0].imageFileName", equalTo(null))
1742+
.body("data[0].imageFileUrl", equalTo(null))
1743+
.body("data[0].displayOrder", equalTo(0))
16441744
.statusCode(OK.getStatusCode());
16451745
}
16461746
}

0 commit comments

Comments
 (0)