public IActionResult VisitSettings(Config input) { // Write input deletion days to appsettings.json file: _appSettings.Update(options => { options.Days = input.DaysBeforeDeletion.ToString(); }); if (ModelState.IsValid && HttpContext.Session.GetString("UserID") != null) { try { if (!string.IsNullOrEmpty(input.IPAddress)) { string[] inputIPs = input.IPAddress.Split(","); // Save visit settings to DB, IP by IP... foreach (string ip in inputIPs) { VsVisitor item = new VsVisitor(); // If the IP already exists, we'll do an update. Otherwise a new insert: if (_db.VsVisitors.Where(i => i.Ipaddress.Equals(ip)).Any()) { item = _db.VsVisitors.Where(i => i.Ipaddress.Equals(ip)).Select(i => i).FirstOrDefault(); item.Ipaddress = ip; item.IsIgnored = true; _db.VsVisitors.Update(item); _db.SaveChanges(); } else { // Calculate the deletion date to be set for new IPs: DateTime deletionDate = DateTime.Now.AddDays(input.DaysBeforeDeletion); item = new VsVisitor() { AppId = input.AppID, Ipaddress = ip, IsIgnored = true, DeleteDate = deletionDate }; _db.VsVisitors.Add(item); _db.SaveChanges(); } } // Ensure that remaining IPs stored in DB (not included in the post request) are not ignored: string[] theRestTrue = _db.VsVisitors.Where(i => i.IsIgnored.Equals(true)).Select(i => i.Ipaddress).ToArray(); string[] theRest = theRestTrue.Select(i => i).Except(inputIPs).ToArray(); if (theRest.Any()) { foreach (string ip in theRest) { VsVisitor item = _db.VsVisitors.Where(i => i.Ipaddress.Equals(ip)).Select(i => i).FirstOrDefault(); item.IsIgnored = false; _db.VsVisitors.Update(item); _db.SaveChanges(); } } } else { // If no IPs were posted, it means we want to ensure ALL IPs stored in DB is not ignored: string[] theRestTrue = _db.VsVisitors.Where(i => i.IsIgnored.Equals(true)).Select(i => i.Ipaddress).ToArray(); if (theRestTrue.Any()) { foreach (string ip in theRestTrue) { VsVisitor item = _db.VsVisitors.Where(i => i.Ipaddress.Equals(ip)).Select(i => i).FirstOrDefault(); item.IsIgnored = false; _db.VsVisitors.Update(item); _db.SaveChanges(); } } } return(new JsonResult(input)); } catch (Exception e) { String innerMessage = (e.InnerException != null) ? e.InnerException.Message : ""; Console.Write(innerMessage); } } TempData["errors"] = ErrorFeedback(); return(RedirectToAction(nameof(Settings))); }
/// <summary> /// Save the visitor statistics passed from the middleware to the DB. /// </summary> /// <param name="input"></param> public void SaveVisitorStats(VisitorStats input) { try { VsVisitor visitor = new VsVisitor() { Ipaddress = input.IPAddress, HostName = input.HostName, Agent = input.Agent, DeleteDate = input.DeletionDate, AppId = input.AppID }; // Check if visitor (IP) is to be inserted or updated to DB: if (!_db.VsVisitors.Where(i => i.Ipaddress.Equals(input.IPAddress)).Any()) { _db.VsVisitors.Add(visitor); _db.SaveChanges(); } else { visitor = _db.VsVisitors.Where(v => v.Ipaddress.Equals(input.IPAddress)).Select(v => v).FirstOrDefault(); visitor.HostName = input.HostName; visitor.Agent = input.Agent; _db.VsVisitors.Update(visitor); _db.SaveChanges(); } // Now ensure the visitor ID (to be used as reference key for visit entity) exists in DB: int visitorID = _db.VsVisitors.Where(i => i.Ipaddress.Equals(input.IPAddress)).Select(v => v.Id).First(); if (visitorID > 0) { VsVisit visit = new VsVisit { VisitorId = visitorID, RefererUrl = input.RefererURL, VisitUrl = input.VisitURL, VisitTime = input.VisitTime }; _db.VsVisits.Add(visit); _db.SaveChanges(); // Handle storage of admin visit: if (_context.HttpContext.Session.GetString("AdminIP") != null) { if (_context.HttpContext.Session.GetString("AdminIP").Equals(input.IPAddress)) { VsAdminVisit adminVisit = new VsAdminVisit() { // If admin IP session is set, then so is the user ID session (via HomeController > Login): AdminId = Convert.ToInt32(_context.HttpContext.Session.GetString("UserID")), VisitId = visit.Id }; _db.VsAdminVisits.Add(adminVisit); _db.SaveChanges(); } } } } catch (Exception e) { Console.Write(e.Message); } }