diff --git a/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java b/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java index 3653ee884f22664819b6c4cfaa37a16c60754ea2..1b815060eedee9db4271055ba8bcd2af86b8f8fb 100644 --- a/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java +++ b/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java @@ -39,4 +39,13 @@ public class ItemController { return ResponseEntity.ok(itemService.getDeletedItems(order, pageCoordsValidator.validate(page, perpage))); } + @Operation(summary = "Get all contributed-items available in pages") + @GetMapping(path = "/contributed-items", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getContributedItems(@RequestParam(value = "order", required = false) ItemOrder order, + @RequestParam(value = "page", required = false) Integer page, + @RequestParam(value = "perpage", required = false) Integer perpage) + throws PageTooLargeException { + return ResponseEntity.ok(itemService.getContributedItems(order, pageCoordsValidator.validate(page, perpage))); + } + } diff --git a/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java b/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java index 7ed14d1d268bfa1ca65aa947fb30bf04e8349ead..0f7cd8da55212e36a5b9a35a07dd9d5750341f3e 100644 --- a/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java +++ b/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java @@ -98,6 +98,12 @@ public interface ItemRepository extends ItemVersionRepository { " ON v.id = i.persistent_id\n" + " WHERE v.curr_ver_id = i.id \n" + " AND v.status = 'DELETED' AND i.category != 'STEP'", nativeQuery = true) - List getDeletedItemsIds2(); + List getDeletedItemsIds(); + + @Query(value = "SELECT DISTINCT (v.curr_ver_id) FROM items i\n" + + " INNER JOIN versioned_items v \n" + + " ON v.id = i.persistent_id\n" + + " WHERE i.info_contributor_id = :contributorId ", nativeQuery = true) + List getContributedItemsIds(Long contributorId); } diff --git a/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java b/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java index 3eb7f761c004f76746abcf571549e6c3ac2e0a91..efa7b9ac8dfd611bcc4db3161ae1b56bf7ded551 100644 --- a/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java +++ b/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java @@ -19,6 +19,7 @@ import eu.sshopencloud.marketplace.repositories.items.*; import eu.sshopencloud.marketplace.repositories.search.SearchItemRepository; import eu.sshopencloud.marketplace.repositories.sources.SourceRepository; import eu.sshopencloud.marketplace.services.auth.LoggedInUserHolder; +import eu.sshopencloud.marketplace.services.items.exception.BasicItemsComparator; import eu.sshopencloud.marketplace.services.search.SearchConverter; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Lazy; @@ -255,7 +256,7 @@ public class ItemsService extends ItemVersionService { if (order == null) order = ItemOrder.MODIFIED_ON; - List list = itemRepository.getDeletedItemsIds2().stream().map(id -> itemRepository.findById(id).get()).collect(Collectors.toList()); + List list = itemRepository.getDeletedItemsIds().stream().map(id -> itemRepository.findById(id).get()).collect(Collectors.toList()); Page pages = new PageImpl<>(list, PageRequest.of(pageCoords.getPage() - 1, pageCoords.getPerpage(), Sort.by(getSortOrderByItemOrder(order))), list.size()); @@ -268,6 +269,33 @@ public class ItemsService extends ItemVersionService { .build(); } + //ELiza + public PaginatedItemsBasic getContributedItems(ItemOrder order, PageCoords pageCoords) { + BasicItemsComparator comparator = new BasicItemsComparator(); + + User currentUser = LoggedInUserHolder.getLoggedInUser(); + + if (currentUser == null ) + return null; + + if (order == null) order = ItemOrder.MODIFIED_ON; + + List list = itemRepository.getContributedItemsIds(currentUser.getId()).stream().map(id -> itemRepository.findById(id).get()).collect(Collectors.toList()); + + Page pages = new PageImpl<>(list, PageRequest.of(pageCoords.getPage() - 1, pageCoords.getPerpage(), Sort.by(getSortOrderByItemOrder(order))), list.size()); + + List items = pages.stream().map(ItemConverter::convertItem).collect(Collectors.toList()); + + if(order != ItemOrder.MODIFIED_ON) + items.sort(comparator); + + return PaginatedItemsBasic.builder().items(items) + .count(pages.getContent().size()).hits(pages.getTotalElements()) + .page(pageCoords.getPage()).perpage(pageCoords.getPerpage()) + .pages(pages.getTotalPages()) + .build(); + } + @Override protected Item loadLatestItem(String persistentId) { return super.loadLatestItem(persistentId); diff --git a/src/main/java/eu/sshopencloud/marketplace/services/items/exception/BasicItemsComparator.java b/src/main/java/eu/sshopencloud/marketplace/services/items/exception/BasicItemsComparator.java new file mode 100644 index 0000000000000000000000000000000000000000..c96eaa4724e0d35c22b9571060ae072bb08416a3 --- /dev/null +++ b/src/main/java/eu/sshopencloud/marketplace/services/items/exception/BasicItemsComparator.java @@ -0,0 +1,16 @@ +package eu.sshopencloud.marketplace.services.items.exception; + +import eu.sshopencloud.marketplace.dto.items.ItemBasicDto; +import lombok.experimental.UtilityClass; +import org.apache.commons.lang3.StringUtils; + +import java.util.Comparator; + + +public class BasicItemsComparator implements Comparator { + + @Override + public int compare(ItemBasicDto firstPlayer, ItemBasicDto secondPlayer) { + return StringUtils.compare(firstPlayer.getLabel(), secondPlayer.getLabel()); + } +} \ No newline at end of file diff --git a/src/test/java/eu/sshopencloud/marketplace/controllers/datasets/DatasetControllerITCase.java b/src/test/java/eu/sshopencloud/marketplace/controllers/datasets/DatasetControllerITCase.java index db8d8503c4188787a48fb9886d94e07c12da3574..3b3dce81be5dd6bf3dbc50588b3a62601ffaff6c 100644 --- a/src/test/java/eu/sshopencloud/marketplace/controllers/datasets/DatasetControllerITCase.java +++ b/src/test/java/eu/sshopencloud/marketplace/controllers/datasets/DatasetControllerITCase.java @@ -339,7 +339,7 @@ public class DatasetControllerITCase { DatasetCore dataset = new DatasetCore(); dataset.setLabel("Test dataset with malformed Url"); dataset.setDescription("Lorem ipsum"); - dataset.setAccessibleAt(Arrays.asList("Malformed Url")); + dataset.setAccessibleAt(List.of("Malformed Url")); String payload = mapper.writeValueAsString(dataset); log.debug("JSON: " + payload); @@ -532,7 +532,7 @@ public class DatasetControllerITCase { vocabulary1.setCode("software-license"); concept1.setVocabulary(vocabulary1); property1.setConcept(concept1); - List properties = new ArrayList(); + List properties = new ArrayList<>(); properties.add(property1); dataset.setProperties(properties); @@ -566,12 +566,12 @@ public class DatasetControllerITCase { dataset.setDescription("Lorem ipsum"); ItemContributorId contributor = new ItemContributorId(); ActorId actor = new ActorId(); - actor.setId(3l); + actor.setId(3L); contributor.setActor(actor); ActorRoleId role = new ActorRoleId(); role.setCode("author"); contributor.setRole(role); - List contributors = new ArrayList(); + List contributors = new ArrayList<>(); contributors.add(contributor); dataset.setContributors(contributors); PropertyCore property1 = new PropertyCore(); @@ -589,7 +589,7 @@ public class DatasetControllerITCase { propertyType2.setCode("material"); property2.setType(propertyType2); property2.setValue("paper"); - List properties = new ArrayList(); + List properties = new ArrayList<>(); properties.add(property1); properties.add(property2); dataset.setProperties(properties); @@ -644,7 +644,6 @@ public class DatasetControllerITCase { @Test public void shouldUpdateDatasetWithApprovedFalseForSystemModerator() throws Exception { String datasetPersistentId = "dmbq4v"; - Integer datasetCurrentId = 9; DatasetCore dataset = new DatasetCore(); dataset.setLabel("Test simple dataset"); @@ -659,7 +658,7 @@ public class DatasetControllerITCase { vocabulary1.setCode("software-license"); concept1.setVocabulary(vocabulary1); property1.setConcept(concept1); - List properties = new ArrayList(); + List properties = new ArrayList<>(); properties.add(property1); dataset.setProperties(properties); @@ -770,7 +769,7 @@ public class DatasetControllerITCase { ActorRoleId role = new ActorRoleId(); role.setCode("author"); contributor.setRole(role); - List contributors = new ArrayList(); + List contributors = new ArrayList<>(); contributors.add(contributor); dataset.setContributors(contributors); PropertyCore property1 = new PropertyCore(); @@ -785,7 +784,7 @@ public class DatasetControllerITCase { propertyType2.setCode("material"); property2.setType(propertyType2); property2.setValue("paper"); - List properties = new ArrayList(); + List properties = new ArrayList<>(); properties.add(property1); properties.add(property2); dataset.setProperties(properties); @@ -1716,7 +1715,6 @@ public class DatasetControllerITCase { String toolPersistentId = "Xgufde"; int toolId = 3; String datasetSecondPersistentId = "dmbq4v"; - int datasetSecondId = 103; String workflowSecondPersistentId = "vHQEhe"; int workflowSecondId = 21; @@ -1862,9 +1860,6 @@ public class DatasetControllerITCase { String mergedSecondPersistentId = TestJsonMapper.serializingObjectMapper() .readValue(mergedResponse2, DatasetDto.class).getPersistentId(); - int mergedSecondId = TestJsonMapper.serializingObjectMapper() - .readValue(mergedResponse2, DatasetDto.class).getId().intValue(); - mvc.perform( get("/api/datasets/{id}/history", mergedSecondPersistentId) @@ -2045,7 +2040,7 @@ public class DatasetControllerITCase { DatasetDto dataset = TestJsonMapper.serializingObjectMapper() .readValue(responseDataset, DatasetDto.class); - dataset.setDateCreated(ZonedDateTime.of(LocalDate.of(2021,12,1), LocalTime.of(03,10), ZoneId.of("Europe/Paris"))); + dataset.setDateCreated(ZonedDateTime.of(LocalDate.of(2021,12,1), LocalTime.of(3,10), ZoneId.of("Europe/Paris"))); String payload = mapper.writeValueAsString(dataset); log.debug("JSON: " + payload); diff --git a/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java b/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java index 25b44892a6059a7c1342badc2516a44991e384d1..758c730f7585237781b5e68549c97a9a742a2ade 100644 --- a/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java +++ b/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java @@ -1,7 +1,10 @@ package eu.sshopencloud.marketplace.controllers.items; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.sshopencloud.marketplace.conf.TestJsonMapper; import eu.sshopencloud.marketplace.conf.auth.LogInTestClient; +import eu.sshopencloud.marketplace.dto.datasets.DatasetCore; +import eu.sshopencloud.marketplace.dto.datasets.DatasetDto; import eu.sshopencloud.marketplace.dto.sources.SourceId; import eu.sshopencloud.marketplace.dto.tools.ToolCore; import lombok.extern.slf4j.Slf4j; @@ -21,8 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -39,12 +41,17 @@ public class ItemControllerITCase { private String CONTRIBUTOR_JWT; private String ADMINISTRATOR_JWT; + private String MODERATOR_JWT; + + @Autowired + private ObjectMapper mapper; @Before public void init() throws Exception { CONTRIBUTOR_JWT = LogInTestClient.getJwt(mvc, "Contributor", "q1w2e3r4t5"); ADMINISTRATOR_JWT = LogInTestClient.getJwt(mvc, "Administrator", "q1w2e3r4t5"); + MODERATOR_JWT = LogInTestClient.getJwt(mvc, "Moderator", "q1w2e3r4t5"); } @Test @@ -111,4 +118,202 @@ public class ItemControllerITCase { .andExpect(jsonPath("items[1].lastInfoUpdate", notNullValue())); } + @Test + public void shouldGetContributedItems() throws Exception { + + mvc.perform(get("/api/contributed-items") + .contentType(MediaType.APPLICATION_JSON) + .param("order", "label") + .header("Authorization", CONTRIBUTOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("items", hasSize(14))) + .andExpect(jsonPath("items[0].persistentId", is("dmbq4v"))) + .andExpect(jsonPath("items[0].id", is(9))) + .andExpect(jsonPath("items[1].persistentId", is("prblMo"))) + .andExpect(jsonPath("items[1].id", is(13))) + .andExpect(jsonPath("items[2].persistentId", is("dVZeir"))) + .andExpect(jsonPath("items[2].id", is(15))) + .andExpect(jsonPath("items[3].persistentId", is("2CwYCU"))) + .andExpect(jsonPath("items[3].id", is(14))) + .andExpect(jsonPath("items[4].persistentId", is("tqmbGY"))) + .andExpect(jsonPath("items[4].id", is(12))) + .andExpect(jsonPath("items[5].persistentId", is("gQu2wl"))) + .andExpect(jsonPath("items[5].id", is(24))) + .andExpect(jsonPath("items[6].persistentId", is("EPax9f"))) + .andExpect(jsonPath("items[6].id", is(16))) + .andExpect(jsonPath("items[7].persistentId", is("xYpCdU"))) + .andExpect(jsonPath("items[7].id", is(18))) + .andExpect(jsonPath("items[8].persistentId", is("U8vUos"))) + .andExpect(jsonPath("items[8].id", is(20))) + .andExpect(jsonPath("items[9].persistentId", is("sQY6US"))) + .andExpect(jsonPath("items[9].id", is(23))) + .andExpect(jsonPath("items[10].persistentId", is("HLYtzq"))) + .andExpect(jsonPath("items[10].id", is(17))) + .andExpect(jsonPath("items[11].persistentId", is("BNw43H"))) + .andExpect(jsonPath("items[11].id", is(22))) + .andExpect(jsonPath("items[12].persistentId", is("dU0BZc"))) + .andExpect(jsonPath("items[12].id", is(11))) + .andExpect(jsonPath("items[13].persistentId", is("k68NbF"))) + .andExpect(jsonPath("items[13].id", is(19))); + + } + + @Test + public void shouldCreateApproveAndGetContributedItems() throws Exception { + + mvc.perform(get("/api/contributed-items") + .contentType(MediaType.APPLICATION_JSON) + .param("order", "label") + .header("Authorization", CONTRIBUTOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("items", hasSize(14))) + .andExpect(jsonPath("items[0].persistentId", is("dmbq4v"))) + .andExpect(jsonPath("items[0].id", is(9))) + .andExpect(jsonPath("items[1].persistentId", is("prblMo"))) + .andExpect(jsonPath("items[1].id", is(13))) + .andExpect(jsonPath("items[2].persistentId", is("dVZeir"))) + .andExpect(jsonPath("items[2].id", is(15))) + .andExpect(jsonPath("items[3].persistentId", is("2CwYCU"))) + .andExpect(jsonPath("items[3].id", is(14))) + .andExpect(jsonPath("items[4].persistentId", is("tqmbGY"))) + .andExpect(jsonPath("items[4].id", is(12))) + .andExpect(jsonPath("items[5].persistentId", is("gQu2wl"))) + .andExpect(jsonPath("items[5].id", is(24))) + .andExpect(jsonPath("items[6].persistentId", is("EPax9f"))) + .andExpect(jsonPath("items[6].id", is(16))) + .andExpect(jsonPath("items[7].persistentId", is("xYpCdU"))) + .andExpect(jsonPath("items[7].id", is(18))) + .andExpect(jsonPath("items[8].persistentId", is("U8vUos"))) + .andExpect(jsonPath("items[8].id", is(20))) + .andExpect(jsonPath("items[9].persistentId", is("sQY6US"))) + .andExpect(jsonPath("items[9].id", is(23))) + .andExpect(jsonPath("items[10].persistentId", is("HLYtzq"))) + .andExpect(jsonPath("items[10].id", is(17))) + .andExpect(jsonPath("items[11].persistentId", is("BNw43H"))) + .andExpect(jsonPath("items[11].id", is(22))) + .andExpect(jsonPath("items[12].persistentId", is("dU0BZc"))) + .andExpect(jsonPath("items[12].id", is(11))) + .andExpect(jsonPath("items[13].persistentId", is("k68NbF"))) + .andExpect(jsonPath("items[13].id", is(19))); + + DatasetCore dataset = new DatasetCore(); + dataset.setLabel("A first"); + dataset.setDescription("Lorem ipsum"); + + String payload = mapper.writeValueAsString(dataset); + log.debug("JSON: " + payload); + + String response = mvc.perform(post("/api/datasets") + .content(payload) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", CONTRIBUTOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("status", is("suggested"))) + .andExpect(jsonPath("category", is("dataset"))) + .andExpect(jsonPath("label", is("A first"))) + .andExpect(jsonPath("description", is("Lorem ipsum"))) + .andExpect(jsonPath("properties", hasSize(0))) + .andReturn().getResponse().getContentAsString(); + + String datasetPersistentId = TestJsonMapper.serializingObjectMapper() + .readValue(response, DatasetDto.class).getPersistentId(); + + long datasetId = TestJsonMapper.serializingObjectMapper() + .readValue(response, DatasetDto.class).getId(); + + mvc.perform(get("/api/contributed-items") + .contentType(MediaType.APPLICATION_JSON) + .param("order", "label") + .header("Authorization", CONTRIBUTOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("items", hasSize(15))) + .andExpect(jsonPath("items[0].persistentId", is(datasetPersistentId))) + .andExpect(jsonPath("items[0].id", is((int) datasetId))) + .andExpect(jsonPath("items[1].persistentId", is("dmbq4v"))) + .andExpect(jsonPath("items[1].id", is(9))) + .andExpect(jsonPath("items[2].persistentId", is("prblMo"))) + .andExpect(jsonPath("items[2].id", is(13))) + .andExpect(jsonPath("items[3].persistentId", is("dVZeir"))) + .andExpect(jsonPath("items[3].id", is(15))) + .andExpect(jsonPath("items[4].persistentId", is("2CwYCU"))) + .andExpect(jsonPath("items[4].id", is(14))) + .andExpect(jsonPath("items[5].persistentId", is("tqmbGY"))) + .andExpect(jsonPath("items[5].id", is(12))) + .andExpect(jsonPath("items[6].persistentId", is("gQu2wl"))) + .andExpect(jsonPath("items[6].id", is(24))) + .andExpect(jsonPath("items[7].persistentId", is("EPax9f"))) + .andExpect(jsonPath("items[7].id", is(16))) + .andExpect(jsonPath("items[8].persistentId", is("xYpCdU"))) + .andExpect(jsonPath("items[8].id", is(18))) + .andExpect(jsonPath("items[9].persistentId", is("U8vUos"))) + .andExpect(jsonPath("items[9].id", is(20))) + .andExpect(jsonPath("items[10].persistentId", is("sQY6US"))) + .andExpect(jsonPath("items[10].id", is(23))) + .andExpect(jsonPath("items[11].persistentId", is("HLYtzq"))) + .andExpect(jsonPath("items[11].id", is(17))) + .andExpect(jsonPath("items[12].persistentId", is("BNw43H"))) + .andExpect(jsonPath("items[12].id", is(22))) + .andExpect(jsonPath("items[13].persistentId", is("dU0BZc"))) + .andExpect(jsonPath("items[13].id", is(11))) + .andExpect(jsonPath("items[14].persistentId", is("k68NbF"))) + .andExpect(jsonPath("items[14].id", is(19))); + + + dataset.setLabel("A first "); + String payloadUpdate = mapper.writeValueAsString(dataset); + log.debug("JSON: " + payloadUpdate); + + String responseUpdated = mvc.perform(put("/api/datasets/{id}",datasetPersistentId) + .content(payloadUpdate) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", MODERATOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("status", is("approved"))) + .andExpect(jsonPath("category", is("dataset"))) + .andExpect(jsonPath("label", is("A first "))) + .andExpect(jsonPath("description", is("Lorem ipsum"))) + .andExpect(jsonPath("properties", hasSize(0))) + .andReturn().getResponse().getContentAsString(); + + long datasetIdUpdated = TestJsonMapper.serializingObjectMapper() + .readValue(responseUpdated, DatasetDto.class).getId(); + + mvc.perform(get("/api/contributed-items") + .contentType(MediaType.APPLICATION_JSON) + .param("order", "label") + .header("Authorization", CONTRIBUTOR_JWT)) + .andExpect(status().isOk()) + .andExpect(jsonPath("items", hasSize(15))) + .andExpect(jsonPath("items[0].persistentId", is(datasetPersistentId))) + .andExpect(jsonPath("items[0].id", is((int) datasetIdUpdated))) + .andExpect(jsonPath("items[1].persistentId", is("dmbq4v"))) + .andExpect(jsonPath("items[1].id", is(9))) + .andExpect(jsonPath("items[2].persistentId", is("prblMo"))) + .andExpect(jsonPath("items[2].id", is(13))) + .andExpect(jsonPath("items[3].persistentId", is("dVZeir"))) + .andExpect(jsonPath("items[3].id", is(15))) + .andExpect(jsonPath("items[4].persistentId", is("2CwYCU"))) + .andExpect(jsonPath("items[4].id", is(14))) + .andExpect(jsonPath("items[5].persistentId", is("tqmbGY"))) + .andExpect(jsonPath("items[5].id", is(12))) + .andExpect(jsonPath("items[6].persistentId", is("gQu2wl"))) + .andExpect(jsonPath("items[6].id", is(24))) + .andExpect(jsonPath("items[7].persistentId", is("EPax9f"))) + .andExpect(jsonPath("items[7].id", is(16))) + .andExpect(jsonPath("items[8].persistentId", is("xYpCdU"))) + .andExpect(jsonPath("items[8].id", is(18))) + .andExpect(jsonPath("items[9].persistentId", is("U8vUos"))) + .andExpect(jsonPath("items[9].id", is(20))) + .andExpect(jsonPath("items[10].persistentId", is("sQY6US"))) + .andExpect(jsonPath("items[10].id", is(23))) + .andExpect(jsonPath("items[11].persistentId", is("HLYtzq"))) + .andExpect(jsonPath("items[11].id", is(17))) + .andExpect(jsonPath("items[12].persistentId", is("BNw43H"))) + .andExpect(jsonPath("items[12].id", is(22))) + .andExpect(jsonPath("items[13].persistentId", is("dU0BZc"))) + .andExpect(jsonPath("items[13].id", is(11))) + .andExpect(jsonPath("items[14].persistentId", is("k68NbF"))) + .andExpect(jsonPath("items[14].id", is(19))); + + } }