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)}]";