From 7bca4adaf5764d2b244bc36fe64fad12f8169ff7 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Mon, 2 Dec 2024 19:30:47 +0530 Subject: [PATCH 01/11] UXPROD-5001 create new api to update borrower hold details[re-request] --- .../controller/TransactionApiController.java | 8 +++++++ .../dcb/service/TransactionsService.java | 2 ++ .../dcb/service/impl/BaseLibraryService.java | 22 ++++++++++++++++++ .../impl/CirculationItemServiceImpl.java | 15 ++++++------ .../impl/PickupLibraryServiceImpl.java | 1 + .../service/impl/TransactionsServiceImpl.java | 15 ++++++++++++ .../swagger.api/dcb_transaction.yaml | 23 +++++++++++++++++++ 7 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/folio/dcb/controller/TransactionApiController.java b/src/main/java/org/folio/dcb/controller/TransactionApiController.java index c4279fb1..68586316 100644 --- a/src/main/java/org/folio/dcb/controller/TransactionApiController.java +++ b/src/main/java/org/folio/dcb/controller/TransactionApiController.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; @@ -74,4 +75,11 @@ public ResponseEntity getTransactionStatusL .body(transactionsService.getTransactionStatusList(fromDate, toDate, pageNumber, pageSize)); } + @Override + public ResponseEntity updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem) { + transactionsService.updateTransactionDetails(dcbTransactionId, dcbItem); + return ResponseEntity.status(HttpStatus.NO_CONTENT) + .build(); + } + } diff --git a/src/main/java/org/folio/dcb/service/TransactionsService.java b/src/main/java/org/folio/dcb/service/TransactionsService.java index 8d1fc190..679730e5 100644 --- a/src/main/java/org/folio/dcb/service/TransactionsService.java +++ b/src/main/java/org/folio/dcb/service/TransactionsService.java @@ -1,5 +1,6 @@ package org.folio.dcb.service; +import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; @@ -17,5 +18,6 @@ public interface TransactionsService { TransactionStatusResponse updateTransactionStatus(String dcbTransactionId, TransactionStatus transactionStatus); TransactionStatusResponse getTransactionStatusById(String dcbTransactionId); TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTime fromDate, OffsetDateTime toDate, Integer pageNumber, Integer pageSize); + void updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem); } 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 dc06a555..bc891aac 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -5,6 +5,8 @@ import org.apache.commons.lang3.ObjectUtils; import org.folio.dcb.domain.dto.CirculationItem; import org.folio.dcb.domain.dto.CirculationRequest; +import org.folio.dcb.domain.dto.DcbItem; +import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; @@ -54,6 +56,7 @@ public TransactionStatusResponse createBorrowingLibraryTransaction(String dcbTra } checkItemExistsInInventoryAndThrow(itemVirtual.getBarcode()); CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(itemVirtual, pickupServicePointId); + dcbTransaction.getItem().setId(item.getId()); checkOpenTransactionExistsAndThrow(item.getId()); CirculationRequest holdRequest = requestService.createHoldItemRequest(user, itemVirtual, pickupServicePointId); saveDcbTransaction(dcbTransactionId, dcbTransaction, holdRequest.getId()); @@ -133,4 +136,23 @@ public void updateTransactionEntity(TransactionEntity transactionEntity, Transac transactionEntity.setStatus(transactionStatusEnum); transactionRepository.save(transactionEntity); } + + public void updateTransactionDetails(TransactionEntity transactionEntity, DcbItem updatedItem) { + DcbPatron dcbPatron = transactionMapper.mapTransactionEntityToDcbPatron(transactionEntity); + checkItemExistsInInventoryAndThrow(updatedItem.getBarcode()); + CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(updatedItem, transactionEntity.getServicePointId()); + checkOpenTransactionExistsAndThrow(item.getId()); + cancelTransactionRequest(transactionEntity); + CirculationRequest holdRequest = requestService.createHoldItemRequest(userService.fetchUser(dcbPatron), updatedItem, transactionEntity.getServicePointId()); + updateItemDetailsAndSaveEntity(transactionEntity, item, holdRequest.getId()); + } + + private void updateItemDetailsAndSaveEntity(TransactionEntity transactionEntity, CirculationItem item, String requestId) { + transactionEntity.setItemId(item.getId()); + transactionEntity.setRequestId(UUID.fromString(requestId)); + transactionEntity.setItemBarcode(item.getBarcode()); + transactionEntity.setLendingLibraryCode(item.getLendingLibraryCode()); + transactionEntity.setStatus(CREATED); + transactionRepository.save(transactionEntity); + } } diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java index fe53443d..8eb60e3a 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import java.util.Objects; +import java.util.UUID; import static org.folio.dcb.domain.dto.ItemStatus.NameEnum.IN_TRANSIT; import static org.folio.dcb.utils.DCBConstants.HOLDING_ID; @@ -29,18 +30,18 @@ public class CirculationItemServiceImpl implements CirculationItemService { @Override public CirculationItem checkIfItemExistsAndCreate(DcbItem dcbItem, String pickupServicePointId) { - var dcbItemId = dcbItem.getId(); - log.debug("checkIfItemExistsAndCreate:: generate Circulation item by DcbItem with id={} if nit doesn't exist.", dcbItemId); - var circulationItem = fetchCirculationItemByIdAndBarcode(dcbItemId, dcbItem.getBarcode()); + var dcbItemBarcode = dcbItem.getBarcode(); + log.debug("checkIfItemExistsAndCreate:: generate Circulation item with barcode {} if it doesn't exist.", dcbItemBarcode); + var circulationItem = fetchCirculationItemByBarcode(dcbItem.getBarcode()); if(Objects.isNull(circulationItem)) { - log.warn("Circulation item not found by id={}. Creating it.", dcbItemId); + log.warn("checkIfItemExistsAndCreate:: Circulation item not found by barcode={}. Creating it.", dcbItemBarcode); circulationItem = createCirculationItem(dcbItem, pickupServicePointId); } return circulationItem; } - private CirculationItem fetchCirculationItemByIdAndBarcode(String id, String barcode) { - return circulationItemClient.fetchItemByIdAndBarcode("id==" + id + " and barcode==" + barcode) + private CirculationItem fetchCirculationItemByBarcode(String barcode) { + return circulationItemClient.fetchItemByIdAndBarcode("barcode==" + barcode) .getItems() .stream() .findFirst() @@ -59,7 +60,7 @@ private CirculationItem createCirculationItem(DcbItem item, String pickupService CirculationItem circulationItem = CirculationItem.builder() - .id(item.getId()) + .id(UUID.randomUUID().toString()) .barcode(item.getBarcode()) .status(ItemStatus.builder() .name(IN_TRANSIT) 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 88a5495d..677235bb 100644 --- a/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/PickupLibraryServiceImpl.java @@ -33,6 +33,7 @@ public TransactionStatusResponse createCirculation(String dcbTransactionId, DcbT baseLibraryService.checkUserTypeAndThrowIfMismatch(user.getType()); baseLibraryService.checkItemExistsInInventoryAndThrow(itemVirtual.getBarcode()); CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(itemVirtual, dcbTransaction.getPickup().getServicePointId()); + dcbTransaction.getItem().setId(item.getId()); baseLibraryService.checkOpenTransactionExistsAndThrow(item.getId()); CirculationRequest holdRequest = requestService.createHoldItemRequest(user, itemVirtual, dcbTransaction.getPickup().getServicePointId()); baseLibraryService.saveDcbTransaction(dcbTransactionId, dcbTransaction, holdRequest.getId()); diff --git a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java index 64b41d20..d6a3ef0c 100644 --- a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; @@ -39,6 +40,7 @@ public class TransactionsServiceImpl implements TransactionsService { private final StatusProcessorService statusProcessorService; private final TransactionMapper transactionMapper; private final TransactionAuditRepository transactionAuditRepository; + private final BaseLibraryService baseLibraryService; @Override public TransactionStatusResponse createCirculationRequest(String dcbTransactionId, DcbTransaction dcbTransaction) { @@ -109,6 +111,19 @@ public TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTi .build(); } + @Override + public void updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem) { + var transactionEntity = getTransactionEntityOrThrow(dcbTransactionId); + if (!TransactionStatus.StatusEnum.CREATED.equals(transactionEntity.getStatus())) { + throw new StatusException(String.format( + "Transaction details should not be updated from %s status, it can be updated only from CREATED status", transactionEntity.getStatus())); + } + if (DcbTransaction.RoleEnum.LENDER.equals(transactionEntity.getRole())) { + throw new IllegalArgumentException("Item details should be updated for lender role"); + } + baseLibraryService.updateTransactionDetails(transactionEntity, dcbItem); + } + private TransactionStatusResponse generateTransactionStatusResponseFromTransactionEntity(TransactionEntity transactionEntity) { TransactionStatus.StatusEnum transactionStatus = transactionEntity.getStatus(); TransactionStatusResponse.StatusEnum transactionStatusResponseStatusEnum = TransactionStatusResponse.StatusEnum.fromValue(transactionStatus.getValue()); diff --git a/src/main/resources/swagger.api/dcb_transaction.yaml b/src/main/resources/swagger.api/dcb_transaction.yaml index a2ba2083..f013d698 100644 --- a/src/main/resources/swagger.api/dcb_transaction.yaml +++ b/src/main/resources/swagger.api/dcb_transaction.yaml @@ -24,6 +24,22 @@ paths: $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' + patch: + description: Update the details of a transaction + operationId: updateTransactionDetails + tags: + - circulation + parameters: + - $ref: '#/components/parameters/dcbTransactionId' + requestBody: + $ref: "#/components/requestBodies/DCBItem" + responses: + '204': + description: 'Transaction updated successfully' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' /transactions/{dcbTransactionId}/status: parameters: - $ref: '#/components/parameters/dcbTransactionId' @@ -110,6 +126,13 @@ components: application/json: schema: $ref: "schemas/dcbTransaction.yaml#/DcbTransaction" + DCBItem: + description: DCB item object + required: true + content: + application/json: + schema: + $ref: "schemas/dcbItem.yaml#/DcbItem" responses: TransactionStatus: description: Transaction Status object From a06f071ec7badad4f59cd6815d4d20458cc062ce Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Tue, 3 Dec 2024 20:04:54 +0530 Subject: [PATCH 02/11] UXPROD-5001 create new api to update borrower hold details[re-request] --- descriptors/ModuleDescriptor-template.json | 28 +++++++++++++++++-- .../controller/TransactionApiController.java | 6 ++-- .../dcb/domain/mapper/TransactionMapper.java | 11 ++++++++ .../dcb/service/TransactionsService.java | 4 +-- .../dcb/service/impl/BaseLibraryService.java | 12 +++++--- .../impl/CirculationItemServiceImpl.java | 6 ++-- .../service/impl/TransactionsServiceImpl.java | 6 ++-- .../swagger.api/dcb_transaction.yaml | 10 +++---- 8 files changed, 61 insertions(+), 22 deletions(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 1b52f2b1..a5baee12 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -113,7 +113,7 @@ ], "pathPattern": "/transactions/{dcbTransactionId}/status", "permissionsRequired": [ - "dcb.transactions.get" + "dcb.transactions.status.get" ], "modulePermissions": [] }, @@ -123,7 +123,7 @@ ], "pathPattern": "/transactions/{dcbTransactionId}/status", "permissionsRequired": [ - "dcb.transactions.put" + "dcb.transactions.status.put" ], "modulePermissions": [ "circulation.check-out-by-barcode.post", @@ -141,6 +141,30 @@ "dcb.transactions.collection.get" ], "modulePermissions": [] + }, + { + "methods": [ + "PUT" + ], + "pathPattern": "/transactions/{dcbTransactionId}", + "permissionsRequired": [ + "dcb.transactions.put" + ], + "modulePermissions": [ + "inventory-storage.items.item.get", + "inventory-storage.items.collection.get", + "inventory-storage.holdings.item.get", + "circulation.requests.item.post", + "circulation.requests.item.put", + "circulation-item.item.post", + "circulation-item.collection.get", + "circulation-item.item.get", + "inventory-storage.material-types.collection.get", + "inventory-storage.loan-types.collection.get", + "circulation-storage.requests.item.get", + "circulation-storage.cancellation-reasons.item.get", + "circulation-storage.cancellation-reasons.item.post" + ] } ] }, diff --git a/src/main/java/org/folio/dcb/controller/TransactionApiController.java b/src/main/java/org/folio/dcb/controller/TransactionApiController.java index 68586316..6c40b597 100644 --- a/src/main/java/org/folio/dcb/controller/TransactionApiController.java +++ b/src/main/java/org/folio/dcb/controller/TransactionApiController.java @@ -2,8 +2,8 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; +import org.folio.dcb.domain.dto.DcbTransactionUpdate; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; import org.folio.dcb.rest.resource.TransactionsApi; @@ -76,8 +76,8 @@ public ResponseEntity getTransactionStatusL } @Override - public ResponseEntity updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem) { - transactionsService.updateTransactionDetails(dcbTransactionId, dcbItem); + public ResponseEntity updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate) { + transactionsService.updateTransactionDetails(dcbTransactionId, dcbTransactionUpdate); return ResponseEntity.status(HttpStatus.NO_CONTENT) .build(); } diff --git a/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java b/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java index 1b093f06..ba1762d5 100644 --- a/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java +++ b/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java @@ -3,6 +3,7 @@ import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbPickup; +import org.folio.dcb.domain.dto.DcbTransactionUpdateItem; import org.folio.dcb.domain.dto.TransactionStatusResponseList; import org.folio.dcb.domain.entity.TransactionAuditEntity; import org.folio.dcb.domain.entity.TransactionEntity; @@ -91,4 +92,14 @@ public DcbPickup mapTransactionEntityToDcbPickup(TransactionEntity transactionEn .build(); } + public DcbItem convertTransactionUpdateItemToDcbItem(DcbTransactionUpdateItem updatedItem, TransactionEntity entity) { + return DcbItem + .builder() + .lendingLibraryCode(updatedItem.getLendingLibraryCode()) + .barcode(updatedItem.getBarcode()) + .materialType(updatedItem.getMaterialType()) + .title(entity.getItemTitle()) + .build(); + } + } diff --git a/src/main/java/org/folio/dcb/service/TransactionsService.java b/src/main/java/org/folio/dcb/service/TransactionsService.java index 679730e5..f08b64c9 100644 --- a/src/main/java/org/folio/dcb/service/TransactionsService.java +++ b/src/main/java/org/folio/dcb/service/TransactionsService.java @@ -1,7 +1,7 @@ package org.folio.dcb.service; -import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; +import org.folio.dcb.domain.dto.DcbTransactionUpdate; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; @@ -18,6 +18,6 @@ public interface TransactionsService { TransactionStatusResponse updateTransactionStatus(String dcbTransactionId, TransactionStatus transactionStatus); TransactionStatusResponse getTransactionStatusById(String dcbTransactionId); TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTime fromDate, OffsetDateTime toDate, Integer pageNumber, Integer pageSize); - void updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem); + void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate); } 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 bc891aac..e1850e1f 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -8,6 +8,7 @@ import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbTransaction; +import org.folio.dcb.domain.dto.DcbTransactionUpdateItem; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.entity.TransactionEntity; @@ -137,13 +138,16 @@ public void updateTransactionEntity(TransactionEntity transactionEntity, Transac transactionRepository.save(transactionEntity); } - public void updateTransactionDetails(TransactionEntity transactionEntity, DcbItem updatedItem) { + public void updateTransactionDetails(TransactionEntity transactionEntity, DcbTransactionUpdateItem updatedItem) { DcbPatron dcbPatron = transactionMapper.mapTransactionEntityToDcbPatron(transactionEntity); - checkItemExistsInInventoryAndThrow(updatedItem.getBarcode()); - CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(updatedItem, transactionEntity.getServicePointId()); + DcbItem dcbItem = transactionMapper.convertTransactionUpdateItemToDcbItem(updatedItem, transactionEntity); + checkItemExistsInInventoryAndThrow(dcbItem.getBarcode()); + CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(dcbItem, transactionEntity.getServicePointId()); + dcbItem.setId(item.getId()); checkOpenTransactionExistsAndThrow(item.getId()); cancelTransactionRequest(transactionEntity); - CirculationRequest holdRequest = requestService.createHoldItemRequest(userService.fetchUser(dcbPatron), updatedItem, transactionEntity.getServicePointId()); + CirculationRequest holdRequest = requestService.createHoldItemRequest(userService.fetchUser(dcbPatron), dcbItem, + transactionEntity.getServicePointId()); updateItemDetailsAndSaveEntity(transactionEntity, item, holdRequest.getId()); } diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java index 8eb60e3a..09b8e344 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java @@ -57,10 +57,10 @@ private CirculationItem createCirculationItem(DcbItem item, String pickupService //SetupDefaultMaterialTypeIfNotGiven String materialType = StringUtils.isBlank(item.getMaterialType()) ? MATERIAL_TYPE_NAME_BOOK : item.getMaterialType(); var materialTypeId = itemService.fetchItemMaterialTypeIdByMaterialTypeName(materialType); - + var itemId = UUID.randomUUID().toString(); CirculationItem circulationItem = CirculationItem.builder() - .id(UUID.randomUUID().toString()) + .id(itemId) .barcode(item.getBarcode()) .status(ItemStatus.builder() .name(IN_TRANSIT) @@ -73,6 +73,6 @@ private CirculationItem createCirculationItem(DcbItem item, String pickupService .lendingLibraryCode(item.getLendingLibraryCode()) .build(); - return circulationItemClient.createCirculationItem(item.getId(), circulationItem); + return circulationItemClient.createCirculationItem(itemId, circulationItem); } } diff --git a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java index d6a3ef0c..d8df60bf 100644 --- a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java @@ -2,8 +2,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbTransaction; +import org.folio.dcb.domain.dto.DcbTransactionUpdate; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; @@ -112,7 +112,7 @@ public TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTi } @Override - public void updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem) { + public void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate) { var transactionEntity = getTransactionEntityOrThrow(dcbTransactionId); if (!TransactionStatus.StatusEnum.CREATED.equals(transactionEntity.getStatus())) { throw new StatusException(String.format( @@ -121,7 +121,7 @@ public void updateTransactionDetails(String dcbTransactionId, DcbItem dcbItem) { if (DcbTransaction.RoleEnum.LENDER.equals(transactionEntity.getRole())) { throw new IllegalArgumentException("Item details should be updated for lender role"); } - baseLibraryService.updateTransactionDetails(transactionEntity, dcbItem); + baseLibraryService.updateTransactionDetails(transactionEntity, dcbTransactionUpdate.getItem()); } private TransactionStatusResponse generateTransactionStatusResponseFromTransactionEntity(TransactionEntity transactionEntity) { diff --git a/src/main/resources/swagger.api/dcb_transaction.yaml b/src/main/resources/swagger.api/dcb_transaction.yaml index f013d698..ea49ca94 100644 --- a/src/main/resources/swagger.api/dcb_transaction.yaml +++ b/src/main/resources/swagger.api/dcb_transaction.yaml @@ -24,7 +24,7 @@ paths: $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' - patch: + put: description: Update the details of a transaction operationId: updateTransactionDetails tags: @@ -32,7 +32,7 @@ paths: parameters: - $ref: '#/components/parameters/dcbTransactionId' requestBody: - $ref: "#/components/requestBodies/DCBItem" + $ref: "#/components/requestBodies/DCBTransactionUpdate" responses: '204': description: 'Transaction updated successfully' @@ -126,13 +126,13 @@ components: application/json: schema: $ref: "schemas/dcbTransaction.yaml#/DcbTransaction" - DCBItem: - description: DCB item object + DCBTransactionUpdate: + description: DCB transaction update object required: true content: application/json: schema: - $ref: "schemas/dcbItem.yaml#/DcbItem" + $ref: "schemas/DcbTransactionUpdate.yaml#/DcbTransactionUpdate" responses: TransactionStatus: description: Transaction Status object From ca6d1c7142f27f8f820ad1dba339d78704d3da16 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Tue, 3 Dec 2024 20:05:11 +0530 Subject: [PATCH 03/11] UXPROD-5001 create new api to update borrower hold details[re-request] --- .../schemas/DcbTransactionUpdate.yaml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml diff --git a/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml b/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml new file mode 100644 index 00000000..98156878 --- /dev/null +++ b/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml @@ -0,0 +1,22 @@ +DcbTransactionUpdate: + type: object + properties: + item: + properties: + barcode: + description: The barcode of the item as specified in the lending library + type: string + required: true + materialType: + description: The “hub-normalized” form of the item item type, used in the circulation rules for determining the correct loan policy. + type: string + required: true + lendingLibraryCode: + description: The code which identifies the lending library + type: string + additionalProperties: false + required: + - barcode + - materialType + - lendingLibraryCode + From 22d3df7884ab8a233264c9fe06eea30df9ae69c6 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Wed, 4 Dec 2024 08:14:38 +0530 Subject: [PATCH 04/11] UXPROD-5005 Fixing failed test cases --- .../folio/dcb/service/impl/CirculationItemServiceImpl.java | 3 ++- .../java/org/folio/dcb/service/BaseLibraryServiceTest.java | 5 ++++- src/test/resources/mappings/circulation-item.json | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java index 09b8e344..2d2c376b 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java @@ -9,6 +9,7 @@ import org.folio.dcb.domain.dto.ItemStatus; import org.folio.dcb.service.CirculationItemService; import org.folio.dcb.service.ItemService; +import org.folio.util.StringUtil; import org.springframework.stereotype.Service; import java.util.Objects; @@ -41,7 +42,7 @@ public CirculationItem checkIfItemExistsAndCreate(DcbItem dcbItem, String pickup } private CirculationItem fetchCirculationItemByBarcode(String barcode) { - return circulationItemClient.fetchItemByIdAndBarcode("barcode==" + barcode) + return circulationItemClient.fetchItemByIdAndBarcode("barcode==" + StringUtil.cqlEncode(barcode)) .getItems() .stream() .findFirst() diff --git a/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java b/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java index 82853ca4..8185d8d4 100644 --- a/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java +++ b/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java @@ -110,15 +110,18 @@ void createBorrowingTransactionTest() { var patron = createDcbPatronWithExactPatronId(EXISTED_PATRON_ID); var user = createUser(); user.setType("shadow"); + var circulationItem = createCirculationItem(); when(userService.fetchUser(any())) .thenReturn(user); when(requestService.createHoldItemRequest(any(), any(), anyString())).thenReturn(createCirculationRequest()); when(transactionMapper.mapToEntity(any(), any())).thenReturn(createTransactionEntity()); when(itemService.fetchItemByBarcode(item.getBarcode())).thenReturn(new ResultList<>()); - when(circulationItemService.checkIfItemExistsAndCreate(any(), any())).thenReturn(createCirculationItem()); + when(circulationItemService.checkIfItemExistsAndCreate(any(), any())).thenReturn(circulationItem); var response = baseLibraryService.createBorrowingLibraryTransaction(DCB_TRANSACTION_ID, createDcbTransactionByRole(BORROWER), PICKUP_SERVICE_POINT_ID); verify(userService).fetchUser(patron); + // Circulation item id will be set as dcb item id in the code, hence setting it for assertion + item.setId(circulationItem.getId()); verify(requestService).createHoldItemRequest(user, item, PICKUP_SERVICE_POINT_ID); verify(transactionRepository).save(any()); Assertions.assertEquals(TransactionStatusResponse.StatusEnum.CREATED, response.getStatus()); diff --git a/src/test/resources/mappings/circulation-item.json b/src/test/resources/mappings/circulation-item.json index d8a08687..ba13ee85 100644 --- a/src/test/resources/mappings/circulation-item.json +++ b/src/test/resources/mappings/circulation-item.json @@ -3,7 +3,7 @@ { "request": { "method": "POST", - "url": "/circulation-item/5b95877d-86c0-4cb7-a0cd-7660b348ae5a" + "urlPathPattern": "/circulation-item/.*" }, "response": { "status": 201, @@ -55,7 +55,7 @@ { "request": { "method": "GET", - "url": "/circulation-item?query=id%3D%3D5b95877d-86c0-4cb7-a0cd-7660b348ae5a%20and%20barcode%3D%3DDCB_ITEM" + "url": "/circulation-item?query=barcode%3D%3D%22DCB_ITEM%22" }, "response": { "status": 200, @@ -68,7 +68,7 @@ { "request": { "method": "GET", - "url": "/circulation-item?query=id%3D%3D5b95877d-86c0-4cb7-a0cd-7660b348ae5a%20and%20barcode%3D%3DnewItem" + "url": "/circulation-item?query=barcode%3D%3D%22newItem%22" }, "response": { "status": 200, From 2bc110026c31464d1b46690c43978a0c65dfe0bf Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Wed, 4 Dec 2024 11:54:01 +0530 Subject: [PATCH 05/11] UXPROD-5054 Code refactoring --- .../java/org/folio/dcb/client/feign/CirculationItemClient.java | 2 +- .../org/folio/dcb/service/impl/CirculationItemServiceImpl.java | 2 +- .../org/folio/dcb/service/impl/TransactionsServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/folio/dcb/client/feign/CirculationItemClient.java b/src/main/java/org/folio/dcb/client/feign/CirculationItemClient.java index 1216c069..c8694954 100644 --- a/src/main/java/org/folio/dcb/client/feign/CirculationItemClient.java +++ b/src/main/java/org/folio/dcb/client/feign/CirculationItemClient.java @@ -19,4 +19,4 @@ public interface CirculationItemClient { CirculationItem retrieveCirculationItemById(@PathVariable("circulationItemId") String circulationItemId); @GetMapping - CirculationItemCollection fetchItemByIdAndBarcode(@RequestParam("query") String query);} + CirculationItemCollection fetchItemByCqlQuery(@RequestParam("query") String query);} diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java index 2d2c376b..2e782a87 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationItemServiceImpl.java @@ -42,7 +42,7 @@ public CirculationItem checkIfItemExistsAndCreate(DcbItem dcbItem, String pickup } private CirculationItem fetchCirculationItemByBarcode(String barcode) { - return circulationItemClient.fetchItemByIdAndBarcode("barcode==" + StringUtil.cqlEncode(barcode)) + return circulationItemClient.fetchItemByCqlQuery("barcode==" + StringUtil.cqlEncode(barcode)) .getItems() .stream() .findFirst() diff --git a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java index d8df60bf..9283501f 100644 --- a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java @@ -119,7 +119,7 @@ public void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpda "Transaction details should not be updated from %s status, it can be updated only from CREATED status", transactionEntity.getStatus())); } if (DcbTransaction.RoleEnum.LENDER.equals(transactionEntity.getRole())) { - throw new IllegalArgumentException("Item details should be updated for lender role"); + throw new IllegalArgumentException("Item details cannot be updated for lender role"); } baseLibraryService.updateTransactionDetails(transactionEntity, dcbTransactionUpdate.getItem()); } From 61452eb5c81bbe1165809fb4f77cd7cd37395135 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Wed, 4 Dec 2024 18:10:05 +0530 Subject: [PATCH 06/11] UXPROD-5054 Code refactoring --- .../java/org/folio/dcb/service/impl/BaseLibraryService.java | 6 ++++-- .../resources/swagger.api/schemas/DcbTransactionUpdate.yaml | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) 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 e1850e1f..812aaf1c 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -148,14 +148,16 @@ public void updateTransactionDetails(TransactionEntity transactionEntity, DcbTra cancelTransactionRequest(transactionEntity); CirculationRequest holdRequest = requestService.createHoldItemRequest(userService.fetchUser(dcbPatron), dcbItem, transactionEntity.getServicePointId()); - updateItemDetailsAndSaveEntity(transactionEntity, item, holdRequest.getId()); + updateItemDetailsAndSaveEntity(transactionEntity, item, dcbItem.getMaterialType(), holdRequest.getId()); } - private void updateItemDetailsAndSaveEntity(TransactionEntity transactionEntity, CirculationItem item, String requestId) { + private void updateItemDetailsAndSaveEntity(TransactionEntity transactionEntity, CirculationItem item, + String materialType, String requestId) { transactionEntity.setItemId(item.getId()); transactionEntity.setRequestId(UUID.fromString(requestId)); transactionEntity.setItemBarcode(item.getBarcode()); transactionEntity.setLendingLibraryCode(item.getLendingLibraryCode()); + transactionEntity.setMaterialType(materialType); transactionEntity.setStatus(CREATED); transactionRepository.save(transactionEntity); } diff --git a/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml b/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml index 98156878..a0ae4a40 100644 --- a/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml +++ b/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml @@ -6,11 +6,9 @@ DcbTransactionUpdate: barcode: description: The barcode of the item as specified in the lending library type: string - required: true materialType: description: The “hub-normalized” form of the item item type, used in the circulation rules for determining the correct loan policy. type: string - required: true lendingLibraryCode: description: The code which identifies the lending library type: string From 906e8c923448fd863e51ab51d42f7afeb850b9df Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Wed, 4 Dec 2024 23:15:21 +0530 Subject: [PATCH 07/11] UXPROD-5054 Adding new flag to suppress notification and restrict the kafka message processing based on cancellationAdditionalInfo --- .../listener/kafka/CirculationEventListener.java | 6 ++++-- .../org/folio/dcb/listener/kafka/EventData.java | 1 + .../org/folio/dcb/service/CirculationService.java | 15 ++++++++++++++- .../dcb/service/impl/BaseLibraryService.java | 4 ++-- .../dcb/service/impl/CirculationServiceImpl.java | 8 +++++++- .../java/org/folio/dcb/utils/DCBConstants.java | 1 + .../org/folio/dcb/utils/TransactionHelper.java | 3 +++ .../swagger.api/schemas/CirculationRequest.yaml | 3 +++ .../folio/dcb/service/BaseLibraryServiceTest.java | 3 ++- .../folio/dcb/service/CirculationServiceTest.java | 4 ++-- 10 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java b/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java index 49069a2a..839f0dc6 100644 --- a/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java +++ b/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java @@ -17,6 +17,7 @@ import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.BORROWING_PICKUP; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.LENDER; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.PICKUP; +import static org.folio.dcb.utils.DCBConstants.ITEM_UNAVAILABLE_CANCELLATION_MSG; import static org.folio.dcb.utils.TransactionHelper.getHeaderValue; import static org.folio.dcb.utils.TransactionHelper.parseLoanEvent; import static org.folio.dcb.utils.TransactionHelper.parseRequestEvent; @@ -78,14 +79,15 @@ public void handleRequestEvent(String data, MessageHeaders messageHeaders) { systemUserScopedExecutionService.executeAsyncSystemUserScoped(tenantId, () -> transactionRepository.findTransactionByRequestIdAndStatusNotInClosed(UUID.fromString(requestId)) .ifPresent(transactionEntity -> { - if (eventData.getType() == EventData.EventType.CANCEL) { + if (eventData.getType() == EventData.EventType.CANCEL && + !ITEM_UNAVAILABLE_CANCELLATION_MSG.equals(eventData.getCancellationAdditionalInformation())) { baseLibraryService.cancelTransactionEntity(transactionEntity); } else if (eventData.getType() == EventData.EventType.IN_TRANSIT && transactionEntity.getRole() == LENDER) { baseLibraryService.updateTransactionEntity(transactionEntity, TransactionStatus.StatusEnum.OPEN); } else if (eventData.getType() == EventData.EventType.AWAITING_PICKUP && (transactionEntity.getRole() == BORROWING_PICKUP || transactionEntity.getRole() == PICKUP)) { baseLibraryService.updateTransactionEntity(transactionEntity, TransactionStatus.StatusEnum.AWAITING_PICKUP); } else { - log.info("handleRequestEvent:: status for event {} can not be updated", eventData.getType()); + log.info("handleRequestEvent:: status for event {} can not be updated", eventData); } }) ); diff --git a/src/main/java/org/folio/dcb/listener/kafka/EventData.java b/src/main/java/org/folio/dcb/listener/kafka/EventData.java index 0b786a2b..579f16e0 100644 --- a/src/main/java/org/folio/dcb/listener/kafka/EventData.java +++ b/src/main/java/org/folio/dcb/listener/kafka/EventData.java @@ -8,6 +8,7 @@ public class EventData { private String itemId; private String requestId; private boolean isDcb; + private String cancellationAdditionalInformation; public enum EventType { CHECK_IN, CHECK_OUT, IN_TRANSIT, AWAITING_PICKUP, CANCEL diff --git a/src/main/java/org/folio/dcb/service/CirculationService.java b/src/main/java/org/folio/dcb/service/CirculationService.java index 319c7e20..e8641865 100644 --- a/src/main/java/org/folio/dcb/service/CirculationService.java +++ b/src/main/java/org/folio/dcb/service/CirculationService.java @@ -17,5 +17,18 @@ public interface CirculationService { */ void checkOutByBarcode(TransactionEntity dcbTransaction); - void cancelRequest(TransactionEntity dcbTransaction); + /** + * Cancels a transaction request based on the provided transaction details. + *

+ * If {@code isItemUnavailableCancellation} is {@code true}, the cancellation reason + * will be updated to indicate item unavailability, and the notification for this + * cancellation will be suppressed by setting the {@code suppressNotification} flag + * to {@code true}. + *

+ * + * @param dcbTransaction the transaction entity representing the request to be canceled + * @param isItemUnavailableCancellation a flag indicating whether the cancellation is due to item unavailability + * (true if the item is unavailable, false otherwise) + */ + void cancelRequest(TransactionEntity dcbTransaction, boolean isItemUnavailableCancellation); } 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 812aaf1c..e1f6345c 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -110,7 +110,7 @@ public void updateTransactionStatus(TransactionEntity dcbTransaction, Transactio public void cancelTransactionRequest(TransactionEntity transactionEntity){ try { - circulationService.cancelRequest(transactionEntity); + circulationService.cancelRequest(transactionEntity, false); } catch (CirculationRequestException e) { updateTransactionEntity(transactionEntity, TransactionStatus.StatusEnum.ERROR); } @@ -145,7 +145,7 @@ public void updateTransactionDetails(TransactionEntity transactionEntity, DcbTra CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(dcbItem, transactionEntity.getServicePointId()); dcbItem.setId(item.getId()); checkOpenTransactionExistsAndThrow(item.getId()); - cancelTransactionRequest(transactionEntity); + circulationService.cancelRequest(transactionEntity, true); CirculationRequest holdRequest = requestService.createHoldItemRequest(userService.fetchUser(dcbPatron), dcbItem, transactionEntity.getServicePointId()); updateItemDetailsAndSaveEntity(transactionEntity, item, dcbItem.getMaterialType(), holdRequest.getId()); diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java index 9934385f..bf6496af 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java @@ -14,6 +14,8 @@ import org.springframework.stereotype.Service; import java.time.OffsetDateTime; +import static org.folio.dcb.utils.DCBConstants.ITEM_UNAVAILABLE_CANCELLATION_MSG; + @Service @Log4j2 @RequiredArgsConstructor @@ -41,11 +43,15 @@ public void checkOutByBarcode(TransactionEntity dcbTransaction) { } @Override - public void cancelRequest(TransactionEntity dcbTransaction) { + public void cancelRequest(TransactionEntity dcbTransaction, boolean isItemUnavailableCancellation) { log.debug("cancelRequest:: cancelling request using request id {} ", dcbTransaction.getRequestId()); CirculationRequest request = circulationStorageService.getCancellationRequestIfOpenOrNull(dcbTransaction.getRequestId().toString()); if (request != null){ try { + if (isItemUnavailableCancellation) { + request.setCancellationAdditionalInformation(ITEM_UNAVAILABLE_CANCELLATION_MSG); + request.setIsSuppressNotification(true); + } circulationClient.updateRequest(request.getId(), request); } catch (FeignException e) { log.warn("cancelRequest:: error cancelling request using request id {} ", dcbTransaction.getRequestId(), e); diff --git a/src/main/java/org/folio/dcb/utils/DCBConstants.java b/src/main/java/org/folio/dcb/utils/DCBConstants.java index 12bca85e..e650dcb8 100644 --- a/src/main/java/org/folio/dcb/utils/DCBConstants.java +++ b/src/main/java/org/folio/dcb/utils/DCBConstants.java @@ -26,4 +26,5 @@ private DCBConstants() {} public static final String SHADOW_TYPE = "shadow"; public static final String HOLDING_SOURCE = "folio"; public static final String DCB_CALENDAR_NAME = "DCB Calendar"; + public static final String ITEM_UNAVAILABLE_CANCELLATION_MSG = "Request cancelled due to item unavailability"; } diff --git a/src/main/java/org/folio/dcb/utils/TransactionHelper.java b/src/main/java/org/folio/dcb/utils/TransactionHelper.java index 6468ad25..5613bcc4 100644 --- a/src/main/java/org/folio/dcb/utils/TransactionHelper.java +++ b/src/main/java/org/folio/dcb/utils/TransactionHelper.java @@ -22,6 +22,7 @@ public class TransactionHelper { public static final String LASTNAME = "lastName"; public static final String DCB_INSTANCE_TITLE = "DCB_INSTANCE"; public static final String DCB_REQUESTER_LASTNAME = "DcbSystem"; + public static final String CANCELLATION_ADDITIONAL_INFORMATION = "cancellationAdditionalInformation"; private TransactionHelper(){} @@ -65,6 +66,8 @@ public static EventData parseRequestEvent(String eventPayload){ default -> log.info("parseRequestEvent:: Request status {} is not supported", requestStatus); } eventData.setDcb(checkDcbRequest(kafkaEvent)); + eventData.setCancellationAdditionalInformation(kafkaEvent.getNewNode().has(CANCELLATION_ADDITIONAL_INFORMATION) ? + kafkaEvent.getNewNode().get(CANCELLATION_ADDITIONAL_INFORMATION).asText() : null); return eventData; } return null; diff --git a/src/main/resources/swagger.api/schemas/CirculationRequest.yaml b/src/main/resources/swagger.api/schemas/CirculationRequest.yaml index a8fb0c56..71e61615 100644 --- a/src/main/resources/swagger.api/schemas/CirculationRequest.yaml +++ b/src/main/resources/swagger.api/schemas/CirculationRequest.yaml @@ -77,6 +77,9 @@ CirculationRequest: pickupServicePointId: description: The ID of the Service Point where this request can be picked up type: string + isSuppressNotification: + description: Flag to suppress sending cancellation notifications. If true, no notification will be sent when cancelling the request + type: boolean item: $ref: CirculationRequest.yaml#/item requester: diff --git a/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java b/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java index 8185d8d4..32241206 100644 --- a/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java +++ b/src/test/java/org/folio/dcb/service/BaseLibraryServiceTest.java @@ -39,6 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import static org.mockito.Mockito.times; @@ -188,7 +189,7 @@ void testTransactionCancelTest(){ transactionEntity.setStatus(OPEN); TransactionStatus transactionStatus = TransactionStatus.builder().status(CANCELLED).build(); baseLibraryService.updateTransactionStatus(transactionEntity, transactionStatus); - verify(circulationService).cancelRequest(any()); + verify(circulationService).cancelRequest(any(), eq(false)); } @Test diff --git a/src/test/java/org/folio/dcb/service/CirculationServiceTest.java b/src/test/java/org/folio/dcb/service/CirculationServiceTest.java index eb461539..77f62ec3 100644 --- a/src/test/java/org/folio/dcb/service/CirculationServiceTest.java +++ b/src/test/java/org/folio/dcb/service/CirculationServiceTest.java @@ -47,7 +47,7 @@ void checkInByBarcodeWithServicePointTest(){ @Test void cancelRequestTest() { when(circulationRequestService.getCancellationRequestIfOpenOrNull(anyString())).thenReturn(createCirculationRequest()); - circulationService.cancelRequest(createTransactionEntity()); + circulationService.cancelRequest(createTransactionEntity(), false); verify(circulationClient).updateRequest(anyString(), any()); } @@ -55,7 +55,7 @@ void cancelRequestTest() { void shouldThrowExceptionWhenRequestIsNotUpdated() { when(circulationRequestService.getCancellationRequestIfOpenOrNull(anyString())).thenReturn(createCirculationRequest()); when(circulationClient.updateRequest(anyString(), any())).thenThrow(FeignException.BadRequest.class); - assertThrows(CirculationRequestException.class, () -> circulationService.cancelRequest(createTransactionEntity())); + assertThrows(CirculationRequestException.class, () -> circulationService.cancelRequest(createTransactionEntity(), false)); } } From a2e15b518d0328bf5ce44c5cf1a3f888f032d7d2 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Wed, 4 Dec 2024 23:20:00 +0530 Subject: [PATCH 08/11] UXPROD-5054 Adding new permission --- descriptors/ModuleDescriptor-template.json | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index a5baee12..4393f8d4 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -113,7 +113,7 @@ ], "pathPattern": "/transactions/{dcbTransactionId}/status", "permissionsRequired": [ - "dcb.transactions.status.get" + "dcb.transactions.get" ], "modulePermissions": [] }, @@ -123,7 +123,7 @@ ], "pathPattern": "/transactions/{dcbTransactionId}/status", "permissionsRequired": [ - "dcb.transactions.status.put" + "dcb.transactions.put" ], "modulePermissions": [ "circulation.check-out-by-barcode.post", @@ -148,7 +148,7 @@ ], "pathPattern": "/transactions/{dcbTransactionId}", "permissionsRequired": [ - "dcb.transactions.put" + "dcb.transactions.item.put" ], "modulePermissions": [ "inventory-storage.items.item.get", @@ -256,7 +256,8 @@ "dcb.transactions.put", "dcb.transactions.get", "dcb.transactions.collection.get", - "dcb.ecs-request.transactions.post" + "dcb.ecs-request.transactions.post", + "dcb.transactions.item.put" ] }, { @@ -271,8 +272,8 @@ }, { "permissionName": "dcb.transactions.put", - "displayName": "update transaction details", - "description": "update transaction details" + "displayName": "update transaction status", + "description": "update transaction status" }, { "permissionName": "dcb.transactions.collection.get", @@ -283,6 +284,11 @@ "permissionName": "dcb.ecs-request.transactions.post", "displayName": "creates new ECS request transaction", "description": "creates new ECS request transaction" + }, + { + "permissionName": "dcb.transactions.item.put", + "displayName": "update transaction details", + "description": "update transaction details" } ], "metadata": { From b7d38fddcb464b54a2e918ec209ee93c814ce2e6 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Thu, 5 Dec 2024 15:11:54 +0530 Subject: [PATCH 09/11] UXPROD-5001 Code refactoring --- .../controller/TransactionApiController.java | 6 +-- .../dcb/domain/mapper/TransactionMapper.java | 10 ++--- .../dcb/service/TransactionsService.java | 4 +- .../dcb/service/impl/BaseLibraryService.java | 6 +-- .../service/impl/TransactionsServiceImpl.java | 6 +-- .../swagger.api/dcb_transaction.yaml | 6 +-- .../schemas/DcbTransactionUpdate.yaml | 20 ---------- .../swagger.api/schemas/dcbUpdateItem.yaml | 18 +++++++++ .../schemas/dcbUpdateTransaction.yaml | 6 +++ .../TransactionApiControllerTest.java | 38 +++++++++++++++++++ .../CirculationRequestEventListenerTest.java | 12 +++++- .../java/org/folio/dcb/utils/EntityUtils.java | 13 +++++++ ...el_request_due_to_item_unavailability.json | 23 +++++++++++ 13 files changed, 128 insertions(+), 40 deletions(-) delete mode 100644 src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml create mode 100644 src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml create mode 100644 src/main/resources/swagger.api/schemas/dcbUpdateTransaction.yaml create mode 100644 src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json diff --git a/src/main/java/org/folio/dcb/controller/TransactionApiController.java b/src/main/java/org/folio/dcb/controller/TransactionApiController.java index 6c40b597..dd569b76 100644 --- a/src/main/java/org/folio/dcb/controller/TransactionApiController.java +++ b/src/main/java/org/folio/dcb/controller/TransactionApiController.java @@ -3,7 +3,7 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.folio.dcb.domain.dto.DcbTransaction; -import org.folio.dcb.domain.dto.DcbTransactionUpdate; +import org.folio.dcb.domain.dto.DcbUpdateTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; import org.folio.dcb.rest.resource.TransactionsApi; @@ -76,8 +76,8 @@ public ResponseEntity getTransactionStatusL } @Override - public ResponseEntity updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate) { - transactionsService.updateTransactionDetails(dcbTransactionId, dcbTransactionUpdate); + public ResponseEntity updateTransactionDetails(String dcbTransactionId, DcbUpdateTransaction dcbUpdateTransaction) { + transactionsService.updateTransactionDetails(dcbTransactionId, dcbUpdateTransaction); return ResponseEntity.status(HttpStatus.NO_CONTENT) .build(); } diff --git a/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java b/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java index ba1762d5..e4e91766 100644 --- a/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java +++ b/src/main/java/org/folio/dcb/domain/mapper/TransactionMapper.java @@ -3,7 +3,7 @@ import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbPickup; -import org.folio.dcb.domain.dto.DcbTransactionUpdateItem; +import org.folio.dcb.domain.dto.DcbUpdateItem; import org.folio.dcb.domain.dto.TransactionStatusResponseList; import org.folio.dcb.domain.entity.TransactionAuditEntity; import org.folio.dcb.domain.entity.TransactionEntity; @@ -92,12 +92,12 @@ public DcbPickup mapTransactionEntityToDcbPickup(TransactionEntity transactionEn .build(); } - public DcbItem convertTransactionUpdateItemToDcbItem(DcbTransactionUpdateItem updatedItem, TransactionEntity entity) { + public DcbItem convertTransactionUpdateItemToDcbItem(DcbUpdateItem dcbUpdateItem, TransactionEntity entity) { return DcbItem .builder() - .lendingLibraryCode(updatedItem.getLendingLibraryCode()) - .barcode(updatedItem.getBarcode()) - .materialType(updatedItem.getMaterialType()) + .lendingLibraryCode(dcbUpdateItem.getLendingLibraryCode()) + .barcode(dcbUpdateItem.getBarcode()) + .materialType(dcbUpdateItem.getMaterialType()) .title(entity.getItemTitle()) .build(); } diff --git a/src/main/java/org/folio/dcb/service/TransactionsService.java b/src/main/java/org/folio/dcb/service/TransactionsService.java index f08b64c9..549db7d7 100644 --- a/src/main/java/org/folio/dcb/service/TransactionsService.java +++ b/src/main/java/org/folio/dcb/service/TransactionsService.java @@ -1,7 +1,7 @@ package org.folio.dcb.service; import org.folio.dcb.domain.dto.DcbTransaction; -import org.folio.dcb.domain.dto.DcbTransactionUpdate; +import org.folio.dcb.domain.dto.DcbUpdateTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; @@ -18,6 +18,6 @@ public interface TransactionsService { TransactionStatusResponse updateTransactionStatus(String dcbTransactionId, TransactionStatus transactionStatus); TransactionStatusResponse getTransactionStatusById(String dcbTransactionId); TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTime fromDate, OffsetDateTime toDate, Integer pageNumber, Integer pageSize); - void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate); + void updateTransactionDetails(String dcbTransactionId, DcbUpdateTransaction dcbUpdateTransaction); } 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 e1f6345c..f0f5ee05 100644 --- a/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java +++ b/src/main/java/org/folio/dcb/service/impl/BaseLibraryService.java @@ -8,7 +8,7 @@ import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbTransaction; -import org.folio.dcb.domain.dto.DcbTransactionUpdateItem; +import org.folio.dcb.domain.dto.DcbUpdateItem; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.entity.TransactionEntity; @@ -138,9 +138,9 @@ public void updateTransactionEntity(TransactionEntity transactionEntity, Transac transactionRepository.save(transactionEntity); } - public void updateTransactionDetails(TransactionEntity transactionEntity, DcbTransactionUpdateItem updatedItem) { + public void updateTransactionDetails(TransactionEntity transactionEntity, DcbUpdateItem dcbUpdateItem) { DcbPatron dcbPatron = transactionMapper.mapTransactionEntityToDcbPatron(transactionEntity); - DcbItem dcbItem = transactionMapper.convertTransactionUpdateItemToDcbItem(updatedItem, transactionEntity); + DcbItem dcbItem = transactionMapper.convertTransactionUpdateItemToDcbItem(dcbUpdateItem, transactionEntity); checkItemExistsInInventoryAndThrow(dcbItem.getBarcode()); CirculationItem item = circulationItemService.checkIfItemExistsAndCreate(dcbItem, transactionEntity.getServicePointId()); dcbItem.setId(item.getId()); diff --git a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java index 9283501f..050c3176 100644 --- a/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/TransactionsServiceImpl.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.folio.dcb.domain.dto.DcbTransaction; -import org.folio.dcb.domain.dto.DcbTransactionUpdate; +import org.folio.dcb.domain.dto.DcbUpdateTransaction; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.dto.TransactionStatusResponseCollection; @@ -112,7 +112,7 @@ public TransactionStatusResponseCollection getTransactionStatusList(OffsetDateTi } @Override - public void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpdate dcbTransactionUpdate) { + public void updateTransactionDetails(String dcbTransactionId, DcbUpdateTransaction dcbUpdateTransaction) { var transactionEntity = getTransactionEntityOrThrow(dcbTransactionId); if (!TransactionStatus.StatusEnum.CREATED.equals(transactionEntity.getStatus())) { throw new StatusException(String.format( @@ -121,7 +121,7 @@ public void updateTransactionDetails(String dcbTransactionId, DcbTransactionUpda if (DcbTransaction.RoleEnum.LENDER.equals(transactionEntity.getRole())) { throw new IllegalArgumentException("Item details cannot be updated for lender role"); } - baseLibraryService.updateTransactionDetails(transactionEntity, dcbTransactionUpdate.getItem()); + baseLibraryService.updateTransactionDetails(transactionEntity, dcbUpdateTransaction.getItem()); } private TransactionStatusResponse generateTransactionStatusResponseFromTransactionEntity(TransactionEntity transactionEntity) { diff --git a/src/main/resources/swagger.api/dcb_transaction.yaml b/src/main/resources/swagger.api/dcb_transaction.yaml index ea49ca94..45f0ed87 100644 --- a/src/main/resources/swagger.api/dcb_transaction.yaml +++ b/src/main/resources/swagger.api/dcb_transaction.yaml @@ -32,7 +32,7 @@ paths: parameters: - $ref: '#/components/parameters/dcbTransactionId' requestBody: - $ref: "#/components/requestBodies/DCBTransactionUpdate" + $ref: "#/components/requestBodies/DcbUpdateTransaction" responses: '204': description: 'Transaction updated successfully' @@ -126,13 +126,13 @@ components: application/json: schema: $ref: "schemas/dcbTransaction.yaml#/DcbTransaction" - DCBTransactionUpdate: + DcbUpdateTransaction: description: DCB transaction update object required: true content: application/json: schema: - $ref: "schemas/DcbTransactionUpdate.yaml#/DcbTransactionUpdate" + $ref: "schemas/DcbUpdateTransaction.yaml#/DcbUpdateTransaction" responses: TransactionStatus: description: Transaction Status object diff --git a/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml b/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml deleted file mode 100644 index a0ae4a40..00000000 --- a/src/main/resources/swagger.api/schemas/DcbTransactionUpdate.yaml +++ /dev/null @@ -1,20 +0,0 @@ -DcbTransactionUpdate: - type: object - properties: - item: - properties: - barcode: - description: The barcode of the item as specified in the lending library - type: string - materialType: - description: The “hub-normalized” form of the item item type, used in the circulation rules for determining the correct loan policy. - type: string - lendingLibraryCode: - description: The code which identifies the lending library - type: string - additionalProperties: false - required: - - barcode - - materialType - - lendingLibraryCode - diff --git a/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml b/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml new file mode 100644 index 00000000..92264987 --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml @@ -0,0 +1,18 @@ +DcbUpdateItem: + description: Item metadata required for updating the existing transaction + type: object + properties: + barcode: + description: The barcode of the item as specified in the lending library + type: string + materialType: + description: The “hub-normalized” form of the item item type, used in the circulation rules for determining the correct loan policy. + type: string + lendingLibraryCode: + description: The code which identifies the lending library + type: string + additionalProperties: false + required: + - barcode + - materialType + - lendingLibraryCode diff --git a/src/main/resources/swagger.api/schemas/dcbUpdateTransaction.yaml b/src/main/resources/swagger.api/schemas/dcbUpdateTransaction.yaml new file mode 100644 index 00000000..c08ed5c1 --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dcbUpdateTransaction.yaml @@ -0,0 +1,6 @@ +DcbUpdateTransaction: + type: object + properties: + item: + $ref: 'dcbUpdateItem.yaml#/DcbUpdateItem' + diff --git a/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java b/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java index 5edbc7ff..540b1cc5 100644 --- a/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java +++ b/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java @@ -983,9 +983,47 @@ void getTransactionStatusUpdateListTest() throws Exception { .andExpect(jsonPath("$.maximumPageNumber", is(2))) .andExpect(jsonPath("$.transactions[*].status", containsInRelativeOrder("ITEM_CHECKED_OUT", "ITEM_CHECKED_IN"))); + } + + @Test + void createAndUpdateBorrowerTransactionTest() throws Exception { + removeExistedTransactionFromDbIfSoExists(); + removeExistingTransactionsByItemId(ITEM_ID); + this.mockMvc.perform( + post("/transactions/" + DCB_TRANSACTION_ID) + .content(asJsonString(createDcbTransactionByRole(BORROWER))) + .headers(defaultHeaders()) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.status").value("CREATED")) + .andExpect(jsonPath("$.item").value(createDcbItem())) + .andExpect(jsonPath("$.patron").value(createDcbPatronWithExactPatronId(EXISTED_PATRON_ID))); + + //Trying to create another transaction with same transaction id + this.mockMvc.perform( + post("/transactions/" + DCB_TRANSACTION_ID) + .content(asJsonString(createDcbTransactionByRole(BORROWER))) + .headers(defaultHeaders()) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpectAll(status().is4xxClientError(), + jsonPath("$.errors[0].code", is("DUPLICATE_ERROR"))); + + // check for DUPLICATE_ERROR propagated into transactions_audit. + systemUserScopedExecutionService.executeAsyncSystemUserScoped( + TENANT, + () -> { + TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) + .orElse(null); + Assertions.assertNotNull(auditExisting); + Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); + Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } + ); } + private void removeExistedTransactionFromDbIfSoExists() { systemUserScopedExecutionService.executeAsyncSystemUserScoped(TENANT, () -> { if (transactionRepository.existsById(DCB_TRANSACTION_ID)){ diff --git a/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java b/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java index ba2ac32f..b96fe678 100644 --- a/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java +++ b/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java @@ -36,8 +36,8 @@ class CirculationRequestEventListenerTest extends BaseIT { private static final String CHECK_IN_TRANSIT_EVENT_FOR_DCB_SAMPLE = getMockDataAsString("mockdata/kafka/check_in_transit_dcb.json"); private static final String CHECK_IN_UNDEFINED_EVENT_SAMPLE = getMockDataAsString("mockdata/kafka/request_undefined.json"); private static final String REQUEST_CANCEL_EVENT_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request.json"); - private static final String REQUEST_CANCEL_EVENT_FOR_DCB_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request_dcb.json"); + private static final String REQUEST_CANCEL_FOR_ITEM_UNAVAILABILITY_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request_due_to_item_unavailability.json"); @Autowired private CirculationEventListener eventListener ; @@ -104,6 +104,16 @@ void handleCancelRequestForDcbTest() { Mockito.verify(transactionRepository).save(any()); } + @Test + void handleCancelRequestDueToItemUnavailabilityTest() { + var transactionEntity = createTransactionEntity(); + transactionEntity.setRole(BORROWING_PICKUP); + MessageHeaders messageHeaders = getMessageHeaders(); + when(transactionRepository.findTransactionByRequestIdAndStatusNotInClosed(any())).thenReturn(Optional.of(transactionEntity)); + eventListener.handleRequestEvent(REQUEST_CANCEL_FOR_ITEM_UNAVAILABILITY_SAMPLE, messageHeaders); + Mockito.verify(transactionRepository, never()).save(any()); + } + @Test void handleOpenRequestTest() { diff --git a/src/test/java/org/folio/dcb/utils/EntityUtils.java b/src/test/java/org/folio/dcb/utils/EntityUtils.java index 48d1b1e1..ecb0eda2 100644 --- a/src/test/java/org/folio/dcb/utils/EntityUtils.java +++ b/src/test/java/org/folio/dcb/utils/EntityUtils.java @@ -11,6 +11,8 @@ import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.DcbPatron; import org.folio.dcb.domain.dto.DcbPickup; +import org.folio.dcb.domain.dto.DcbUpdateTransaction; +import org.folio.dcb.domain.dto.DcbUpdateItem; import org.folio.dcb.domain.dto.TransactionStatusResponse; import org.folio.dcb.domain.dto.User; import org.folio.dcb.domain.dto.TransactionStatus; @@ -61,6 +63,7 @@ public class EntityUtils { public static String EXISTED_INVENTORY_ITEM_BARCODE = "INVENTORY_ITEM"; public static String PATRON_TYPE_USER_ID = "18c1741d-e678-4c8e-9fe7-cfaeefab5eea"; public static String REQUEST_ID = "398501a2-5c97-4ba6-9ee7-d1cd6433cb98"; + public static String DCB_NEW_BARCODE = "NEW_BARCODE"; public static DcbTransaction createDcbTransactionByRole(DcbTransaction.RoleEnum role) { return DcbTransaction.builder() @@ -118,6 +121,16 @@ public static DcbItem createDcbItem() { .build(); } + public static DcbUpdateTransaction createDcbTransactionUpdate() { + return DcbUpdateTransaction + .builder() + .item(DcbUpdateItem + .builder() + .barcode("") + .build()) + .build(); + } + public static CirculationRequest createCirculationRequest() { return CirculationRequest.builder() .id(CIRCULATION_REQUEST_ID) diff --git a/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json b/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json new file mode 100644 index 00000000..9e030a6f --- /dev/null +++ b/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json @@ -0,0 +1,23 @@ +{ + "id": "4a8123fe-a0aa-47ae-9836-71a6cc3cb119", + "type": "UPDATED", + "tenant": "diku", + "timestamp": 1695390940007, + "data": { + "new": { + "id": "299b5ad1-baa6-44fe-a855-0236f852c943", + "requestLevel": "Item", + "requestType": "Page", + "requestDate": "2023-11-06T12:17:52.573+00:00", + "requesterId": "2205005b-ca51-4a04-87fd-938eefa8f6de", + "instanceId": "9d1b77e4-f02e-4b7f-b296-3f2042ddac54", + "holdingsRecordId": "10cd3a5a-d36f-4c7a-bc4f-e1ae3cf820c9", + "itemId": "5b95877d-86c0-4cb7-a0cd-7660b348ae5a", + "status": "Closed - Cancelled", + "cancellationReasonId": "50ed35b2-1397-4e83-a76b-642adf91ca2a", + "cancelledByUserId": "7187c6f3-41ec-5731-b551-7f0092abb4c6", + "cancellationAdditionalInformation": "Request cancelled due to item unavailability", + "cancelledDate": "2023-11-06T12:18:36.938+00:00" + } + } +} From f9c001821a89de179bf221fcf851ca8fd142ef93 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Fri, 6 Dec 2024 01:28:55 +0530 Subject: [PATCH 10/11] UXPROD-5001 Code refactoring and adding test case --- .../kafka/CirculationEventListener.java | 4 +- .../folio/dcb/listener/kafka/EventData.java | 1 - .../folio/dcb/service/CirculationService.java | 3 +- .../service/impl/CirculationServiceImpl.java | 3 - .../folio/dcb/utils/TransactionHelper.java | 3 - .../swagger.api/dcb_transaction.yaml | 2 +- .../TransactionApiControllerTest.java | 81 ++++++++++++------- .../CirculationRequestEventListenerTest.java | 12 --- .../java/org/folio/dcb/utils/EntityUtils.java | 4 +- .../resources/mappings/circulation-item.json | 16 +++- src/test/resources/mappings/circulation.json | 5 +- src/test/resources/mappings/inventory.json | 13 +++ .../resources/mappings/material-types.json | 13 +++ ...el_request_due_to_item_unavailability.json | 23 ------ 14 files changed, 101 insertions(+), 82 deletions(-) delete mode 100644 src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json diff --git a/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java b/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java index 839f0dc6..85e80095 100644 --- a/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java +++ b/src/main/java/org/folio/dcb/listener/kafka/CirculationEventListener.java @@ -17,7 +17,6 @@ import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.BORROWING_PICKUP; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.LENDER; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.PICKUP; -import static org.folio.dcb.utils.DCBConstants.ITEM_UNAVAILABLE_CANCELLATION_MSG; import static org.folio.dcb.utils.TransactionHelper.getHeaderValue; import static org.folio.dcb.utils.TransactionHelper.parseLoanEvent; import static org.folio.dcb.utils.TransactionHelper.parseRequestEvent; @@ -79,8 +78,7 @@ public void handleRequestEvent(String data, MessageHeaders messageHeaders) { systemUserScopedExecutionService.executeAsyncSystemUserScoped(tenantId, () -> transactionRepository.findTransactionByRequestIdAndStatusNotInClosed(UUID.fromString(requestId)) .ifPresent(transactionEntity -> { - if (eventData.getType() == EventData.EventType.CANCEL && - !ITEM_UNAVAILABLE_CANCELLATION_MSG.equals(eventData.getCancellationAdditionalInformation())) { + if (eventData.getType() == EventData.EventType.CANCEL) { baseLibraryService.cancelTransactionEntity(transactionEntity); } else if (eventData.getType() == EventData.EventType.IN_TRANSIT && transactionEntity.getRole() == LENDER) { baseLibraryService.updateTransactionEntity(transactionEntity, TransactionStatus.StatusEnum.OPEN); diff --git a/src/main/java/org/folio/dcb/listener/kafka/EventData.java b/src/main/java/org/folio/dcb/listener/kafka/EventData.java index 579f16e0..0b786a2b 100644 --- a/src/main/java/org/folio/dcb/listener/kafka/EventData.java +++ b/src/main/java/org/folio/dcb/listener/kafka/EventData.java @@ -8,7 +8,6 @@ public class EventData { private String itemId; private String requestId; private boolean isDcb; - private String cancellationAdditionalInformation; public enum EventType { CHECK_IN, CHECK_OUT, IN_TRANSIT, AWAITING_PICKUP, CANCEL diff --git a/src/main/java/org/folio/dcb/service/CirculationService.java b/src/main/java/org/folio/dcb/service/CirculationService.java index e8641865..651955bb 100644 --- a/src/main/java/org/folio/dcb/service/CirculationService.java +++ b/src/main/java/org/folio/dcb/service/CirculationService.java @@ -20,8 +20,7 @@ public interface CirculationService { /** * Cancels a transaction request based on the provided transaction details. *

- * If {@code isItemUnavailableCancellation} is {@code true}, the cancellation reason - * will be updated to indicate item unavailability, and the notification for this + * If {@code isItemUnavailableCancellation} is {@code true}, the notification for this * cancellation will be suppressed by setting the {@code suppressNotification} flag * to {@code true}. *

diff --git a/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java b/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java index bf6496af..b4110b26 100644 --- a/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java +++ b/src/main/java/org/folio/dcb/service/impl/CirculationServiceImpl.java @@ -14,8 +14,6 @@ import org.springframework.stereotype.Service; import java.time.OffsetDateTime; -import static org.folio.dcb.utils.DCBConstants.ITEM_UNAVAILABLE_CANCELLATION_MSG; - @Service @Log4j2 @RequiredArgsConstructor @@ -49,7 +47,6 @@ public void cancelRequest(TransactionEntity dcbTransaction, boolean isItemUnavai if (request != null){ try { if (isItemUnavailableCancellation) { - request.setCancellationAdditionalInformation(ITEM_UNAVAILABLE_CANCELLATION_MSG); request.setIsSuppressNotification(true); } circulationClient.updateRequest(request.getId(), request); diff --git a/src/main/java/org/folio/dcb/utils/TransactionHelper.java b/src/main/java/org/folio/dcb/utils/TransactionHelper.java index 5613bcc4..6468ad25 100644 --- a/src/main/java/org/folio/dcb/utils/TransactionHelper.java +++ b/src/main/java/org/folio/dcb/utils/TransactionHelper.java @@ -22,7 +22,6 @@ public class TransactionHelper { public static final String LASTNAME = "lastName"; public static final String DCB_INSTANCE_TITLE = "DCB_INSTANCE"; public static final String DCB_REQUESTER_LASTNAME = "DcbSystem"; - public static final String CANCELLATION_ADDITIONAL_INFORMATION = "cancellationAdditionalInformation"; private TransactionHelper(){} @@ -66,8 +65,6 @@ public static EventData parseRequestEvent(String eventPayload){ default -> log.info("parseRequestEvent:: Request status {} is not supported", requestStatus); } eventData.setDcb(checkDcbRequest(kafkaEvent)); - eventData.setCancellationAdditionalInformation(kafkaEvent.getNewNode().has(CANCELLATION_ADDITIONAL_INFORMATION) ? - kafkaEvent.getNewNode().get(CANCELLATION_ADDITIONAL_INFORMATION).asText() : null); return eventData; } return null; diff --git a/src/main/resources/swagger.api/dcb_transaction.yaml b/src/main/resources/swagger.api/dcb_transaction.yaml index 45f0ed87..a64bc437 100644 --- a/src/main/resources/swagger.api/dcb_transaction.yaml +++ b/src/main/resources/swagger.api/dcb_transaction.yaml @@ -132,7 +132,7 @@ components: content: application/json: schema: - $ref: "schemas/DcbUpdateTransaction.yaml#/DcbUpdateTransaction" + $ref: "schemas/dcbUpdateTransaction.yaml#/DcbUpdateTransaction" responses: TransactionStatus: description: Transaction Status object diff --git a/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java b/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java index 540b1cc5..e45536dc 100644 --- a/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java +++ b/src/test/java/org/folio/dcb/controller/TransactionApiControllerTest.java @@ -1,5 +1,6 @@ package org.folio.dcb.controller; +import com.jayway.jsonpath.JsonPath; import org.folio.dcb.domain.dto.DcbItem; import org.folio.dcb.domain.dto.TransactionStatus; import org.folio.dcb.domain.entity.TransactionAuditEntity; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; import java.time.OffsetDateTime; import java.time.ZoneOffset; @@ -19,6 +21,7 @@ import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.BORROWING_PICKUP; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.LENDER; import static org.folio.dcb.domain.dto.DcbTransaction.RoleEnum.PICKUP; +import static org.folio.dcb.utils.EntityUtils.DCB_NEW_BARCODE; import static org.folio.dcb.utils.EntityUtils.DCB_TRANSACTION_ID; import static org.folio.dcb.utils.EntityUtils.DCB_TYPE_USER_ID; import static org.folio.dcb.utils.EntityUtils.EXISTED_INVENTORY_ITEM_BARCODE; @@ -28,6 +31,7 @@ import static org.folio.dcb.utils.EntityUtils.PATRON_TYPE_USER_ID; import static org.folio.dcb.utils.EntityUtils.createDcbItem; import static org.folio.dcb.utils.EntityUtils.createDcbPatronWithExactPatronId; +import static org.folio.dcb.utils.EntityUtils.createDcbTransactionUpdate; import static org.folio.dcb.utils.EntityUtils.createDefaultDcbPatron; import static org.folio.dcb.utils.EntityUtils.createDcbTransactionByRole; import static org.folio.dcb.utils.EntityUtils.createTransactionEntity; @@ -35,6 +39,9 @@ import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInRelativeOrder; import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; 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.put; @@ -87,9 +94,9 @@ void createLendingCirculationRequestTest() throws Exception { () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); - Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } + assertNotNull(auditExisting); + assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); + assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } ); } @@ -162,9 +169,9 @@ void createBorrowingPickupCirculationRequestTest() throws Exception { () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); - Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } + assertNotNull(auditExisting); + assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); + assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } ); } @@ -190,8 +197,8 @@ void createLendingCirculationRequestWithInvalidItemId() throws Exception { () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(trnId) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertEquals(TRANSACTION_AUDIT_ERROR_ACTION, auditExisting.getAction()); } + assertNotNull(auditExisting); + assertEquals(TRANSACTION_AUDIT_ERROR_ACTION, auditExisting.getAction()); } ); } @@ -216,8 +223,8 @@ void createBorrowingPickupCirculationRequestWithInvalidDefaultNotExistedPatronId () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(trnId) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertEquals(TRANSACTION_AUDIT_ERROR_ACTION, auditExisting.getAction()); } + assertNotNull(auditExisting); + assertEquals(TRANSACTION_AUDIT_ERROR_ACTION, auditExisting.getAction()); } ); } @@ -455,9 +462,9 @@ void createTransactionForPickupLibrary() throws Exception { () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); - Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } + assertNotNull(auditExisting); + assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); + assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } ); } @@ -513,9 +520,9 @@ void createBorrowerCirculationRequestTest() throws Exception { () -> { TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); - Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } + assertNotNull(auditExisting); + assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); + assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } ); } @@ -537,7 +544,10 @@ void createBorrowerCirculationRequestWithoutExistingItemTest() throws Exception .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()) .andExpect(jsonPath("$.status").value("CREATED")) - .andExpect(jsonPath("$.item").value(dcbItem)) + .andExpect(jsonPath("$.item.barcode").value(dcbItem.getBarcode())) + .andExpect(jsonPath("$.item.materialType").value(dcbItem.getMaterialType())) + .andExpect(jsonPath("$.item.lendingLibraryCode").value(dcbItem.getLendingLibraryCode())) + .andExpect(jsonPath("$.item.title").value(dcbItem.getTitle())) .andExpect(jsonPath("$.patron").value(createDcbPatronWithExactPatronId(EXISTED_PATRON_ID))); //Trying to create another transaction with same transaction id @@ -990,7 +1000,7 @@ void createAndUpdateBorrowerTransactionTest() throws Exception { removeExistedTransactionFromDbIfSoExists(); removeExistingTransactionsByItemId(ITEM_ID); - this.mockMvc.perform( + MvcResult result = this.mockMvc.perform( post("/transactions/" + DCB_TRANSACTION_ID) .content(asJsonString(createDcbTransactionByRole(BORROWER))) .headers(defaultHeaders()) @@ -999,28 +1009,39 @@ void createAndUpdateBorrowerTransactionTest() throws Exception { .andExpect(status().isCreated()) .andExpect(jsonPath("$.status").value("CREATED")) .andExpect(jsonPath("$.item").value(createDcbItem())) - .andExpect(jsonPath("$.patron").value(createDcbPatronWithExactPatronId(EXISTED_PATRON_ID))); + .andExpect(jsonPath("$.patron").value(createDcbPatronWithExactPatronId(EXISTED_PATRON_ID))) + .andReturn(); // Capture the response for assertion - //Trying to create another transaction with same transaction id + String responseContent = result.getResponse().getContentAsString(); + String itemId = JsonPath.parse(responseContent).read("$.item.id", String.class); + String itemBarcode = JsonPath.parse(responseContent).read("$.item.barcode", String.class); + String lendingLibraryCode = JsonPath.parse(responseContent).read("$.item.lendingLibraryCode", String.class); + String materialType = JsonPath.parse(responseContent).read("$.item.materialType", String.class); + + //Trying to update the transaction with same transaction id this.mockMvc.perform( - post("/transactions/" + DCB_TRANSACTION_ID) - .content(asJsonString(createDcbTransactionByRole(BORROWER))) + put("/transactions/" + DCB_TRANSACTION_ID) + .content(asJsonString(createDcbTransactionUpdate())) .headers(defaultHeaders()) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) - .andExpectAll(status().is4xxClientError(), - jsonPath("$.errors[0].code", is("DUPLICATE_ERROR"))); + .andExpectAll(status().isNoContent()); - // check for DUPLICATE_ERROR propagated into transactions_audit. + // check whether item related data is updated systemUserScopedExecutionService.executeAsyncSystemUserScoped( TENANT, () -> { - TransactionAuditEntity auditExisting = transactionAuditRepository.findLatestTransactionAuditEntityByDcbTransactionId(DCB_TRANSACTION_ID) + var transactionEntity = transactionRepository.findById(DCB_TRANSACTION_ID) .orElse(null); - Assertions.assertNotNull(auditExisting); - Assertions.assertNotEquals(TRANSACTION_AUDIT_DUPLICATE_ERROR_ACTION, auditExisting.getAction()); - Assertions.assertNotEquals(DUPLICATE_ERROR_TRANSACTION_ID, auditExisting.getTransactionId()); } - ); + assertNotNull(transactionEntity); + assertNotEquals(itemId, transactionEntity.getItemId()); + assertNotEquals(itemBarcode, transactionEntity.getItemBarcode()); + assertEquals(DCB_NEW_BARCODE, transactionEntity.getItemBarcode()); + assertNotEquals(lendingLibraryCode, transactionEntity.getLendingLibraryCode()); + assertEquals("LEN", transactionEntity.getLendingLibraryCode()); + assertNotEquals(materialType, transactionEntity.getMaterialType()); + assertEquals("DVD", transactionEntity.getMaterialType()); + }); } diff --git a/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java b/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java index b96fe678..557e045b 100644 --- a/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java +++ b/src/test/java/org/folio/dcb/listener/CirculationRequestEventListenerTest.java @@ -37,7 +37,6 @@ class CirculationRequestEventListenerTest extends BaseIT { private static final String CHECK_IN_UNDEFINED_EVENT_SAMPLE = getMockDataAsString("mockdata/kafka/request_undefined.json"); private static final String REQUEST_CANCEL_EVENT_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request.json"); private static final String REQUEST_CANCEL_EVENT_FOR_DCB_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request_dcb.json"); - private static final String REQUEST_CANCEL_FOR_ITEM_UNAVAILABILITY_SAMPLE = getMockDataAsString("mockdata/kafka/cancel_request_due_to_item_unavailability.json"); @Autowired private CirculationEventListener eventListener ; @@ -104,17 +103,6 @@ void handleCancelRequestForDcbTest() { Mockito.verify(transactionRepository).save(any()); } - @Test - void handleCancelRequestDueToItemUnavailabilityTest() { - var transactionEntity = createTransactionEntity(); - transactionEntity.setRole(BORROWING_PICKUP); - MessageHeaders messageHeaders = getMessageHeaders(); - when(transactionRepository.findTransactionByRequestIdAndStatusNotInClosed(any())).thenReturn(Optional.of(transactionEntity)); - eventListener.handleRequestEvent(REQUEST_CANCEL_FOR_ITEM_UNAVAILABILITY_SAMPLE, messageHeaders); - Mockito.verify(transactionRepository, never()).save(any()); - } - - @Test void handleOpenRequestTest() { var transactionEntity = createTransactionEntity(); diff --git a/src/test/java/org/folio/dcb/utils/EntityUtils.java b/src/test/java/org/folio/dcb/utils/EntityUtils.java index ecb0eda2..b4e728d7 100644 --- a/src/test/java/org/folio/dcb/utils/EntityUtils.java +++ b/src/test/java/org/folio/dcb/utils/EntityUtils.java @@ -126,7 +126,9 @@ public static DcbUpdateTransaction createDcbTransactionUpdate() { .builder() .item(DcbUpdateItem .builder() - .barcode("") + .barcode(DCB_NEW_BARCODE) + .lendingLibraryCode("LEN") + .materialType("DVD") .build()) .build(); } diff --git a/src/test/resources/mappings/circulation-item.json b/src/test/resources/mappings/circulation-item.json index ba13ee85..41c5d445 100644 --- a/src/test/resources/mappings/circulation-item.json +++ b/src/test/resources/mappings/circulation-item.json @@ -7,7 +7,8 @@ }, "response": { "status": 201, - "body": "{\"id\": \"5b95877d-86c0-4cb7-a0cd-7660b348ae5a\", \"holdingsRecordId\": \"10cd3a5a-d36f-4c7a-bc4f-e1ae3cf820c9\", \"status\": {\"name\":\"In transit\"}, \"materialTypeId\": \"1a54b431-2e4f-452d-9cae-9cee66c9a892\", \"permanentLoanTypeId\": \"2b94c631-fca9-4892-a730-03ee529ffe27\", \"instanceTitle\": \"ITEM\", \"itemBarcode\": \"DCB_ITEM\", \"pickupLocation\": \"3a40852d-49fd-4df2-a1f9-6e2641a6e91f\"}", + "body": "{{jsonPath request.body '$'}}", + "transformers": ["response-template"], "headers": { "Content-Type": "application/json" } @@ -90,6 +91,19 @@ "Content-Type": "application/json" } } + }, + { + "request": { + "method": "GET", + "url": "/circulation-item?query=barcode%3D%3D%22NEW_BARCODE%22" + }, + "response": { + "status": 200, + "body": "{\n \"totalRecords\": 0,\n \"items\": []\n}", + "headers": { + "Content-Type": "application/json" + } + } } ] } diff --git a/src/test/resources/mappings/circulation.json b/src/test/resources/mappings/circulation.json index 00ec8fc2..72e25d33 100644 --- a/src/test/resources/mappings/circulation.json +++ b/src/test/resources/mappings/circulation.json @@ -6,8 +6,9 @@ "url": "/circulation/requests" }, "response": { - "status": 200, - "body": "{\"id\": \"571b0a2c-8883-40b5-a449-d41fe6017083\"}", + "status": 201, + "body": "{{jsonPath request.body '$'}}", + "transformers": ["response-template"], "headers": { "Content-Type": "application/json" } diff --git a/src/test/resources/mappings/inventory.json b/src/test/resources/mappings/inventory.json index 512502ee..e4eddd25 100644 --- a/src/test/resources/mappings/inventory.json +++ b/src/test/resources/mappings/inventory.json @@ -220,6 +220,19 @@ "Content-Type": "application/json" } } + }, + { + "request": { + "method": "GET", + "url": "/item-storage/items?query=barcode%3D%3DNEW_BARCODE" + }, + "response": { + "status": 200, + "body": "{\n\"items\": [],\n\"totalRecords\": 0,\n \"resultInfo\": {\n \"totalRecords\": 0,\n \"facets\": [],\n \"diagnostics\": []\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } } ] } diff --git a/src/test/resources/mappings/material-types.json b/src/test/resources/mappings/material-types.json index 366e39c5..51d43f7e 100644 --- a/src/test/resources/mappings/material-types.json +++ b/src/test/resources/mappings/material-types.json @@ -12,6 +12,19 @@ "Content-Type": "application/json" } } + }, + { + "request": { + "method": "GET", + "url": "/material-types?query=name%3D%3D%22DVD%22" + }, + "response": { + "status": 200, + "body": "{\"mtypes\": [{\"name\": \"DVD\",\n \"id\": \"1b54b431-2e4f-452d-9cae-9cee66c9a892\",\n \"source\": \"folio\"}]}", + "headers": { + "Content-Type": "application/json" + } + } } ] } diff --git a/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json b/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json deleted file mode 100644 index 9e030a6f..00000000 --- a/src/test/resources/mockdata/kafka/cancel_request_due_to_item_unavailability.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "4a8123fe-a0aa-47ae-9836-71a6cc3cb119", - "type": "UPDATED", - "tenant": "diku", - "timestamp": 1695390940007, - "data": { - "new": { - "id": "299b5ad1-baa6-44fe-a855-0236f852c943", - "requestLevel": "Item", - "requestType": "Page", - "requestDate": "2023-11-06T12:17:52.573+00:00", - "requesterId": "2205005b-ca51-4a04-87fd-938eefa8f6de", - "instanceId": "9d1b77e4-f02e-4b7f-b296-3f2042ddac54", - "holdingsRecordId": "10cd3a5a-d36f-4c7a-bc4f-e1ae3cf820c9", - "itemId": "5b95877d-86c0-4cb7-a0cd-7660b348ae5a", - "status": "Closed - Cancelled", - "cancellationReasonId": "50ed35b2-1397-4e83-a76b-642adf91ca2a", - "cancelledByUserId": "7187c6f3-41ec-5731-b551-7f0092abb4c6", - "cancellationAdditionalInformation": "Request cancelled due to item unavailability", - "cancelledDate": "2023-11-06T12:18:36.938+00:00" - } - } -} From 2c13aab160034c5a22c91c865d2fa7d6b9d8c5c3 Mon Sep 17 00:00:00 2001 From: Vignesh-Kalyanasundaram Date: Fri, 6 Dec 2024 01:34:22 +0530 Subject: [PATCH 11/11] UXPROD-5001 Code refactoring --- .../resources/swagger.api/schemas/dcbUpdateItem.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml b/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml index 92264987..8c6914b1 100644 --- a/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml +++ b/src/main/resources/swagger.api/schemas/dcbUpdateItem.yaml @@ -11,8 +11,8 @@ DcbUpdateItem: lendingLibraryCode: description: The code which identifies the lending library type: string - additionalProperties: false - required: - - barcode - - materialType - - lendingLibraryCode + additionalProperties: false + required: + - barcode + - materialType + - lendingLibraryCode