Skip to content

Commit e5afad1

Browse files
authored
Merge pull request #9 from companieshouse/PCI-715-add-delivery-details-to-basket
Add delivery details to orders api
2 parents a040751 + e18117a commit e5afad1

File tree

10 files changed

+614
-2
lines changed

10 files changed

+614
-2
lines changed

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,25 @@
1010
import org.springframework.web.bind.annotation.RestController;
1111
import uk.gov.companieshouse.logging.Logger;
1212
import uk.gov.companieshouse.logging.LoggerFactory;
13+
import uk.gov.companieshouse.orders.api.dto.AddDeliveryDetailsRequestDTO;
1314
import uk.gov.companieshouse.orders.api.dto.AddToBasketRequestDTO;
1415
import uk.gov.companieshouse.orders.api.dto.AddToBasketResponseDTO;
1516
import uk.gov.companieshouse.orders.api.dto.BasketPaymentRequestDTO;
1617
import uk.gov.companieshouse.orders.api.exception.ConflictException;
1718
import uk.gov.companieshouse.orders.api.mapper.BasketMapper;
19+
import uk.gov.companieshouse.orders.api.mapper.DeliveryDetailsMapper;
1820
import uk.gov.companieshouse.orders.api.model.ApiError;
1921
import uk.gov.companieshouse.orders.api.model.Basket;
2022
import uk.gov.companieshouse.orders.api.model.Checkout;
23+
import uk.gov.companieshouse.orders.api.model.DeliveryDetails;
2124
import uk.gov.companieshouse.orders.api.model.Item;
2225
import uk.gov.companieshouse.orders.api.model.PaymentStatus;
2326
import uk.gov.companieshouse.orders.api.service.ApiClientService;
2427
import uk.gov.companieshouse.orders.api.service.BasketService;
2528
import uk.gov.companieshouse.orders.api.service.CheckoutService;
2629
import uk.gov.companieshouse.orders.api.util.EricHeaderHelper;
2730
import uk.gov.companieshouse.orders.api.validator.CheckoutBasketValidator;
31+
import uk.gov.companieshouse.orders.api.validator.DeliveryDetailsValidator;
2832

2933
import javax.servlet.http.HttpServletRequest;
3034
import javax.validation.Valid;
@@ -45,20 +49,26 @@ public class BasketController {
4549
private static final String LOG_MESSAGE_DATA_KEY = "message";
4650

4751
private final BasketMapper mapper;
52+
private final DeliveryDetailsMapper deliveryDetailsMapper;
4853
private final BasketService basketService;
4954
private final CheckoutService checkoutService;
5055
private final CheckoutBasketValidator checkoutBasketValidator;
56+
private final DeliveryDetailsValidator deliveryDetailsValidator;
5157
private final ApiClientService apiClientService;
5258

5359
public BasketController(final BasketMapper mapper,
60+
final DeliveryDetailsMapper deliveryDetailsMapper,
5461
final BasketService basketService,
5562
final CheckoutService checkoutService,
5663
final CheckoutBasketValidator checkoutBasketValidator,
64+
final DeliveryDetailsValidator deliveryDetailsValidator,
5765
final ApiClientService apiClientService){
5866
this.mapper = mapper;
67+
this.deliveryDetailsMapper = deliveryDetailsMapper;
5968
this.basketService = basketService;
6069
this.checkoutService = checkoutService;
6170
this.checkoutBasketValidator = checkoutBasketValidator;
71+
this.deliveryDetailsValidator = deliveryDetailsValidator;
6272
this.apiClientService = apiClientService;
6373
}
6474

@@ -86,6 +96,35 @@ public ResponseEntity<AddToBasketResponseDTO> addItemToBasket(final @Valid @Requ
8696
return ResponseEntity.status(HttpStatus.OK).body(addToBasketResponseDTO);
8797
}
8898

99+
@PatchMapping("${uk.gov.companieshouse.orders.api.basket}")
100+
public ResponseEntity<?> addDeliveryDetailsToBasket(final @Valid @RequestBody AddDeliveryDetailsRequestDTO addDeliveryDetailsRequestDTO,
101+
HttpServletRequest request,
102+
final @RequestHeader(REQUEST_ID_HEADER_NAME) String requestId){
103+
trace("ENTERING addDeliveryDetailsToBasket(" + addDeliveryDetailsRequestDTO + ")", requestId);
104+
105+
final Optional<Basket> retrievedBasket = basketService.getBasketById(EricHeaderHelper.getIdentity(request));
106+
107+
DeliveryDetails mappedDeliveryDetails = deliveryDetailsMapper.addToDeliveryDetailsRequestDTOToDeliveryDetails(addDeliveryDetailsRequestDTO);
108+
109+
final List<String> errors = deliveryDetailsValidator.getValidationErrors(addDeliveryDetailsRequestDTO);
110+
if (!errors.isEmpty()) {
111+
return ResponseEntity.status(BAD_REQUEST).body(new ApiError(BAD_REQUEST, errors));
112+
}
113+
114+
Basket returnedBasket;
115+
if(retrievedBasket.isPresent()) {
116+
retrievedBasket.get().getData().setDeliveryDetails(mappedDeliveryDetails);
117+
returnedBasket = basketService.saveBasket(retrievedBasket.get());
118+
} else {
119+
Basket basket = new Basket();
120+
basket.setId(EricHeaderHelper.getIdentity((request)));
121+
basket.getData().setDeliveryDetails(mappedDeliveryDetails);
122+
returnedBasket = basketService.saveBasket(basket);
123+
}
124+
trace("EXITING addDeliveryDetailToBasket() with " + addDeliveryDetailsRequestDTO, requestId);
125+
return ResponseEntity.status(HttpStatus.OK).body(returnedBasket.getData());
126+
}
127+
89128
@PostMapping("${uk.gov.companieshouse.orders.api.basket.checkout}")
90129
public ResponseEntity<?> checkoutBasket(@RequestBody(required = false) String json,
91130
HttpServletRequest request,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package uk.gov.companieshouse.orders.api.dto;
2+
3+
public class AddDeliveryDetailsRequestDTO extends DeliveryDetailsDTO {
4+
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package uk.gov.companieshouse.orders.api.dto;
2+
3+
public class AddDeliveryDetailsResponseDTO extends DeliveryDetailsDTO {
4+
5+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package uk.gov.companieshouse.orders.api.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.google.gson.Gson;
5+
6+
import javax.validation.constraints.NotBlank;
7+
8+
public class DeliveryDetailsDTO {
9+
10+
@NotBlank
11+
@JsonProperty("address_line_1")
12+
private String addressLine1;
13+
14+
@JsonProperty("address_line_2")
15+
private String addressLine2;
16+
17+
@NotBlank
18+
@JsonProperty("country")
19+
private String country;
20+
21+
@NotBlank
22+
@JsonProperty("forename")
23+
private String forename;
24+
25+
@NotBlank
26+
@JsonProperty("locality")
27+
private String locality;
28+
29+
@JsonProperty("po_box")
30+
private String poBox;
31+
32+
@JsonProperty("postal_code")
33+
private String postalCode;
34+
35+
@NotBlank
36+
@JsonProperty("premises")
37+
private String premises;
38+
39+
@JsonProperty("region")
40+
private String region;
41+
42+
@NotBlank
43+
@JsonProperty("surname")
44+
private String surname;
45+
46+
public String getAddressLine1() {
47+
return addressLine1;
48+
}
49+
50+
public void setAddressLine1(String addressLine1) {
51+
this.addressLine1 = addressLine1;
52+
}
53+
54+
public String getAddressLine2() {
55+
return addressLine2;
56+
}
57+
58+
public void setAddressLine2(String addressLine2) {
59+
this.addressLine2 = addressLine2;
60+
}
61+
62+
public String getCountry() {
63+
return country;
64+
}
65+
66+
public void setCountry(String country) {
67+
this.country = country;
68+
}
69+
70+
public String getForename() {
71+
return forename;
72+
}
73+
74+
public void setForename(String forename) {
75+
this.forename = forename;
76+
}
77+
78+
public String getLocality() {
79+
return locality;
80+
}
81+
82+
public void setLocality(String locality) {
83+
this.locality = locality;
84+
}
85+
86+
public String getPoBox() {
87+
return poBox;
88+
}
89+
90+
public void setPoBox(String poBox) {
91+
this.poBox = poBox;
92+
}
93+
94+
public String getPostalCode() {
95+
return postalCode;
96+
}
97+
98+
public void setPostalCode(String postalCode) {
99+
this.postalCode = postalCode;
100+
}
101+
102+
public String getPremises() {
103+
return premises;
104+
}
105+
106+
public void setPremises(String premises) {
107+
this.premises = premises;
108+
}
109+
110+
public String getRegion() {
111+
return region;
112+
}
113+
114+
public void setRegion(String region) {
115+
this.region = region;
116+
}
117+
118+
public String getSurname() {
119+
return surname;
120+
}
121+
122+
public void setSurname(String surname) {
123+
this.surname = surname;
124+
}
125+
126+
@Override
127+
public String toString() { return new Gson().toJson(this); }
128+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package uk.gov.companieshouse.orders.api.mapper;
2+
3+
import org.mapstruct.Mapper;
4+
import uk.gov.companieshouse.orders.api.dto.AddDeliveryDetailsRequestDTO;
5+
import uk.gov.companieshouse.orders.api.dto.AddDeliveryDetailsResponseDTO;
6+
import uk.gov.companieshouse.orders.api.model.DeliveryDetails;
7+
8+
@Mapper(componentModel = "spring")
9+
public interface DeliveryDetailsMapper {
10+
DeliveryDetails addToDeliveryDetailsRequestDTOToDeliveryDetails(AddDeliveryDetailsRequestDTO addDeliveryDetailsRequestDTO);
11+
12+
AddDeliveryDetailsResponseDTO deliveryDetailsToAddToDeliveryDetailsDTO(DeliveryDetails deliveryDetails);
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package uk.gov.companieshouse.orders.api.validator;
2+
3+
import org.springframework.stereotype.Component;
4+
import uk.gov.companieshouse.orders.api.dto.AddDeliveryDetailsRequestDTO;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
@Component
10+
public class DeliveryDetailsValidator {
11+
12+
public DeliveryDetailsValidator() {
13+
}
14+
15+
public List<String> getValidationErrors(final AddDeliveryDetailsRequestDTO addDeliveryDetailsRequestDTO) {
16+
List<String> errors = new ArrayList<>();
17+
18+
if(addDeliveryDetailsRequestDTO.getPostalCode().isEmpty() && addDeliveryDetailsRequestDTO.getRegion().isEmpty()) {
19+
errors.add("Post code or Region is required");
20+
}
21+
return errors;
22+
}
23+
}

0 commit comments

Comments
 (0)