コード例 #1
0
        public async Task <IActionResult> ValuteCurs([FromRoute] ValuteCursInput input)
        {
            if (this._options.Radius < 0)
            {
                // 0 можно. (0,0) же попадёт в этот радиус.
                return(this.Ok(new SvcOutput
                {
                    Result = null,
                    Message = $"Ошибка: В настройках указан отрицательный радиус: {this._options.Radius}",
                }));
            }
            if (this._options.ValuteCode?.Length > 0 != true)
            {
                return(this.Ok(new SvcOutput
                {
                    Result = null,
                    Message = $"Ошибка: В настройках не указан код валюты: {this._options.ValuteCode}",
                }));
            }

            Double x1       = 0d;
            Double y1       = 0d;
            Double x2       = input.X ?? 0; // проверено по атрибуту [Required] через [ApiController]
            Double y2       = input.X ?? 0; // проверено по атрибуту [Required] через [ApiController]
            var    distance = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));

            if (distance > this._options.Radius)
            {
                return(this.Ok(new SvcOutput
                {
                    Result = null,
                    Message = $"Ошибка: Точка не попадает в заданный радиус: {this._options.Radius}",
                }));
            }

            DateTime date;

            // По идее это можно вынести куда-нибудь.
            // Но не думаю, что стоит городить отдельный файл ради преобразования входного объекта в параметры метода.
            if (input.X > 0 && input.Y > 0)
            {
                // Сегодня.
                date = DateTime.Today;
            }
            else if (input.X > 0 && input.Y < 0)
            {
                // Завтра.
                date = DateTime.Today.AddDays(1);
            }
            else if (input.X < 0 && input.Y < 0)
            {
                // Позавчера.
                date = DateTime.Today.AddDays(-2);
            }
            else
            {
                // (input.X < 0 && input.Y > 0)
                // Вчера.
                date = DateTime.Today.AddDays(-1);
            }

            // Тут могут выскочить исключения т.к. всё не предусмотришь, да и сомнительно, что надо.
            // Они обработаются обработчиком, настроенным в Startup-е.
            // В окружении Development выдача ответа иная.
            ValuteCursOnDate[] resultArr = await this._service.GetCursOnDateAsync(
                date : date
                );

            if (resultArr?.Any() != true)
            {
                return(this.Ok(new SvcOutput
                {
                    Result = null,
                    Message = "По указанным данным курс не сформирован",
                }));
            }


            ValuteCursOnDate result = resultArr
                                      .FirstOrDefault(x =>
                                                      String.Equals(x.VchCode.Trim(), this._options.ValuteCode.Trim(), StringComparison.OrdinalIgnoreCase));

            if (result == null)
            {
                return(this.Ok(new SvcOutput
                {
                    Result = null,
                    Message = $"Курс валюты {this._options.ValuteCode} не найден",
                }));
            }

            // Штучка, куда удобно ставить точку.
            { }

            return(this.Ok(new SvcOutput
            {
                Result = new
                {
                    Nominal = result.Vnom,
                    Curs = result.Vcurs,
                },
                Message = null,
            }));
        }
コード例 #2
0
 public Task <IActionResult> ValuteCurs2([FromQuery] ValuteCursInput input) => this.ValuteCurs(input);