public static JmOptionRequest CreateOptionRequest(this JmPriceRequest request) { return(new JmOptionRequest { OperationType = request.OperationType, UnitType = request.UnitType }); }
public async Task <JmOptionResponse> GetOptionResponse(JmPriceRequest priceRequest) { _validator.Validate(priceRequest); var options = await _optionsRepository.GetAsync(priceRequest.CreateOptionRequest()); return(new JmOptionResponse(options.Select(o => o.CreateDomain()))); }
public async Task <JmPrice> GetAsync(JmPriceRequest request) { var price = await _dataStorage.GetData(x => x.Height >= request.Height && x.Height < (request.Height + 100) && x.UnitType == request.UnitType); return(price); }
public async Task <ActionResult> GetOptions([FromBody] JmPriceRequest priceRequest) { try { var options = await _priceProcessor.GetOptionResponse(priceRequest); return(Ok(options)); } catch (Exception x) { return(BadRequest(x.Message)); } }
public async Task <ActionResult> GetPrice([FromBody] JmPriceRequest priceRequest) { try { var price = await _priceProcessor.CalculatePrice(priceRequest); return(Ok(price)); } catch (Exception x) { return(BadRequest(x.Message)); } }
public void Validate(JmPriceRequest request) { var context = new ValidationContext(request); var results = new List <ValidationResult>(); if (!Validator.TryValidateObject(request, context, results, true)) { StringBuilder sb = new StringBuilder(); foreach (var result in results) { sb.Append($"{result.ErrorMessage}; "); } throw new ValidationException(sb.ToString()); } }
public async Task <JmPriceResponse> CalculatePrice(JmPriceRequest priceRequest) { _validator.Validate(priceRequest); var price = await _priceRepository.GetAsync(priceRequest); if (price == null) { throw new NullReferenceException(nameof(price)); } if (price.Values.Length == 0) { throw new ArgumentOutOfRangeException(nameof(price.Values), "Cann't find price for specified height"); } var priceResponse = new JmPriceResponse() { PricePerUnit = price.Values[(priceRequest.Width - 500) / 100] }; return(await CalculateOptions(priceResponse, priceRequest)); }
private async Task <JmPriceResponse> CalculateOptions(JmPriceResponse priceResponse, JmPriceRequest priceRequest) { var options = await _optionsRepository.GetAsync(priceRequest.CreateOptionRequest()); if (options == null) { throw new NullReferenceException(nameof(options)); } foreach (var option in options.Where(op => op == priceRequest.GuidingRailBracket || op == priceRequest.HeadRailBraket || op == priceRequest.OperationControl || op == priceRequest.LeftGuidingRail || op == priceRequest.RightGuidingRail)) { var optionQuantity = 1; if (option.Type == typeof(JmHeadrailBracketTypes).FullName) { var quantity = (priceRequest.Width - 400) / 800; optionQuantity = quantity < 2 ? 2 : quantity; } else if (option.Type == typeof(JmWireBracketTypes).FullName) { optionQuantity = 2; } else if (option.Type == typeof(JmGuidingRailTypes).FullName) { var quantity = (priceRequest.Height - 400) / 800; optionQuantity = quantity < 1 ? 2 : quantity * 2; } priceResponse.PricePerUnit += option.Price * optionQuantity; } priceResponse.TotalPrice = priceRequest.Quantity * priceResponse.PricePerUnit; return(priceResponse); }