示例#1
0
        public async Task <IActionResult> GetLoginStatus(bool asAdministrator = false)
        {
            IEnumerable <Login> logins;

            if (User.FindFirst("role")?.Value == "Administrator" && asAdministrator)
            {
                logins = await _repo.GetLogins();
            }
            else
            {
                var userId = User.FindFirst("sub").Value;
                logins = await _repo.GetLogins(userId);
            }

            DateTime date            = DateTime.Now;
            var      firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
            var      lastDayOfMonth  = firstDayOfMonth.AddMonths(1);
            var      accts           = await _repo.GetAcctNAsync(logins.Select(c => c.LoginName).ToString(','), firstDayOfMonth, lastDayOfMonth);

            var acctsss = await _repo.GetSSAcctNAsync(logins.Select(c => c.LoginName).ToString(','), firstDayOfMonth, lastDayOfMonth);

            var onlines = await GetOnlineUserNamesAsync();

            var model = logins.Select(c => new LoginStatus
            {
                AllowDialIn      = c.AllowDialIn,
                Enabled          = c.Enabled,
                LoginName        = c.LoginName,
                UserId           = c.UserId,
                MonthlyTraffic   = c.MonthlyTraffic,
                SSMonthlyTraffic = acctsss.FirstOrDefault(d => d.Item1 == c.LoginName).Item2,
                IsOnline         = onlines.Contains(c.LoginName),
                Port             = c.Port,
                BasicAcct        = new BasicAcct()
                {
                    TotalIn  = accts.FirstOrDefault(d => d.UserName == c.LoginName)?.TotalInput ?? 0,
                    TotalOut = accts.FirstOrDefault(d => d.UserName == c.LoginName)?.TotalOutput ?? 0,
                }
            }).ToArray();

            return(Ok(model));
        }
示例#2
0
        public async Task <IActionResult> Get()
        {
            DateTime date            = DateTime.Now;
            var      firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
            var      lastDayOfMonth  = firstDayOfMonth.AddMonths(1);
            var      accts           = await _repo.GetAcctNAsync(firstDayOfMonth, lastDayOfMonth);

            if (accts == null)
            {
                throw new Exception("not accts found");
            }
            var logins = await _adContext.Logins.ToListAsync();

            if (logins == null)
            {
                throw new Exception("not logins found");
            }
            var userInfos = await _repo.GetUserInfosAsync();

            if (userInfos == null)
            {
                throw new Exception("not userInfos found");
            }
            foreach (var u in userInfos)
            {
                var temp_logins = logins.Where(c => c.UserId == u.UserId);
                if (temp_logins.IsNullOrCountEqualsZero())
                {
                    //TODO log user do not have any logins
                    Console.WriteLine("log user do not have any logins");
                    continue;
                }
                var temp_accts = accts.Where(c => temp_logins.Any(l => l.LoginName == c.UserName));
                if (temp_accts.IsNullOrCountEqualsZero())
                {
                    //TODO user do not connection single time.
                    Console.WriteLine("user do not connection single time.");
                    continue;
                }
                var totalIn      = temp_accts.Sum(c => c.TotalInput);
                var totalOut     = temp_accts.Sum(c => c.TotalOutput);
                var totalTraffic = totalIn + totalOut;
                if (totalTraffic > u.MonthlyTraffic)
                {
                    Console.WriteLine($"{totalTraffic} > {u.MonthlyTraffic} = {totalTraffic > u.MonthlyTraffic}");
                    // send command disable all user's logins
                    var lgs = _adContext.Logins.Where(c => c.UserId == u.UserId);
                    foreach (var l in lgs)
                    {
                        l.Enabled = false;
                    }
                    // log it
                }
                else
                {
                    Console.WriteLine($"{totalTraffic} > {u.MonthlyTraffic} = {totalTraffic > u.MonthlyTraffic}");
                    // send command enable all user' logins
                    var lgs = _adContext.Logins.Where(c => c.UserId == u.UserId);
                    foreach (var l in lgs)
                    {
                        l.Enabled = true;
                    }
                    // log it
                }
            }

            foreach (var a in accts)
            {
                var totalTraffic = a.TotalInput + a.TotalOutput;
                //TODO when login can configure max traffic then allow dial in set to false, else enable it.
                var login = logins.FirstOrDefault(c => c.LoginName == a.UserName);
                if (login?.MonthlyTraffic == null)
                {
                    login.AllowDialIn = true;
                }
                else if (totalTraffic > login.MonthlyTraffic)
                {
                    login.AllowDialIn = false;
                }
                else
                {
                    login.AllowDialIn = true;
                }
            }

            await _adContext.SaveChangesAsync();

            return(Ok());
        }