diff --git a/src/main/java/org/folio/dcb/client/feign/InventoryItemStorageClient.java b/src/main/java/org/folio/dcb/client/feign/InventoryItemStorageClient.java index a03a1829..326938c5 100644 --- a/src/main/java/org/folio/dcb/client/feign/InventoryItemStorageClient.java +++ b/src/main/java/org/folio/dcb/client/feign/InventoryItemStorageClient.java @@ -2,12 +2,17 @@ import org.folio.dcb.domain.dto.InventoryItem; import org.folio.spring.config.FeignClientConfiguration; +import org.folio.spring.model.ResultList; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "item-storage", configuration = FeignClientConfiguration.class) public interface InventoryItemStorageClient { @GetMapping("/items/{itemId}") InventoryItem findItem(@PathVariable("itemId") String itemId); + + @GetMapping + ResultList fetchItemByBarcode(@RequestParam("query") String query); } diff --git a/src/main/java/org/folio/dcb/service/ItemService.java b/src/main/java/org/folio/dcb/service/ItemService.java index 14e93797..caacd4e4 100644 --- a/src/main/java/org/folio/dcb/service/ItemService.java +++ b/src/main/java/org/folio/dcb/service/ItemService.java @@ -1,6 +1,7 @@ package org.folio.dcb.service; import org.folio.dcb.domain.dto.InventoryItem; +import org.folio.spring.model.ResultList; public interface ItemService { /** @@ -16,5 +17,11 @@ public interface ItemService { * @return String value of material type Id. * */ String fetchItemMaterialTypeIdByMaterialTypeName(String materialTypeName); - String fetchItemMaterialTypeNameByMaterialTypeId(String materialTypeId); + + /** + * Get item details of an inventory by itemBarcode + * @param itemBarcode - barcode of an item + * @return InventoryItem + */ + ResultList fetchItemByBarcode(String itemBarcode); } diff --git a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java index 608f10ce..9123c263 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ObjectUtils; import org.folio.dcb.domain.dto.CirculationItemRequest; import org.folio.dcb.domain.dto.CirculationRequest; import org.folio.dcb.domain.dto.DcbTransaction; @@ -10,9 +11,11 @@ import org.folio.dcb.domain.entity.TransactionEntity; import org.folio.dcb.domain.mapper.TransactionMapper; import org.folio.dcb.exception.CirculationRequestException; +import org.folio.dcb.exception.ResourceAlreadyExistException; import org.folio.dcb.repository.TransactionRepository; import org.folio.dcb.service.CirculationItemService; import org.folio.dcb.service.CirculationService; +import org.folio.dcb.service.ItemService; import org.folio.dcb.service.RequestService; import org.folio.dcb.service.UserService; import org.springframework.stereotype.Service; @@ -28,6 +31,8 @@ import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.ITEM_CHECKED_IN; import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.ITEM_CHECKED_OUT; import static org.folio.dcb.domain.dto.TransactionStatus.StatusEnum.OPEN; +import static org.folio.dcb.utils.DCBConstants.DCB_TYPE; +import static org.folio.dcb.utils.DCBConstants.SHADOW_TYPE; @Service @RequiredArgsConstructor @@ -42,12 +47,17 @@ public class BaseLibraryService { private final UserService userService; private final RequestService requestService; private final TransactionMapper transactionMapper; + private final ItemService itemService; public TransactionStatusResponse createBorrowingLibraryTransaction(String dcbTransactionId, DcbTransaction dcbTransaction, String pickupServicePointId) { var itemVirtual = dcbTransaction.getItem(); var patron = dcbTransaction.getPatron(); var user = userService.fetchUser(patron); //user is needed, but shouldn't be generated. it should be fetched. + if(Objects.equals(user.getType(), "dcb")) { + throw new IllegalArgumentException(String.format("User with type %s is retrieved. so unable to create transaction", user.getType())); + } + checkItemExistsInInventoryAndThrow(itemVirtual.getBarcode()); circulationItemService.checkIfItemExistsAndCreate(itemVirtual, pickupServicePointId); CirculationRequest holdRequest = requestService.createHoldItemRequest(user, itemVirtual, pickupServicePointId); @@ -70,6 +80,12 @@ public void saveDcbTransaction(String dcbTransactionId, DcbTransaction dcbTransa transactionRepository.save(transactionEntity); } + public void checkUserTypeAndThrowIfMismatch(String userType) { + if(ObjectUtils.notEqual(userType, DCB_TYPE) && ObjectUtils.notEqual(userType, SHADOW_TYPE)) { + throw new IllegalArgumentException(String.format("User with type %s is retrieved. so unable to create transaction", userType)); + } + } + public void updateStatusByTransactionEntity(TransactionEntity transactionEntity) { log.debug("updateTransactionStatus:: Received checkIn event for itemId: {}", transactionEntity.getItemId()); CirculationItemRequest circulationItemRequest = circulationItemService.fetchItemById(transactionEntity.getItemId()); @@ -129,6 +145,11 @@ public void cancelTransactionEntity(TransactionEntity transactionEntity) { updateTransactionEntity(transactionEntity, CANCELLED); } + public void checkItemExistsInInventoryAndThrow(String itemBarcode) { + if(itemService.fetchItemByBarcode(itemBarcode).getTotalRecords() != 0) + throw new ResourceAlreadyExistException(String.format("Unable to create item with barcode %s as it exists in inventory ", itemBarcode)); + } + private void updateTransactionEntity(TransactionEntity transactionEntity, TransactionStatus.StatusEnum transactionStatusEnum) { log.debug("updateTransactionEntity:: updating transaction entity from {} to {}", transactionEntity.getStatus(), transactionStatusEnum); transactionEntity.setStatus(transactionStatusEnum); diff --git a/src/main/java/org/folio/dcb/service/impl/ItemServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/ItemServiceImpl.java index f8dd5a1b..949ab6c3 100644 --- a/src/main/java/org/folio/dcb/service/impl/ItemServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/ItemServiceImpl.java @@ -8,6 +8,7 @@ import org.folio.dcb.domain.dto.InventoryItem; import org.folio.dcb.service.ItemService; import org.folio.spring.exception.NotFoundException; +import org.folio.spring.model.ResultList; import org.springframework.stereotype.Service; @Service @@ -40,14 +41,9 @@ public String fetchItemMaterialTypeIdByMaterialTypeName(String materialTypeName) } @Override - public String fetchItemMaterialTypeNameByMaterialTypeId(String materialTypeId) { - log.debug("fetchItemMaterialTypeNameByMaterialTypeId:: Fetching ItemMaterialTypeName by MaterialTypeId={}", materialTypeId); - return materialTypeClient.fetchMaterialTypeByQuery(String.format("id==\"%s\"", materialTypeId)) - .getMtypes() - .stream() - .findFirst() - .map(org.folio.dcb.domain.dto.MaterialType::getName) - .orElseThrow(() -> new NotFoundException(String.format("MaterialType not found with id %s ", materialTypeId))); + public ResultList fetchItemByBarcode(String itemBarcode) { + log.debug("fetchItemByBarcode:: fetching item details for barcode {} ", itemBarcode); + return inventoryItemStorageClient.fetchItemByBarcode("barcode==" + itemBarcode); } } diff --git a/src/main/java/org/folio/dcb/service/impl/LendingLibraryServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/LendingLibraryServiceImpl.java index 7e627ed9..86984692 100644 --- a/src/main/java/org/folio/dcb/service/impl/LendingLibraryServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/LendingLibraryServiceImpl.java @@ -41,6 +41,7 @@ public TransactionStatusResponse createCirculation(String dcbTransactionId, DcbT var patron = dcbTransaction.getPatron(); var user = userService.fetchOrCreateUser(patron); + baseLibraryService.checkUserTypeAndThrowIfMismatch(user.getType()); CirculationRequest pageRequest = requestService.createPageItemRequest(user, item, pickupServicePointId); baseLibraryService.saveDcbTransaction(dcbTransactionId, dcbTransaction, pageRequest.getId()); diff --git a/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java index dd07c7ba..367e242b 100644 --- a/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java @@ -29,6 +29,7 @@ public TransactionStatusResponse createCirculation(String dcbTransactionId, DcbT var patron = dcbTransaction.getPatron(); var user = userService.fetchOrCreateUser(patron); + baseLibraryService.checkItemExistsInInventoryAndThrow(itemVirtual.getBarcode()); circulationItemService.checkIfItemExistsAndCreate(itemVirtual, pickupServicePointId); CirculationRequest holdRequest = requestService.createHoldItemRequest(user, itemVirtual, pickupServicePointId); diff --git a/src/main/java/org/folio/dcb/service/impl/UserServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/UserServiceImpl.java index c85eeeb9..028fdef1 100644 --- a/src/main/java/org/folio/dcb/service/impl/UserServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/UserServiceImpl.java @@ -13,6 +13,8 @@ import java.util.Objects; +import static org.folio.dcb.utils.DCBConstants.DCB_TYPE; + @Service @RequiredArgsConstructor @Log4j2 @@ -20,7 +22,6 @@ public class UserServiceImpl implements UserService { private final PatronGroupService patronGroupService; private final UsersClient usersClient; - private static final String DCB = "dcb"; private static final String LAST_NAME = "DcbSystem"; @Override @@ -74,7 +75,7 @@ private User createVirtualUser(DcbPatron patron, String groupId) { .barcode(patron.getBarcode()) .patronGroup(groupId) .id(patron.getId()) - .type(DCB) + .type(DCB_TYPE) .personal(Personal.builder().lastName(LAST_NAME).build()) .build(); } diff --git a/src/main/java/org/folio/dcb/utils/DCBConstants.java b/src/main/java/org/folio/dcb/utils/DCBConstants.java index 59f3bd5d..e197ffb3 100644 --- a/src/main/java/org/folio/dcb/utils/DCBConstants.java +++ b/src/main/java/org/folio/dcb/utils/DCBConstants.java @@ -22,4 +22,6 @@ private DCBConstants() {} public static final String DCB_LOAN_TYPE_NAME = "DCB Can circulate"; public static final String MATERIAL_TYPE_NAME_BOOK = "book"; public static final String DCB_CANCELLATION_REASON_NAME = "DCB Cancelled"; + public static final String DCB_TYPE = "dcb"; + public static final String SHADOW_TYPE = "shadow"; }