Skip to content

Commit

Permalink
MODDCB-66 Adding item barcode and user type validation
Browse files Browse the repository at this point in the history
  • Loading branch information
Vignesh-kalyanasundaram committed Nov 23, 2023
1 parent 2a749ee commit 45be18e
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<InventoryItem> fetchItemByBarcode(@RequestParam("query") String query);
}
9 changes: 8 additions & 1 deletion src/main/java/org/folio/dcb/service/ItemService.java
Original file line number Diff line number Diff line change
@@ -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 {
/**
Expand All @@ -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<InventoryItem> fetchItemByBarcode(String itemBarcode);
}
21 changes: 21 additions & 0 deletions src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand All @@ -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);
Expand All @@ -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());
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 4 additions & 8 deletions src/main/java/org/folio/dcb/service/impl/ItemServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<InventoryItem> fetchItemByBarcode(String itemBarcode) {
log.debug("fetchItemByBarcode:: fetching item details for barcode {} ", itemBarcode);
return inventoryItemStorageClient.fetchItemByBarcode("barcode==" + itemBarcode);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/org/folio/dcb/service/impl/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@

import java.util.Objects;

import static org.folio.dcb.utils.DCBConstants.DCB_TYPE;

@Service
@RequiredArgsConstructor
@Log4j2
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
Expand Down Expand Up @@ -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();
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/folio/dcb/utils/DCBConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}

0 comments on commit 45be18e

Please sign in to comment.