From e3e434dac0c9a65c55f7428c555ee1f22a92ac5d Mon Sep 17 00:00:00 2001 From: Eliza Kalata Date: Mon, 25 Apr 2022 13:21:38 +0200 Subject: [PATCH 1/2] Deleted items endpoint with fixes to test for externalIds improvement. --- .../controllers/items/ItemController.java | 9 +++++ .../items/DraftItemRepository.java | 9 ++--- .../repositories/items/ItemRepository.java | 11 +++++++ .../services/items/ItemsService.java | 33 ++++++++++++++++--- .../items/ItemExternalIdFactory.java | 30 ++++++++++------- .../items/ItemControllerITCase.java | 4 +-- 6 files changed, 72 insertions(+), 24 deletions(-) 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 120c8b58..3653ee88 100644 --- a/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java +++ b/src/main/java/eu/sshopencloud/marketplace/controllers/items/ItemController.java @@ -30,4 +30,13 @@ public class ItemController { } + @Operation(summary = "Get all deleted-items available in pages") + @GetMapping(path = "/deleted-items", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getDeletedItems(@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.getDeletedItems(order, pageCoordsValidator.validate(page, perpage))); + } + } diff --git a/src/main/java/eu/sshopencloud/marketplace/repositories/items/DraftItemRepository.java b/src/main/java/eu/sshopencloud/marketplace/repositories/items/DraftItemRepository.java index 7bfa1be2..941003cb 100644 --- a/src/main/java/eu/sshopencloud/marketplace/repositories/items/DraftItemRepository.java +++ b/src/main/java/eu/sshopencloud/marketplace/repositories/items/DraftItemRepository.java @@ -5,10 +5,9 @@ import eu.sshopencloud.marketplace.model.items.DraftItem; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @@ -18,10 +17,8 @@ public interface DraftItemRepository extends JpaRepository { Optional findByItemId(long itemId); Page findByOwner(User owner, Pageable pageable); + List findByOwner(User owner); - boolean deleteByItemId(long itemId); - - @Query(value = "DELETE FROM draft_items WHERE id = :draftId", nativeQuery = true) - void deleteDraft(@Param("draftId") long draftId); + int deleteByItemId(long itemId); } 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 d4d14ba9..7ed14d1d 100644 --- a/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java +++ b/src/main/java/eu/sshopencloud/marketplace/repositories/items/ItemRepository.java @@ -1,7 +1,11 @@ package eu.sshopencloud.marketplace.repositories.items; +import eu.sshopencloud.marketplace.model.auth.User; +import eu.sshopencloud.marketplace.model.items.DraftItem; import eu.sshopencloud.marketplace.model.items.Item; import eu.sshopencloud.marketplace.model.vocabularies.Concept; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -89,4 +93,11 @@ public interface ItemRepository extends ItemVersionRepository { @Query("select i from Item i left join VersionedItem v ON i.versionedItem = v WHERE (i.status = 'APPROVED' AND v.active = true) OR (i.proposedVersion = true AND v.active = true)") List findAllItemsToReindex(); + @Query(value = "SELECT i.id FROM items i\n" + + " INNER JOIN versioned_items v \n" + + " 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(); + } 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 c02843a8..3eb7f761 100644 --- a/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java +++ b/src/main/java/eu/sshopencloud/marketplace/services/items/ItemsService.java @@ -76,13 +76,15 @@ public class ItemsService extends ItemVersionService { this.itemContributorRepository = itemContributorRepository; } + public PaginatedItemsBasic getMyDraftItems(ItemOrder order, PageCoords pageCoords) { if (order == null) order = ItemOrder.MODIFIED_ON; - Page draftItemsPage = draftItemRepository.findByOwner(LoggedInUserHolder.getLoggedInUser(), - PageRequest.of(pageCoords.getPage() - 1, pageCoords.getPerpage(), Sort.by(getSortOrderByItemOrder(order)))); + List draftItemsList = draftItemRepository.findByOwner(LoggedInUserHolder.getLoggedInUser()).stream().filter(draftItem -> !draftItem.getItem().getCategory().equals(ItemCategory.STEP)).collect(Collectors.toList()); + + Page draftItemsPage = new PageImpl<>(draftItemsList, PageRequest.of(pageCoords.getPage() - 1, pageCoords.getPerpage(), Sort.by(getSortOrderByItemOrder(order))), draftItemsList.size()); - List items = draftItemsPage.stream().filter(draftItem -> !draftItem.getItem().getCategory().equals(ItemCategory.STEP)).map(draftItem -> ItemConverter.convertItem(draftItem.getItem())).collect(Collectors.toList()); + List items = draftItemsPage.stream().map(draftItem -> ItemConverter.convertItem(draftItem.getItem())).collect(Collectors.toList()); return PaginatedItemsBasic.builder().items(items) .count(draftItemsPage.getContent().size()).hits(draftItemsPage.getTotalElements()) @@ -239,10 +241,33 @@ public class ItemsService extends ItemVersionService { } - public List getItemsByActor(Actor actor){ + public List getItemsByActor(Actor actor) { return ItemConverter.convertItem(itemRepository.findAllByContributorsActorId(actor.getId())); } + + public PaginatedItemsBasic getDeletedItems(ItemOrder order, PageCoords pageCoords) { + + User currentUser = LoggedInUserHolder.getLoggedInUser(); + + if (currentUser == null || !currentUser.isModerator()) + return null; + + if (order == null) order = ItemOrder.MODIFIED_ON; + + List list = itemRepository.getDeletedItemsIds2().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()); + + 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/validators/items/ItemExternalIdFactory.java b/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java index 393b1bfb..0bfd975c 100644 --- a/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java +++ b/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java @@ -24,7 +24,7 @@ public class ItemExternalIdFactory { List itemExternalIds = new ArrayList<>(); Set processedExternalIds = new HashSet<>(); - if(!item.getExternalIds().isEmpty()) + if (!item.getExternalIds().isEmpty()) itemExternalIds.addAll(item.getExternalIds()); if (externalIds == null) @@ -37,19 +37,17 @@ public class ItemExternalIdFactory { ItemExternalId externalId = create(externalIds.get(i), item, errors); if (externalId != null) { - if (!processedExternalIds.contains(externalId) ) { + if (!processedExternalIds.contains(externalId)) { - if(ifContains(itemExternalIds, externalId)) { + if (itemExternalIds.size() > 0 && ifContains(itemExternalIds, externalId)) { processedExternalIds.add(externalId); if (externalIds.size() == i + 1) return itemExternalIds; - } - else { + } else { itemExternalIds.add(externalId); processedExternalIds.add(externalId); } - } - else { + } else { errors.popNestedPath(); errors.rejectValue( nestedPath, "field.duplicateEntry", @@ -84,13 +82,21 @@ public class ItemExternalIdFactory { return new ItemExternalId(itemSource.get(), externalId.getIdentifier(), item); } - public boolean ifContains(List itemExternalIds,ItemExternalId newExternalId){ + public boolean ifContains(List itemExternalIds, ItemExternalId newExternalId) { AtomicBoolean contains = new AtomicBoolean(false); + itemExternalIds.forEach( - itemExternalId ->{ - if(itemExternalId.getItem().getId().equals(newExternalId.getItem().getId()) && itemExternalId.getItem().getPersistentId().equals(newExternalId.getItem().getPersistentId()) - && itemExternalId.getIdentifier().equals(newExternalId.getIdentifier()) && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) - contains.set(true); + itemExternalId -> { + if (newExternalId.getIdentifier().isEmpty()) { + if (itemExternalId.getItem().getId().equals(newExternalId.getItem().getId()) && itemExternalId.getItem().getPersistentId().equals(newExternalId.getItem().getPersistentId()) + && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) + contains.set(true); + } else { + if (itemExternalId.getItem().getId().equals(newExternalId.getItem().getId()) && itemExternalId.getItem().getPersistentId().equals(newExternalId.getItem().getPersistentId()) + && itemExternalId.getIdentifier().equals(newExternalId.getIdentifier()) && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) + contains.set(true); + } + } ); 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 db7cb954..25b44892 100644 --- a/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java +++ b/src/test/java/eu/sshopencloud/marketplace/controllers/items/ItemControllerITCase.java @@ -105,9 +105,9 @@ public class ItemControllerITCase { .header("Authorization", ADMINISTRATOR_JWT)) .andExpect(status().isOk()) .andExpect(jsonPath("items", hasSize(2))) - .andExpect(jsonPath("items[0].label", is(tool2.getLabel()))) + .andExpect(jsonPath("items[0].label", is(tool.getLabel()))) .andExpect(jsonPath("items[0].lastInfoUpdate", notNullValue())) - .andExpect(jsonPath("items[1].label", is(tool.getLabel()))) + .andExpect(jsonPath("items[1].label", is(tool2.getLabel()))) .andExpect(jsonPath("items[1].lastInfoUpdate", notNullValue())); } -- GitLab From c119c4e58af909683b8fd70adc1d376f496f0fae Mon Sep 17 00:00:00 2001 From: Eliza Kalata Date: Mon, 25 Apr 2022 13:50:13 +0200 Subject: [PATCH 2/2] Test fixing. --- .../validators/items/ItemExternalIdFactory.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java b/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java index 0bfd975c..4e18fb2c 100644 --- a/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java +++ b/src/main/java/eu/sshopencloud/marketplace/validators/items/ItemExternalIdFactory.java @@ -35,6 +35,7 @@ public class ItemExternalIdFactory { errors.pushNestedPath(nestedPath); ItemExternalId externalId = create(externalIds.get(i), item, errors); + if (externalId != null) { if (!processedExternalIds.contains(externalId)) { @@ -87,12 +88,13 @@ public class ItemExternalIdFactory { itemExternalIds.forEach( itemExternalId -> { - if (newExternalId.getIdentifier().isEmpty()) { + + if (!Objects.isNull(newExternalId.getItem().getId())) { if (itemExternalId.getItem().getId().equals(newExternalId.getItem().getId()) && itemExternalId.getItem().getPersistentId().equals(newExternalId.getItem().getPersistentId()) - && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) + && itemExternalId.getIdentifier().equals(newExternalId.getIdentifier()) && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) contains.set(true); } else { - if (itemExternalId.getItem().getId().equals(newExternalId.getItem().getId()) && itemExternalId.getItem().getPersistentId().equals(newExternalId.getItem().getPersistentId()) + if (itemExternalId.getItem().equals(newExternalId.getItem()) && itemExternalId.getIdentifier().equals(newExternalId.getIdentifier()) && itemExternalId.getIdentifierService().equals(newExternalId.getIdentifierService())) contains.set(true); } -- GitLab