Advertisement
Guest User

Untitled

a guest
Aug 21st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.96 KB | None | 0 0
  1. package com.careem.incentives.ms.promotion.interfaces.controller.rest;
  2.  
  3. import static com.careem.lib.commons.type.ResponseCodeType.VALID_REQUEST_BUT_OP_FAILED;
  4. import static org.springframework.web.bind.annotation.RequestMethod.GET;
  5. import static org.springframework.web.bind.annotation.RequestMethod.PATCH;
  6. import static org.springframework.web.bind.annotation.RequestMethod.POST;
  7.  
  8. import com.careem.commons.sdk.ms.interfaces.controller.interceptor.builder.CareemErrorResponse;
  9. import com.careem.incentives.ms.promotion.domain.promo.models.PromoCodeLookup;
  10. import com.careem.incentives.ms.promotion.domain.promo.models.Promotion;
  11. import com.careem.incentives.ms.promotion.domain.promo.models.PromotionBriefInfo;
  12. import com.careem.incentives.ms.promotion.domain.promo.repos.PromotionAttributesRepo;
  13. import com.careem.incentives.ms.promotion.domain.promo.repos.PromotionRepo;
  14. import com.careem.incentives.ms.promotion.exception.CareemRuntimeException;
  15. import com.careem.incentives.ms.promotion.interfaces.controller.json.IdModel.IdModel;
  16. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.ExpirationBatchUpdateModel;
  17. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromoCodeValidationRequest;
  18. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionBatchUploadModel;
  19. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionCreditModel;
  20. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionDto;
  21. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionRedeemRequest;
  22. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionRestModel;
  23. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionUpdateUserModel;
  24. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionValidationRequest;
  25. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionValidationRequestForBooking;
  26. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.PromotionValidationResponse;
  27. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.SignupPromotionStillValidRequest;
  28. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.SignupPromotionStillValidResponse;
  29. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.SignupValidationRequest;
  30. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.SignupValidationResponse;
  31. import com.careem.incentives.ms.promotion.interfaces.controller.json.promotion.ZoneValidationRequest;
  32. import com.careem.incentives.ms.promotion.interfaces.controller.json.useravail.UserAvailedPromotionBookingRequestModel;
  33. import com.careem.incentives.ms.promotion.interfaces.controller.json.useravail.UserAvailedPromotionRequestModel;
  34. import com.careem.incentives.ms.promotion.interfaces.controller.json.useravail.UserAvailedPromotionResponseModel;
  35. import com.careem.incentives.ms.promotion.interfaces.facade.PromotionValidationServiceFacade;
  36. import com.careem.incentives.ms.promotion.service.configuration.PromotionFeature;
  37. import com.careem.incentives.ms.promotion.service.domain.PromotionBatchService;
  38. import com.careem.incentives.ms.promotion.service.domain.PromotionRedeemService;
  39. import com.careem.incentives.ms.promotion.service.domain.PromotionService;
  40. import com.careem.incentives.ms.promotion.service.domain.SignupPromotionValidationService;
  41. import com.careem.incentives.ms.promotion.utils.TogglzUtils;
  42. import com.careem.lib.commons.exception.DynamoDatabaseException;
  43. import com.careem.lib.commons.exception.FacadeException;
  44. import com.careem.lib.commons.json.model.ErrorResponse;
  45. import com.careem.lib.commons.json.model.Response;
  46. import java.util.HashMap;
  47. import java.util.List;
  48. import java.util.Map;
  49. import java.util.Optional;
  50. import javax.validation.Valid;
  51. import org.slf4j.Logger;
  52. import org.slf4j.LoggerFactory;
  53. import org.springframework.beans.factory.annotation.Autowired;
  54. import org.springframework.data.domain.Page;
  55. import org.springframework.data.domain.Pageable;
  56. import org.springframework.http.HttpHeaders;
  57. import org.springframework.http.HttpStatus;
  58. import org.springframework.http.ResponseEntity;
  59. import org.springframework.transaction.annotation.Transactional;
  60. import org.springframework.web.bind.annotation.PathVariable;
  61. import org.springframework.web.bind.annotation.PostMapping;
  62. import org.springframework.web.bind.annotation.RequestBody;
  63. import org.springframework.web.bind.annotation.RequestHeader;
  64. import org.springframework.web.bind.annotation.RequestMapping;
  65. import org.springframework.web.bind.annotation.RequestMethod;
  66. import org.springframework.web.bind.annotation.RequestParam;
  67. import org.springframework.web.bind.annotation.ResponseBody;
  68. import org.springframework.web.bind.annotation.ResponseStatus;
  69. import org.springframework.web.bind.annotation.RestController;
  70.  
  71.  
  72. @RestController
  73. @RequestMapping(value = "/promotion")
  74. public class PromotionController {
  75.  
  76. private static final Logger LOG = LoggerFactory.getLogger(PromotionController.class);
  77.  
  78. @Autowired
  79. private PromotionService promotionService;
  80.  
  81. @Autowired
  82. private PromotionValidationServiceFacade promotionValidationServiceFacade;
  83.  
  84. @Autowired
  85. private SignupPromotionValidationService signupPromotionValidationService;
  86.  
  87. @Autowired
  88. private PromotionRedeemService promotionRedeemService;
  89.  
  90. @Autowired
  91. private PromotionAttributesRepo promotionAttributesRepo;
  92.  
  93. @Autowired
  94. private PromotionBatchService promotionBatchService;
  95.  
  96. @Autowired
  97. private PromotionRepo promotionRepo;
  98.  
  99. /*
  100. Unified endpoint that lists both promotion codes (promotion bookings) and vouchers (promotion credits)
  101. */
  102. @RequestMapping
  103. @ResponseStatus(HttpStatus.OK)
  104. public Response<Page<PromotionRestModel>> list(
  105. @RequestParam(defaultValue = "true") boolean isCurrent,
  106. @RequestParam(required = false) String promotionCode,
  107. @RequestParam(required = false) Integer promotionType,
  108. Pageable pageable) {
  109. Page<PromotionRestModel> promotionResponseModels =
  110. promotionRepo.listPromotions(isCurrent, promotionCode, promotionType, pageable);
  111. return new Response<>(promotionResponseModels);
  112. }
  113.  
  114. @RequestMapping(method = {POST, PATCH})
  115. @ResponseStatus(HttpStatus.OK)
  116. public Response<IdModel> saveOrUpdate(@RequestBody PromotionRestModel request) {
  117. Promotion promotion = promotionRepo.save(PromotionRestModel.to(request));
  118. return new Response<>(new IdModel(promotion.getId()));
  119. }
  120.  
  121. /*
  122. * Endpoint for gearbox
  123. */
  124. @RequestMapping(value = "/exists", method = GET)
  125. @ResponseStatus(HttpStatus.OK)
  126. public Response<List<String>> getExistingCodes(
  127. @RequestParam List<String> codes) {
  128. return new Response<>(promotionRepo.getExistingPromocodes(codes));
  129. }
  130.  
  131. /*
  132. * Endpoint for customer demand growth
  133. */
  134. @RequestMapping(value = "/exists/{promoCode}", method = GET)
  135. @ResponseStatus(HttpStatus.OK)
  136. public Map<String, Object> promoCodeExists(@PathVariable String promoCode) {
  137. Long count = promotionRepo.countByPromoCode(promoCode);
  138. boolean exists = count.compareTo(0L) > 0;
  139. Map<String, Object> response = new HashMap<>();
  140. response.put("exists", exists);
  141. return response;
  142. }
  143.  
  144. /*
  145. endpoint that returns promotion details of a promotion booking.
  146. */
  147. @RequestMapping("{id}")
  148. @ResponseStatus(HttpStatus.OK)
  149. public Response<PromotionRestModel> findDetailsById(
  150. @PathVariable Integer id) {
  151. Promotion promotion = promotionRepo.findOne(id);
  152. return new Response<>(PromotionRestModel.from(promotion));
  153. }
  154.  
  155. @RequestMapping(value = "batch/upload", method = RequestMethod.POST)
  156. @ResponseStatus(HttpStatus.ACCEPTED)
  157. public void batchUpload(@RequestBody PromotionBatchUploadModel promotionBatchUploadModel) {
  158. promotionBatchService.batchUpload(
  159. promotionBatchUploadModel.getPromotionId(),
  160. promotionBatchUploadModel.getBatchSize(),
  161. promotionBatchUploadModel.getPromoCodes())
  162. .exceptionally(t -> {
  163. LOG.error("Error occurred during promo code batch upload : ", t);
  164. return null;
  165. });
  166. }
  167.  
  168. @RequestMapping(value = "batch/upload/voucher", method = RequestMethod.POST)
  169. @ResponseStatus(HttpStatus.ACCEPTED)
  170. public void voucherBatchUpload(@RequestBody PromotionBatchUploadModel promotionBatchUploadModel) {
  171. promotionBatchService.voucherBatchUpload(
  172. promotionBatchUploadModel.getPromotionId(),
  173. promotionBatchUploadModel.getBatchSize(),
  174. promotionBatchUploadModel.getPromoCodes())
  175. .exceptionally(t -> {
  176. LOG.error("Error occurred during voucher batch upload : ", t);
  177. return null;
  178. });
  179. }
  180.  
  181. @RequestMapping(value = "batch/update/expiration", method = RequestMethod.POST)
  182. @ResponseStatus(HttpStatus.ACCEPTED)
  183. public void expirationBatchUpdate(
  184. @RequestBody @Valid ExpirationBatchUpdateModel expirationBatchUpdateModel) {
  185. promotionBatchService.expirationBatchUpdate(
  186. expirationBatchUpdateModel.getPromoCodes(),
  187. expirationBatchUpdateModel.getBatchSize(),
  188. expirationBatchUpdateModel.getExpiration())
  189. .exceptionally(t -> {
  190. LOG.error("Error occurred during expiration batch update : ", t);
  191. return null;
  192. });
  193. }
  194.  
  195. @RequestMapping(value = "/attributes/names", method = RequestMethod.GET)
  196. @ResponseStatus(HttpStatus.OK)
  197. public Response<List<String>> listPromotionAttributeNames() {
  198. return new Response<>(promotionAttributesRepo.listAllDistinctAttributeNames());
  199. }
  200.  
  201. @RequestMapping(value = "/redeem", method = RequestMethod.POST)
  202. @ResponseStatus(HttpStatus.OK)
  203. public Response<UserAvailedPromotionResponseModel> redeem(
  204. @RequestBody UserAvailedPromotionRequestModel userAvailedPromotionModel) {
  205. return new Response<>(promotionRedeemService.redeemPromotion(userAvailedPromotionModel));
  206.  
  207. }
  208.  
  209. @RequestMapping(value = "/validate-redeem", method = RequestMethod.POST)
  210. @ResponseStatus(HttpStatus.OK)
  211. public Response<PromotionCreditModel> redeemAndValidate(
  212. @RequestBody PromotionRedeemRequest request) throws FacadeException {
  213. return new Response<>(promotionRedeemService.validateAndRedeemPromotion(request));
  214. }
  215.  
  216. @RequestMapping(value = "/rollback/redeem/{userAvailedPromotionId}", method = RequestMethod.POST)
  217. @ResponseStatus(HttpStatus.OK)
  218. @ResponseBody
  219. public Response<Boolean> rollbackRedeem(@PathVariable Integer userAvailedPromotionId) {
  220. return new Response<>(promotionRedeemService.rollbackRedeemPromotion(userAvailedPromotionId));
  221.  
  222. }
  223.  
  224. @PostMapping(path = "validate")
  225. public ResponseEntity validatePromotion(
  226. @RequestBody PromotionValidationRequest promotionValidationRequest,
  227. @RequestParam Integer userId,
  228. @RequestHeader(value = "Error-Response-Version", required = false)
  229. String errorResponseVersion) {
  230. try {
  231. promotionValidationServiceFacade
  232. .validateUserPassengerAccessRight(userId, promotionValidationRequest.getClientId());
  233. } catch (final CareemRuntimeException ex) {
  234. final FacadeException facadeException = new FacadeException(
  235. CareemRuntimeException.toServiceException(ex));
  236. return handleFacadeException(facadeException, errorResponseVersion);
  237. }
  238. try {
  239. TogglzUtils.bind(promotionValidationRequest);
  240.  
  241. List<PromotionValidationResponse> promotionValidationResponseList =
  242. promotionValidationServiceFacade
  243. .validateVouchersAndPromotions(promotionValidationRequest,
  244. PromotionFeature.ENABLE_FAIL_FAST_FOR_PROMOTION_VALIDATION_API.isActive());
  245.  
  246. return new ResponseEntity<>(new Response<>(promotionValidationResponseList), HttpStatus.OK);
  247. } catch (final FacadeException e) {
  248. return handleFacadeException(e, errorResponseVersion);
  249. }
  250. }
  251.  
  252. private ResponseEntity handleFacadeException(final FacadeException exception,
  253. final String errorResponseVersionHeader) {
  254. final int statusCode = Optional.ofNullable(exception.getHttpStatus())
  255. .map(status -> status.getCode())
  256. .orElse(400);
  257. new CareemErrorResponse(null, null, null, null, exception)
  258. .getResponse();
  259. final ErrorResponse errorResponse = new ErrorResponse(exception.getAppCode(),
  260. exception.getAppMessage(), exception.getFields(), exception.getAppMessage());
  261. final Object response;
  262. final int errorResponseVersion = "3".equals(errorResponseVersionHeader) ? 3 : 2;
  263. if (errorResponseVersion == 3) {
  264. response = new Response<>(VALID_REQUEST_BUT_OP_FAILED.getCode(), errorResponse);
  265. } else {
  266. response = errorResponse;
  267. }
  268. final HttpHeaders headers = new HttpHeaders();
  269. headers.add("Error-Response-Version", Integer.toString(errorResponseVersion));
  270. final HttpStatus httpStatus = HttpStatus.valueOf(statusCode);
  271. return new ResponseEntity<>(response, headers, httpStatus);
  272. }
  273.  
  274. @RequestMapping(value = "promotion-for-booking", method = RequestMethod.POST)
  275. public Response<PromotionDto> getPromotionForBooking(
  276. @RequestBody PromotionValidationRequestForBooking promotionValidationRequest)
  277. throws FacadeException {
  278. PromotionDto promotionDto = promotionValidationServiceFacade
  279. .validateVouchersAndPromotionsForBooking(promotionValidationRequest, false);
  280. return new Response(promotionDto);
  281. }
  282.  
  283. @RequestMapping(value = "validate/promocode", method = RequestMethod.POST)
  284. public Response<PromotionValidationResponse> validatePromoCode(
  285. @RequestBody PromoCodeValidationRequest promotionValidationRequest)
  286. throws FacadeException {
  287. return new Response<>(
  288. promotionValidationServiceFacade.validatePromoCode(promotionValidationRequest, false));
  289. }
  290.  
  291. @RequestMapping(value = "validate/zone", method = RequestMethod.POST)
  292. @ResponseBody
  293. public Response<PromotionValidationResponse> validatePromotionZone(
  294. @RequestBody ZoneValidationRequest zoneValidationRequest) throws FacadeException {
  295. return new Response<>(
  296. promotionValidationServiceFacade.validatePromotionZones(zoneValidationRequest));
  297. }
  298.  
  299. /*
  300. This endpoint is used by solutions.
  301. */
  302. @RequestMapping(value = "list/all", method = RequestMethod.GET)
  303. public Response<List<PromotionBriefInfo>> listAllPromotionAndVoucherCodes(
  304. @RequestParam(required = false) Integer serviceAreaId,
  305. @RequestParam(required = false) Boolean isSignUpOnly,
  306. @RequestParam Integer serviceProviderId, @RequestParam String promoCode) {
  307. return new Response<>(promotionService.listAllPromotionAndVoucherCodes(
  308. serviceAreaId, isSignUpOnly, serviceProviderId, promoCode));
  309. }
  310.  
  311. /*
  312. This endpoint is used by solutions.
  313. */
  314. @RequestMapping(value = "list/vouchers", method = RequestMethod.GET)
  315. public Response<List<PromotionBriefInfo>> listAllVoucherCodes(
  316. @RequestParam Integer serviceProviderId, @RequestParam String promoCode) {
  317. return new Response<>(promotionService.listAllVoucherCodes(serviceProviderId, promoCode));
  318. }
  319.  
  320. @RequestMapping(value = "summary", method = RequestMethod.GET)
  321. public Response<PromoCodeLookup> findPromoCodesInRange(
  322. @RequestParam(required = false) String promoCode, @RequestParam Integer start,
  323. @RequestParam Integer limit) {
  324. return new Response<>(promotionService.findPromoCodesInRange(promoCode, start, limit));
  325. }
  326.  
  327. @RequestMapping(value = "validate/signup", method = RequestMethod.POST)
  328. public Response<SignupValidationResponse> validateSignup(
  329. @RequestBody SignupValidationRequest signupValidationRequest)
  330. throws FacadeException {
  331. return new Response<>(
  332. signupPromotionValidationService.validateSignupPromotion(signupValidationRequest));
  333. }
  334.  
  335. @RequestMapping(value = "findFirstByPromoCodeAndServiceProviderId", method = RequestMethod.GET)
  336. @ResponseBody
  337. public Response<PromotionRestModel> findFirstByPromoCodeAndServiceProviderId(
  338. @RequestParam String promotionCode, @RequestParam Integer serviceProviderId)
  339. throws FacadeException {
  340. return new Response<>(promotionService
  341. .findFirstByPromoCodeAndServiceProviderId(promotionCode, serviceProviderId));
  342. }
  343.  
  344. @RequestMapping(value = "manage/promotion/updateuser", method = {POST})
  345. public Response<IdModel> updatePromotionUserIds(
  346. @RequestBody PromotionUpdateUserModel promotionUpdateUserModel)
  347. throws FacadeException, DynamoDatabaseException {
  348.  
  349. IdModel idModel = promotionService.updatePromotionUserIds(promotionUpdateUserModel);
  350. return new Response<>(idModel);
  351. }
  352.  
  353. @RequestMapping(value = "booking/redeem", method = RequestMethod.POST)
  354. @ResponseStatus(HttpStatus.OK)
  355. public Response<UserAvailedPromotionResponseModel> redeemPromotionBooking(
  356. @RequestBody UserAvailedPromotionBookingRequestModel userAvailedPromotionModel) {
  357. return new Response<>(promotionRedeemService.redeemPromotionBooking(userAvailedPromotionModel));
  358.  
  359. }
  360.  
  361. @Transactional(value = "promotion")
  362. @RequestMapping(value = "increase-usage-count/{promotionId}", method = RequestMethod.POST)
  363. @ResponseStatus(HttpStatus.CREATED)
  364. public Response<Map<String, Object>> increasePromotionUsageCount(
  365. @PathVariable Integer promotionId) {
  366. Integer promotionUsageCount = promotionRedeemService.increasePromotionUsageCount(promotionId);
  367. Map<String, Object> responseMap = new HashMap<>();
  368. responseMap.put("promotionUsageCount", promotionUsageCount);
  369. return new Response<>(responseMap);
  370. }
  371.  
  372. @RequestMapping(value = "validate/signup/stillValid", method = RequestMethod.POST)
  373. public Response<SignupPromotionStillValidResponse> validateSignupPromotionStillValid(
  374. @RequestBody SignupPromotionStillValidRequest signupPromotionStillValidRequest)
  375. throws FacadeException {
  376. return new Response<>(signupPromotionValidationService
  377. .validateSignupPromotionStillValid(signupPromotionStillValidRequest));
  378. }
  379.  
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement