1010import org .springframework .web .bind .annotation .RestController ;
1111import uk .gov .companieshouse .logging .Logger ;
1212import uk .gov .companieshouse .logging .LoggerFactory ;
13+ import uk .gov .companieshouse .orders .api .dto .AddDeliveryDetailsRequestDTO ;
1314import uk .gov .companieshouse .orders .api .dto .AddToBasketRequestDTO ;
1415import uk .gov .companieshouse .orders .api .dto .AddToBasketResponseDTO ;
1516import uk .gov .companieshouse .orders .api .dto .BasketPaymentRequestDTO ;
1617import uk .gov .companieshouse .orders .api .exception .ConflictException ;
1718import uk .gov .companieshouse .orders .api .mapper .BasketMapper ;
19+ import uk .gov .companieshouse .orders .api .mapper .DeliveryDetailsMapper ;
1820import uk .gov .companieshouse .orders .api .model .ApiError ;
1921import uk .gov .companieshouse .orders .api .model .Basket ;
2022import uk .gov .companieshouse .orders .api .model .Checkout ;
23+ import uk .gov .companieshouse .orders .api .model .DeliveryDetails ;
2124import uk .gov .companieshouse .orders .api .model .Item ;
2225import uk .gov .companieshouse .orders .api .model .PaymentStatus ;
2326import uk .gov .companieshouse .orders .api .service .ApiClientService ;
2427import uk .gov .companieshouse .orders .api .service .BasketService ;
2528import uk .gov .companieshouse .orders .api .service .CheckoutService ;
2629import uk .gov .companieshouse .orders .api .util .EricHeaderHelper ;
2730import uk .gov .companieshouse .orders .api .validator .CheckoutBasketValidator ;
31+ import uk .gov .companieshouse .orders .api .validator .DeliveryDetailsValidator ;
2832
2933import javax .servlet .http .HttpServletRequest ;
3034import 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 ,
0 commit comments