MVC 5 - SignalR Chat

0

Chat ma wygladać na zasadzie user -> admin. Zwykły uzytkownik może pisać tylko z adminami, a admin ze wszystkimi uzytkownikami. Nie moge sobie poradzić.

        public override System.Threading.Tasks.Task OnConnected()
        {
            ApplicationDbContext db = new ApplicationDbContext();

            ApplicationUser userDTO = db.Users.Where(x => x.UserName.Equals(Context.User.Identity.Name)).FirstOrDefault();

            string userId = userDTO.Id;

            string connId = Context.ConnectionId;

            if (!db.Online.Any(x => x.Id == userId))
            {
                Online online = new Online();

                online.Id = userId;
                online.ConnId = connId;

                db.Online.Add(online);

                db.SaveChanges();
            }

            List<string> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();

            var adminId = db.Roles.Where(p => p.Name == "Admin").Select(p => p.Id).Single();
            List<string> allFriendsIds = new List<string>();

            if (userDTO.Roles.Any(p => p.RoleId.Contains(adminId)))
            {
                allFriendsIds = db.Users.Where(p => p.Roles.Any(r => !r.RoleId.Contains(adminId))).Select(p => p.Id).ToList();
                //Admin
            }
            else
            {
                allFriendsIds = db.Users.Where(p => p.Roles.Any(r => r.RoleId.Contains(adminId))).Select(x => x.Id).ToList();
                //User
            }

            List<string> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();

            Dictionary<string, string> dictFriends = new Dictionary<string, string>(); 

            foreach (var id in resultList)
            {
                var users = db.Users.Find(id);
                string friend = users.Name;

                if (!dictFriends.ContainsValue(id))
                {
                    dictFriends.Add(id, friend);
                }
            }

            var transformed = from key in dictFriends.Keys
                              select new { id = key, friend = dictFriends[key] };

            string json = JsonConvert.SerializeObject(transformed);

            var clients = Clients.Caller;

            clients.getonlinefriends(userDTO.Name, json);

            UpdateChat();

            return base.OnConnected();
        }

        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        {
            ApplicationDbContext db = new ApplicationDbContext();

            ApplicationUser userDTO = db.Users.Where(x => x.UserName.Equals(Context.User.Identity.Name)).FirstOrDefault();
            string userId = userDTO.Id;

            if (db.Online.Any(x => x.Id == userId))
            {
                Online online = db.Online.Find(userId);
                db.Online.Remove(online);
                db.SaveChanges();
            }

            UpdateChat();

            return base.OnDisconnected(stopCalled);
        }

        public void UpdateChat()
        {
            ApplicationDbContext db = new ApplicationDbContext();

            List<string> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();

            foreach (var idUser in onlineIds)
            {
                ApplicationUser user = db.Users.Find(idUser);

                var adminId = db.Roles.Where(p => p.Name == "Admin").Select(p => p.Id).Single();
                
                List<string> allFriendsIds = new List<string>();

                if (user.Roles.Any(p => p.RoleId.Contains(adminId)))
                {
                    allFriendsIds = db.Users.Where(p => p.Roles.Any(r => !r.RoleId.Contains(adminId))).Select(p => p.Id).ToList();
                    //Admin
                }
                else
                {
                    allFriendsIds = db.Users.Where(p => p.Roles.Any(r => r.RoleId.Contains(adminId))).Select(x => x.Id).ToList();
                    //User
                }

                List<string> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();

                Dictionary<string, string> dictFriends = new Dictionary<string, string>();

                foreach (var id in resultList)
                {
                    var users = db.Users.Find(id);

                    string friend = users.Name;

                    if (!dictFriends.ContainsValue(id)) 
                    {
                        dictFriends.Add(id, friend);
                    }
                }

                var transformed = from key in dictFriends.Keys
                                  select new { id = key, friend = dictFriends[key] };

                string json = JsonConvert.SerializeObject(transformed);

                var clients = Clients.All;

                clients.updatechat(user.Name, json);
            }

        }
0

Co dokładnie sprawia problem? Jaki jest błąd? Jednym z widocznych problemów jest na przykład używanie .FirstOrDefault(), a później brak sprawdzenia czy otrzymana wartość jest nullem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1