using System; using Hangfire; using LeafWeb.Core.DAL; using LeafWeb.Core.Entities; using LeafWeb.Core.Remote; using NLog; namespace LeafWeb.Web.Services { public abstract class PiscalQueueBase : IDisposable { protected readonly DataService DataService; protected readonly PiscalService PiscalService; protected readonly Logger Logger; protected PiscalQueueBase(DataService dataService, PiscalService piscalService) { DataService = dataService; PiscalService = piscalService; Logger = LogManager.GetLogger(GetType().Name); } protected PiscalQueueBase() : this(new DataService(), new PiscalService()) { } protected string FormatException(Exception ex, int leafInputId) { return $"LeafInput: {leafInputId}{Environment.NewLine}" + $"Class: {GetType().Name}{Environment.NewLine}" + $"Exception: {ex.Message}{Environment.NewLine}" + (ex.InnerException != null ? $"InnerException: {ex.InnerException}{Environment.NewLine}" : string.Empty) + $"StackTrace: {ex.StackTrace}"; } protected void PiscalExceptionNotify(PiscalClientException ex, LeafInput leafInput) { var errorMessage = FormatException(ex, ex.LeafInputId); Logger.Error(errorMessage); BackgroundJob.Enqueue( email => email.SendAdministratorMessage($"LeafWeb: PiscalQueue {GetType().Name} Exception", errorMessage)); // TODO send user email too if (leafInput != null) { DataService.SetLeafInputStatus(leafInput, LeafInputStatusType.Exception, "Error occurred processing LeafInput", ex.Message); BackgroundJob.Enqueue(s => s.DoWork(leafInput.Id)); } } public void Dispose() { DataService.Dispose(); } } }