using Longbow.Web.Mvc; using MongoDB.Driver; using PetaPoco; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; namespace Bootstrap.DataAccess.MongoDB { /// /// /// public class Exceptions : DataAccess.Exceptions { private static void ClearExceptions() { System.Threading.Tasks.Task.Run(() => { DbManager.Exceptions.DeleteMany(ex => ex.LogTime < DateTime.Now.AddDays(-7)); }); } /// /// /// /// public override IEnumerable Retrieves() { return DbManager.Exceptions.Find(ex => ex.LogTime >= DateTime.Now.AddDays(-7)).ToList(); } /// /// /// /// /// /// public override bool Log(Exception ex, NameValueCollection additionalInfo) { if (ex == null) return true; var excep = new DataAccess.Exceptions { Id = null, AppDomainName = AppDomain.CurrentDomain.FriendlyName, ErrorPage = additionalInfo?["ErrorPage"] ?? (ex.GetType().Name.Length > 50 ? ex.GetType().Name.Substring(0, 50) : ex.GetType().Name), ExceptionType = ex.GetType().FullName, LogTime = DateTime.Now, Message = ex.Message, StackTrace = ex.StackTrace, UserId = additionalInfo?["UserId"], UserIp = additionalInfo?["UserIp"] }; DbManager.Exceptions.InsertOne(excep); ClearExceptions(); return true; } /// /// /// /// /// /// /// public override Page RetrievePages(PaginationOption po, DateTime? startTime, DateTime? endTime) { var exceps = DbManager.Exceptions.Find(FilterDefinition.Empty).ToList(); // sort var orderProxy = po.Order == "asc" ? new Func, List>(p => exceps.OrderBy(p).ToList()) : new Func, List>(p => exceps.OrderByDescending(p).ToList()); var logTimeProxy = po.Order == "asc" ? new Func, List>(p => exceps.OrderBy(p).ToList()) : new Func, List>(p => exceps.OrderByDescending(p).ToList()); switch (po.Sort) { case "ErrorPage": exceps = orderProxy(ex => ex.ErrorPage); break; case "UserId": exceps = orderProxy(ex => ex.UserId); break; case "UserIp": exceps = orderProxy(ex => ex.UserIp); break; case "LogTime": exceps = logTimeProxy(ex => ex.LogTime); break; } return new Page() { Context = exceps, CurrentPage = po.PageIndex, ItemsPerPage = po.Limit, TotalItems = exceps.Count, TotalPages = (long)Math.Ceiling(exceps.Count * 1.0 / po.Limit), Items = exceps.Skip(po.Offset).Take(po.Limit).ToList() }; } } }