Esempio n. 1
0
 private void HandleCreateSubscription(Guid userId, string userName, Guid roomId, DateTime timeStamp)
 {
     roomState.AddSubscriber(new RoomSubscription {
         Subscriber = userName, LastVisit = timeStamp
     });
     visitRepository.Add(new UserRoom {
         UserId = userId, RoomId = roomId, LastVisitTimeStamp = timeStamp
     });
 }
Esempio n. 2
0
        public Guid Invoke(RoomModel room, Guid userId, Guid domainId)
        {
            if (!room.IsValid() || userId == Guid.Empty || domainId == Guid.Empty ||
                // Check for room name duplication in domain
                roomRepository.FindBy(x => x.Name == room.Name && x.Domain.Id == domainId).Count() > 0)
            {
                return(Guid.Empty);
            }

            var domain = domainRepository.GetById(domainId);

            if (domain == null)
            {
                return(Guid.Empty);
            }

            var user = userRepository.GetById(userId);

            if (user == null)
            {
                return(Guid.Empty);
            }

            var newRoom = AutoMapper.Mapper.Map <DataAccess.Models.Room>(room);

            newRoom.Owner  = AutoMapper.Mapper.Map <DataAccess.Models.User>(user);
            newRoom.Domain = AutoMapper.Mapper.Map <DataAccess.Models.Domain>(domain);

            roomRepository.Add(newRoom);

            var userRoom = new DataAccess.Models.UserRoom {
                User = user, Room = newRoom
            };

            userRoomRepository.Add(userRoom);
            _unitOfWork.Save();

            return(newRoom.Id);
        }
Esempio n. 3
0
        public bool Invoke(Guid roomId, List <Guid> users, bool invite = false)
        {
            if (roomId == Guid.Empty || users.Count <= 0 || users.Any(x => x == Guid.Empty) ||
                // Check for existing userRoom
                userRoomRepository.FindBy(x => x.Room.Id == roomId && users.Any(y => y == x.User.Id)).Count() > 0)
            {
                return(false);
            }

            var room = roomRepository.GetById(roomId);

            if (room == null || !room.IsPublic && !invite)
            {
                return(false);
            }

            foreach (var user in users)
            {
                var userFromDb = userRepository.GetById(user);

                if (userFromDb == null)
                {
                    return(false);
                }

                var userRoomToAdd = new DataAccess.Models.UserRoom {
                    User = userFromDb, Room = room
                };

                userRoomRepository.Add(userRoomToAdd);
            }

            _unitOfWork.Save();

            return(true);
        }
        public RoomModel Invoke(Guid issuerUserId, List <Guid> users)
        {
            // Check if users wants to create a conversation with himself
            if (issuerUserId == Guid.Empty || users.Count <= 0 || users.Count > 8 || users.Any(x => x.Equals(issuerUserId) || x.Equals(Guid.Empty)) || users.Distinct().Count() != users.Count)
            {
                return(null);
            }

            var issuerUser = userRepository.GetById(issuerUserId);

            if (issuerUser == null)
            {
                return(null);
            }

            var privateConversationList = userRepository.GetPrivateConversationsTargets(issuerUserId).ToList();
            var listRoom = privateConversationList.Select(x => x.Room).Distinct();

            // Check if private conversation already exists
            foreach (var room in listRoom)
            {
                var userRoomsList = privateConversationList.Where(x => x.Room == room);
                var dict          = new Dictionary <DataAccess.Models.UserRoom, bool>();
                var searchedCount = 0;

                // FIXME: Bug when creating multiple users priv conversation room when there's priv conversation to one of selected user list
                foreach (var connection in userRoomsList)
                {
                    dict.Add(connection, false);

                    if (users.Any(x => x.Equals(connection.User.Id)))
                    {
                        searchedCount += 1;
                        Debug.WriteLine("######### Znaleziono istniejące połączenie #########");
                        Debug.WriteLine(connection.User.Name);
                        dict[connection] = true;
                    }
                }

                if (searchedCount == users.Count)
                {
                    Debug.WriteLine("######### Jest tyle samo znalezień co userów do których chce sie podpiąć #########");
                }

                if (dict.All(x => x.Value))
                {
                    return(null);
                }
            }

            // Create repository method for that?
            var userList = userRepository.GetAll().Where(x => users.Contains(x.Id)).ToList();

            var roomName = "";

            foreach (var item in userList)
            {
                roomName += item.Name + ", ";
            }

            roomName += issuerUser.Name;

            var userDomain = domainRepository.GetDomainByUserId(issuerUser.Id);

            var newRoom = new DataAccess.Models.Room
            {
                Name   = roomName,
                Owner  = AutoMapper.Mapper.Map <DataAccess.Models.User>(issuerUser),
                Domain = userDomain,
                IsPrivateConversation = true,
                IsPublic = false
            };

            roomRepository.Add(newRoom);

            var userRoom = new DataAccess.Models.UserRoom {
                User = issuerUser, Room = newRoom
            };

            userRoomRepository.Add(userRoom);

            foreach (var user in userList)
            {
                var userRoom2 = new DataAccess.Models.UserRoom {
                    User = user, Room = newRoom
                };
                userRoomRepository.Add(userRoom2);
            }

            var returnRoom = AutoMapper.Mapper.Map <RoomModel>(newRoom);

            _unitOfWork.Save();

            return(returnRoom);
        }