Example #1
0
        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);
            }
        }