Skip to content

Commit 02c158b

Browse files
authored
Merge pull request #151 from companieshouse/dcac-256-update-item
DCAC-256, DCAC-257 - PATCH order item method
2 parents d69bf9e + 0c9a70b commit 02c158b

File tree

12 files changed

+349
-51
lines changed

12 files changed

+349
-51
lines changed

src/main/java/uk/gov/companieshouse/orders/api/controller/OrderController.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
import org.springframework.http.ResponseEntity;
1818
import org.springframework.validation.annotation.Validated;
1919
import org.springframework.web.bind.annotation.GetMapping;
20+
import org.springframework.web.bind.annotation.PatchMapping;
2021
import org.springframework.web.bind.annotation.PathVariable;
2122
import org.springframework.web.bind.annotation.PostMapping;
23+
import org.springframework.web.bind.annotation.RequestBody;
2224
import org.springframework.web.bind.annotation.RequestHeader;
2325
import org.springframework.web.bind.annotation.RequestParam;
2426
import org.springframework.web.bind.annotation.RestController;
2527
import uk.gov.companieshouse.logging.Logger;
2628
import uk.gov.companieshouse.logging.LoggerFactory;
29+
import uk.gov.companieshouse.orders.api.dto.PatchOrderedItemDTO;
2730
import uk.gov.companieshouse.orders.api.exception.ResourceNotFoundException;
2831
import uk.gov.companieshouse.orders.api.logging.LoggingUtils;
2932
import uk.gov.companieshouse.orders.api.model.Checkout;
@@ -32,6 +35,7 @@
3235
import uk.gov.companieshouse.orders.api.model.CheckoutSearchCriteria;
3336
import uk.gov.companieshouse.orders.api.model.CheckoutSearchResults;
3437
import uk.gov.companieshouse.orders.api.model.Item;
38+
import uk.gov.companieshouse.orders.api.model.ItemStatus;
3539
import uk.gov.companieshouse.orders.api.model.Order;
3640
import uk.gov.companieshouse.orders.api.model.OrderData;
3741
import uk.gov.companieshouse.orders.api.model.PageCriteria;
@@ -51,7 +55,7 @@ public class OrderController {
5155
public static final String GET_ORDER_URI =
5256
"${uk.gov.companieshouse.orders.api.orders}/{" + ORDER_ID_PATH_VARIABLE + "}";
5357

54-
public static final String GET_ORDER_ITEM_URI = "/orders/{id}/items/{itemId}";
58+
public static final String ORDER_ITEM_URI = "/orders/{id}/items/{itemId}";
5559
public static final String GET_CHECKOUT_ITEM_URI = "/checkouts/{id}/items/{itemId}";
5660

5761
/** <code>${uk.gov.companieshouse.orders.api.checkouts}/{id}</code> */
@@ -86,7 +90,7 @@ public ResponseEntity<OrderData> getOrder(final @PathVariable(ORDER_ID_PATH_VARI
8690
return ResponseEntity.ok().body(orderRetrieved.getData());
8791
}
8892

89-
@GetMapping(GET_ORDER_ITEM_URI)
93+
@GetMapping(ORDER_ITEM_URI)
9094
public ResponseEntity<Item> getOrderItem(final @PathVariable("id") String orderId,
9195
final @PathVariable("itemId") String itemId,
9296
final @RequestHeader(REQUEST_ID_HEADER_NAME) String requestId) {
@@ -101,6 +105,22 @@ public ResponseEntity<Item> getOrderItem(final @PathVariable("id") String orderI
101105
return ResponseEntity.ok().body(item);
102106
}
103107

108+
@PatchMapping(ORDER_ITEM_URI)
109+
public ResponseEntity<Item> patchOrderItem(final @PathVariable("id") String orderId,
110+
final @PathVariable("itemId") String itemId,
111+
final @RequestBody PatchOrderedItemDTO patchOrderedItemDTO,
112+
final @RequestHeader(REQUEST_ID_HEADER_NAME) String requestId) {
113+
Map<String, Object> logMap = createLogMapWithRequestId(requestId);
114+
logIfNotNull(logMap, LoggingUtils.ORDER_ID, orderId);
115+
logIfNotNull(logMap, LoggingUtils.ITEM_ID, itemId);
116+
LOGGER.info("Patching order item", logMap);
117+
118+
final Item patchedItem = orderService.patchOrderItem(orderId, itemId, patchOrderedItemDTO)
119+
.orElseThrow(ResourceNotFoundException::new);
120+
121+
return ResponseEntity.ok().body(patchedItem);
122+
}
123+
104124
@GetMapping(GET_CHECKOUT_ITEM_URI)
105125
public ResponseEntity<CheckoutData> getCheckoutItem(final @PathVariable("id") String checkoutId,
106126
final @PathVariable("itemId") String itemId,
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package uk.gov.companieshouse.orders.api.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import uk.gov.companieshouse.orders.api.model.ItemStatus;
5+
6+
public class PatchOrderedItemDTO {
7+
8+
@JsonProperty("digital_document_location")
9+
private String digitalDocumentLocation;
10+
11+
@JsonProperty("status")
12+
private ItemStatus status;
13+
14+
public String getDigitalDocumentLocation() {
15+
return digitalDocumentLocation;
16+
}
17+
18+
public void setDigitalDocumentLocation(String digitalDocumentLocation) {
19+
this.digitalDocumentLocation = digitalDocumentLocation;
20+
}
21+
22+
public ItemStatus getStatus() {
23+
return status;
24+
}
25+
26+
public void setStatus(ItemStatus status) {
27+
this.status = status;
28+
}
29+
}

src/main/java/uk/gov/companieshouse/orders/api/interceptor/RequestUris.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static uk.gov.companieshouse.orders.api.controller.BasketController.*;
44
import static uk.gov.companieshouse.orders.api.controller.OrderController.GET_CHECKOUT_ITEM_URI;
55
import static uk.gov.companieshouse.orders.api.controller.OrderController.GET_CHECKOUT_URI;
6-
import static uk.gov.companieshouse.orders.api.controller.OrderController.GET_ORDER_ITEM_URI;
6+
import static uk.gov.companieshouse.orders.api.controller.OrderController.ORDER_ITEM_URI;
77
import static uk.gov.companieshouse.orders.api.controller.OrderController.GET_ORDER_URI;
88
import static uk.gov.companieshouse.orders.api.controller.OrderController.CHECKOUTS_SEARCH_URI;
99
import static uk.gov.companieshouse.orders.api.controller.OrderController.POST_REPROCESS_ORDER_URI;
@@ -27,6 +27,7 @@ class RequestUris {
2727
static final String PATCH_PAYMENT_DETAILS = "patchPaymentDetails";
2828
static final String GET_ORDER = "getOrder";
2929
static final String GET_ORDER_ITEM = "getOrderItem";
30+
static final String PATCH_ORDER_ITEM = "patchOrderItem";
3031
static final String SEARCH = "searchCheckouts";
3132
static final String GET_CHECKOUT = "getCheckout";
3233
static final String GET_CHECKOUT_ITEM = "getCheckoutItem";
@@ -44,8 +45,8 @@ class RequestUris {
4445
@Value(GET_PAYMENT_DETAILS_URI)
4546
private String getPaymentDetailsUri;
4647
@Value(GET_ORDER_URI)
47-
private String getOrderUri;
48-
@Value(GET_ORDER_ITEM_URI)
48+
private String orderItemUri;
49+
@Value(ORDER_ITEM_URI)
4950
private String getOrderItemUri;
5051
@Value(CHECKOUTS_SEARCH_URI)
5152
private String searchUri;
@@ -113,7 +114,7 @@ List<RequestMappingInfo> requestMappingInfoList() {
113114
.build());
114115

115116
knownRequests.add(RequestMappingInfo
116-
.paths(getOrderUri)
117+
.paths(orderItemUri)
117118
.methods(RequestMethod.GET)
118119
.mappingName(GET_ORDER)
119120
.build());
@@ -124,6 +125,12 @@ List<RequestMappingInfo> requestMappingInfoList() {
124125
.mappingName(GET_ORDER_ITEM)
125126
.build());
126127

128+
knownRequests.add(RequestMappingInfo
129+
.paths(getOrderItemUri)
130+
.methods(RequestMethod.PATCH)
131+
.mappingName(PATCH_ORDER_ITEM)
132+
.build());
133+
127134
knownRequests.add(RequestMappingInfo
128135
.paths(getCheckoutItemUri)
129136
.methods(RequestMethod.GET)

src/main/java/uk/gov/companieshouse/orders/api/interceptor/UserAuthenticationInterceptor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private boolean checkAuthenticated(HttpServletRequest request, HttpServletRespon
5858
case GET_ORDER:
5959
return hasAuthenticatedClient(request, response);
6060
case GET_ORDER_ITEM:
61+
case PATCH_ORDER_ITEM:
6162
return securityManager.checkIdentity() || hasAuthenticatedClient(request, response);
6263
case GET_CHECKOUT:
6364
case SEARCH:

src/main/java/uk/gov/companieshouse/orders/api/interceptor/UserAuthorisationInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.GET_ORDER;
1515
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.GET_ORDER_ITEM;
1616
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.GET_PAYMENT_DETAILS;
17+
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.PATCH_ORDER_ITEM;
1718
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.PATCH_PAYMENT_DETAILS;
1819
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.POST_REPROCESS_ORDER;
1920
import static uk.gov.companieshouse.orders.api.interceptor.RequestUris.REMOVE_BASKET_ITEM;
@@ -90,6 +91,7 @@ private boolean checkAuthorised(HttpServletRequest request, HttpServletResponse
9091
case GET_ORDER:
9192
return getRequestClientIsAuthorised(request, response, this::getOrderUserIsResourceOwner);
9293
case GET_ORDER_ITEM:
94+
case PATCH_ORDER_ITEM:
9395
return securityManager.checkPermission() || getRequestClientIsAuthorised(request, response, this::getOrderUserIsResourceOwner);
9496
case SEARCH:
9597
case GET_CHECKOUT_ITEM:

src/main/java/uk/gov/companieshouse/orders/api/model/Item.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public class Item {
4747

4848
private String totalItemCost;
4949

50+
private String digitalDocumentLocation;
51+
5052
public String getId() {
5153
return id;
5254
}
@@ -198,4 +200,12 @@ public String getTotalItemCost() {
198200
public void setTotalItemCost(String totalItemCost) {
199201
this.totalItemCost = totalItemCost;
200202
}
203+
204+
public String getDigitalDocumentLocation() {
205+
return digitalDocumentLocation;
206+
}
207+
208+
public void setDigitalDocumentLocation(String digitalDocumentLocation) {
209+
this.digitalDocumentLocation = digitalDocumentLocation;
210+
}
201211
}

src/main/java/uk/gov/companieshouse/orders/api/model/ItemStatus.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
public enum ItemStatus {
88
UNKNOWN,
99
PROCESSING,
10-
SATISFIED;
10+
SATISFIED,
11+
CANCELLED,
12+
FAILED;
1113

1214
@JsonValue
1315
public String getJsonName() {

src/main/java/uk/gov/companieshouse/orders/api/service/OrderService.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
package uk.gov.companieshouse.orders.api.service;
22

3-
import static uk.gov.companieshouse.orders.api.logging.LoggingUtils.APPLICATION_NAMESPACE;
4-
53
import com.mongodb.MongoException;
6-
import java.time.LocalDateTime;
7-
import java.util.Map;
8-
import java.util.Optional;
9-
104
import org.springframework.beans.factory.annotation.Value;
115
import org.springframework.stereotype.Service;
126
import uk.gov.companieshouse.logging.Logger;
137
import uk.gov.companieshouse.logging.LoggerFactory;
148
import uk.gov.companieshouse.orders.OrderReceived;
9+
import uk.gov.companieshouse.orders.api.dto.PatchOrderedItemDTO;
1510
import uk.gov.companieshouse.orders.api.exception.ForbiddenException;
1611
import uk.gov.companieshouse.orders.api.exception.MongoOperationException;
1712
import uk.gov.companieshouse.orders.api.kafka.OrderReceivedMessageProducer;
@@ -23,6 +18,12 @@
2318
import uk.gov.companieshouse.orders.api.repository.CheckoutRepository;
2419
import uk.gov.companieshouse.orders.api.repository.OrderRepository;
2520

21+
import java.time.LocalDateTime;
22+
import java.util.Map;
23+
import java.util.Optional;
24+
25+
import static uk.gov.companieshouse.orders.api.logging.LoggingUtils.APPLICATION_NAMESPACE;
26+
2627
@Service
2728
public class OrderService {
2829

@@ -103,6 +104,37 @@ public Optional<Item> getOrderItem(String orderId, String itemId) {
103104

104105
}
105106

107+
public Optional<Item> patchOrderItem(String orderId, String itemId, PatchOrderedItemDTO patchOrderedItemDTO) {
108+
Map<String, Object> logMap = LoggingUtils.createLogMap();
109+
LoggingUtils.logIfNotNull(logMap, LoggingUtils.ORDER_ID, orderId);
110+
LoggingUtils.logIfNotNull(logMap, LoggingUtils.ITEM_ID, itemId);
111+
LOGGER.info("Patching order item", logMap);
112+
113+
Optional<Order> orderToUpdate = orderRepository.findById(orderId);
114+
return orderToUpdate.flatMap(o -> {
115+
Optional<Item> updatedItem = o.getData()
116+
.getItems()
117+
.stream()
118+
.filter(item -> item.getId().equals(itemId))
119+
.findFirst();
120+
updatedItem.ifPresent(item -> {
121+
item.setDigitalDocumentLocation(patchOrderedItemDTO.getDigitalDocumentLocation());
122+
item.setStatus(patchOrderedItemDTO.getStatus());
123+
});
124+
125+
try {
126+
orderRepository.save(orderToUpdate.get());
127+
} catch (MongoException ex) {
128+
String errorMessage = String.format(
129+
"Failed to update item with id %s within order %s",itemId, orderId
130+
);
131+
LOGGER.error(errorMessage, ex, logMap);
132+
throw new MongoOperationException(errorMessage, ex);
133+
}
134+
return updatedItem;
135+
});
136+
}
137+
106138
public Optional<Checkout> getCheckout(String id) {
107139
return checkoutRepository.findById(id);
108140
}

0 commit comments

Comments
 (0)