| | | 1 | | using Newtonsoft.Json; |
| | | 2 | | using Services.ApiServices._1CApi.OData.Models; |
| | | 3 | | |
| | | 4 | | namespace Services.ApiServices._1CApi.OData; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Извлекает читаемое сообщение из OData-ошибки (JSON или технический текст исключения). |
| | | 8 | | /// </summary> |
| | | 9 | | public static class OneCODataErrorFormatter |
| | | 10 | | { |
| | | 11 | | public static string Format(string? raw) |
| | | 12 | | { |
| | 48 | 13 | | if (string.IsNullOrWhiteSpace(raw)) |
| | 7 | 14 | | return string.Empty; |
| | | 15 | | |
| | 41 | 16 | | var trimmed = raw.Trim(); |
| | | 17 | | |
| | 41 | 18 | | var jsonStart = trimmed.IndexOf('{'); |
| | 41 | 19 | | if (jsonStart >= 0) |
| | | 20 | | { |
| | 17 | 21 | | var fromJson = TryExtractODataMessage(trimmed[jsonStart..]); |
| | 17 | 22 | | if (!string.IsNullOrWhiteSpace(fromJson)) |
| | 11 | 23 | | return fromJson.Trim(); |
| | | 24 | | } |
| | | 25 | | |
| | 30 | 26 | | if (trimmed.Contains("OData /Post action", StringComparison.Ordinal)) |
| | | 27 | | { |
| | 0 | 28 | | var colonIdx = trimmed.LastIndexOf(':'); |
| | 0 | 29 | | if (colonIdx >= 0 && colonIdx < trimmed.Length - 1) |
| | | 30 | | { |
| | 0 | 31 | | var tail = trimmed[(colonIdx + 1)..].Trim(); |
| | 0 | 32 | | var fromTail = TryExtractODataMessage(tail); |
| | 0 | 33 | | return !string.IsNullOrWhiteSpace(fromTail) ? fromTail.Trim() : tail; |
| | | 34 | | } |
| | | 35 | | } |
| | | 36 | | |
| | 30 | 37 | | return trimmed; |
| | | 38 | | } |
| | | 39 | | |
| | | 40 | | /// <summary>Код ошибки OData (<c>odata.error.code</c>), если тело — OData-ошибка в JSON.</summary> |
| | | 41 | | internal static string? TryExtractODataCode(string? body) |
| | | 42 | | { |
| | 17 | 43 | | if (string.IsNullOrWhiteSpace(body)) |
| | 2 | 44 | | return null; |
| | | 45 | | |
| | 15 | 46 | | var jsonStart = body.IndexOf('{'); |
| | 15 | 47 | | if (jsonStart < 0) |
| | 7 | 48 | | return null; |
| | | 49 | | |
| | | 50 | | try |
| | | 51 | | { |
| | 8 | 52 | | var code = JsonConvert.DeserializeObject<ODataErrorResponse>(body[jsonStart..])?.Error?.Code; |
| | 8 | 53 | | return string.IsNullOrWhiteSpace(code) ? null : code.Trim(); |
| | | 54 | | } |
| | 0 | 55 | | catch |
| | | 56 | | { |
| | 0 | 57 | | return null; |
| | | 58 | | } |
| | 8 | 59 | | } |
| | | 60 | | |
| | | 61 | | internal static string? TryExtractODataMessage(string? json) |
| | | 62 | | { |
| | 17 | 63 | | if (string.IsNullOrWhiteSpace(json)) |
| | 0 | 64 | | return null; |
| | | 65 | | |
| | | 66 | | try |
| | | 67 | | { |
| | 17 | 68 | | var err = JsonConvert.DeserializeObject<ODataErrorResponse>(json); |
| | 17 | 69 | | return err?.Error?.Message?.Value; |
| | | 70 | | } |
| | 0 | 71 | | catch |
| | | 72 | | { |
| | 0 | 73 | | return null; |
| | | 74 | | } |
| | 17 | 75 | | } |
| | | 76 | | } |