public async Task <ICollection <ApiEvent> > ApiCall(params ApiEvent[] events) { if (events.Length == 0) { return(new ApiEvent[0]); } var inputData = new ApiInputOutput() { Header = new Header(commanderName, apiKey), Events = events }; var inputJson = inputData.ToJson(); var outputJson = await client.PostAsync(inputJson); var outputData = JsonConvert.DeserializeObject <ApiInputOutput>(outputJson); var exceptions = new List <Exception>(); // Verify output if (outputData.Events != null) { for (int i = 0; i < events.Length; i++) { var outputEvent = outputData.Events[i]; var statusCode = outputEvent.EventStatus; var statusText = outputEvent.EventStatusText; if (statusCode != 200) { if (ignoredErrors.Contains(statusText)) { continue; } exceptions.Add(new ApplicationException(statusText ?? "Unknown Error")); var log = statusCode < 300 ? Log.Warn() : Log.Error(); log.Message(statusText) .Property("input", inputData.Events[i].ToString()) .Property("output", outputEvent.ToString()) .Property("status", statusCode) .Write(); } } } if (outputData.Header.EventStatus != 200) { throw new AggregateException($"Error from API: {outputData.Header.EventStatusText}", exceptions.ToArray()); } Log.Info() .Message("Uploaded events", events.Length) .Property("eventsCount", events.Length) .Write(); return(outputData.Events); }
public async Task <ICollection <ApiEvent> > ApiCall(params ApiEvent[] events) { if (events.Length == 0) { return(new ApiEvent[0]); } var inputData = new ApiInputOutput() { Header = new Header(commanderName, apiKey), Events = events }; var inputJson = inputData.ToJson(); var outputJson = await client.PostAsync(inputJson); var outputData = JsonConvert.DeserializeObject <ApiInputOutput>(outputJson); var exceptions = new List <Exception>(); // Verify output if (outputData.Events != null) { for (int i = 0; i < events.Length; i++) { if (outputData.Events[i].EventStatus != 200) { var statusText = outputData.Events[i].EventStatusText; if (statusText.StartsWith("Some errors in the loadout appeared")) { continue; // Skip the errors related to data missing on Inara side } if (statusText == "There is a newer inventory state recorded already.") { continue; // Not really an error } var ex = new ApplicationException(statusText ?? "Unknown Error"); ex.Data.Add("input", inputData.Events[i].ToString()); ex.Data.Add("output", outputData.Events[i].ToString()); exceptions.Add(ex); logger.Error(ex, "Error returned from Inara API"); } } } if (outputData.Header.EventStatus != 200) { throw new AggregateException($"Error from API: {outputData.Header.EventStatusText}", exceptions.ToArray()); } logger.Info("Uploaded {0} INARA events", events.Length); return(outputData.Events); }