using Core.Annotations; using Core.Models.Eft.ItemEvent; using Core.Models.Enums; using Core.Routers; using Core.Utils; namespace Core.Callbacks; [Injectable] public class ItemEventCallbacks(HttpResponseUtil _httpResponseUtil, ItemEventRouter _itemEventRouter) { public async Task HandleEvents(string url, ItemEventRouterRequest info, string sessionID) { var eventResponse = await _itemEventRouter.HandleEvents(info, sessionID); var result = IsCriticalError(eventResponse.Warnings) ? _httpResponseUtil.GetBody(eventResponse, GetErrorCode(eventResponse.Warnings), eventResponse.Warnings[0].ErrorMessage) : _httpResponseUtil.GetBody(eventResponse); return result; } /// /// Return true if the passed in list of warnings contains critical issues /// /// The list of warnings to check for critical errors /// public bool IsCriticalError(List warnings) { // List of non-critical error codes, we return true if any error NOT included is passed in var nonCriticalErrorCodes = new List() { BackendErrorCodes.NOTENOUGHSPACE }; foreach (var warning in warnings) { if (!Enum.TryParse(warning.Code, out BackendErrorCodes code)) throw new Exception($"Unable to parse [{warning.Code}] to BackendErrorCode."); if (!nonCriticalErrorCodes.Contains(code)) return true; } return false; } public int GetErrorCode(List warnings) { return int.Parse((warnings[0].Code is null ? BackendErrorCodes.UNKNOWN_ERROR.ToString() : warnings.FirstOrDefault()?.Code) ?? string.Empty); } }