From 1b85ec5ce8195c01ae540c29d458af1fbfece7b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Mon, 1 Jun 2026 18:10:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20http=20=D0=B8=20gr?= =?UTF-8?q?pc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Но ещё требуется ревью и чистка --- src/ApiClient/Http/HttpSmsClient.cs | 33 ++++++++++++++++++--- src/ApiServer/Controllers/ApiController.cs | 9 ++++++ src/ApiServer/Services/SmsApiService.cs | 2 +- src/Console/appsettings.json | 2 +- src/Contracts/Menu/GetMenuData.cs | 7 ++--- src/Contracts/Orders/SendOrderParameters.cs | 9 +++--- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/ApiClient/Http/HttpSmsClient.cs b/src/ApiClient/Http/HttpSmsClient.cs index 6ed5bfb..67a385c 100644 --- a/src/ApiClient/Http/HttpSmsClient.cs +++ b/src/ApiClient/Http/HttpSmsClient.cs @@ -38,9 +38,11 @@ public sealed class HttpSmsClient : ISmsClient, IDisposable { var request = new SendOrderApiRequest { - CommandParameters = new SendOrderParameters( - order.Id.ToString(), - order.Items.ToList()), + CommandParameters = new SendOrderParameters + { + OrderId = order.Id.ToString(), + MenuItems = order.Items.ToList(), + }, }; var response = await SendAsync(request, cancellationToken); @@ -66,7 +68,30 @@ public sealed class HttpSmsClient : ISmsClient, IDisposable } var responseJson = await httpResponse.Content.ReadAsStringAsync(cancellationToken); - return ApiResponseDeserializer.Deserialize(responseJson); + + if (string.IsNullOrWhiteSpace(responseJson)) + { + return new ApiResponse + { + Command = request.Command, + Success = false, + ErrorMessage = $"Пустой ответ сервера (HTTP {(int)httpResponse.StatusCode}).", + }; + } + + try + { + return ApiResponseDeserializer.Deserialize(responseJson); + } + catch (JsonException) + { + return new ApiResponse + { + Command = request.Command, + Success = false, + ErrorMessage = $"Некорректный JSON в ответе (HTTP {(int)httpResponse.StatusCode}): {responseJson}", + }; + } } private static GetMenuApiResponse ToGetMenuResponse(ApiResponse response) => diff --git a/src/ApiServer/Controllers/ApiController.cs b/src/ApiServer/Controllers/ApiController.cs index b718e6c..3a740b1 100644 --- a/src/ApiServer/Controllers/ApiController.cs +++ b/src/ApiServer/Controllers/ApiController.cs @@ -31,6 +31,15 @@ public sealed class ApiController(ISmsApiService apiService) : ControllerBase ErrorMessage = $"Некорректный JSON: {ex.Message}", }); } + catch (Exception ex) + { + return Ok(new ApiResponse + { + Command = "", + Success = false, + ErrorMessage = ex.Message, + }); + } return Ok(apiService.Handle(request)); } diff --git a/src/ApiServer/Services/SmsApiService.cs b/src/ApiServer/Services/SmsApiService.cs index 11d3ee9..bf9d877 100644 --- a/src/ApiServer/Services/SmsApiService.cs +++ b/src/ApiServer/Services/SmsApiService.cs @@ -39,7 +39,7 @@ internal sealed class SmsApiService(IMenuStore store) : ISmsApiService return FailSendOrder("CommandParameters не указаны или имеют неверный формат."); } - var items = parameters.MenuItems + var items = (parameters.MenuItems ?? []) .Select(item => (item.Id, item.Quantity)) .ToList(); diff --git a/src/Console/appsettings.json b/src/Console/appsettings.json index 9c5a074..019ddd3 100644 --- a/src/Console/appsettings.json +++ b/src/Console/appsettings.json @@ -3,7 +3,7 @@ "Default": "Host=localhost;Port=5432;Database=sms_task;Username=sms;Password=sms" }, "ApiClient": { - "Backend": "Grpc" + "Backend": "Http" }, "Http": { "BaseUrl": "http://localhost:5053", diff --git a/src/Contracts/Menu/GetMenuData.cs b/src/Contracts/Menu/GetMenuData.cs index 5da530d..7137079 100644 --- a/src/Contracts/Menu/GetMenuData.cs +++ b/src/Contracts/Menu/GetMenuData.cs @@ -2,12 +2,9 @@ using Domain.Entities; namespace Contracts.Menu; -public sealed record GetMenuData(IReadOnlyList MenuItems) +public sealed record GetMenuData { - public GetMenuData() - : this([]) - { - } + public IReadOnlyList MenuItems { get; init; } = []; public override string ToString() => string.Join(Environment.NewLine, MenuItems); diff --git a/src/Contracts/Orders/SendOrderParameters.cs b/src/Contracts/Orders/SendOrderParameters.cs index 880ae0d..ef0c618 100644 --- a/src/Contracts/Orders/SendOrderParameters.cs +++ b/src/Contracts/Orders/SendOrderParameters.cs @@ -2,12 +2,11 @@ using Domain.Entities; namespace Contracts.Orders; -public sealed record SendOrderParameters(string OrderId, IReadOnlyList MenuItems) +public sealed record SendOrderParameters { - public SendOrderParameters(string OrderId) - : this(OrderId, []) - { - } + public required string OrderId { get; init; } + + public IReadOnlyList MenuItems { get; init; } = []; public override string ToString() => $"OrderId={OrderId}, Items=[{string.Join("; ", MenuItems)}]";