Example #1
0
        public void RelateUserToGroups(RelateUserToGroupsDto newRelations)
        {
            var user = this._unitOfWork.UserRepository.GetUserById(newRelations.UserId);

            if (user == null)
            {
                throw new ArgumentException("User with id:" + newRelations.UserId + " doesn't exist.");
            }

            if (user.Groups == null)
            {
                user.Groups = new List <Group>();
            }

            if (user.HistoryGroups == null)
            {
                user.HistoryGroups = new List <HistoryGroup>();
            }

            var currentLocation = new GeoCoordinate(newRelations.Latitude, newRelations.Longitude);

            var areaEntities = this._unitOfWork.AreaRepository.GetAreas()
                               .Where(x => currentLocation.GetDistanceTo(new GeoCoordinate(x.Latitude, x.Longitude)) <= (int)x.Radius);

            // 1. Fetch all the groups that belong to the user and are around {newRelations.Latitude, newRelations.Longitude}
            var groupsForUserAroundCurrentLocation = areaEntities
                                                     .SelectMany(a => a.Groups)
                                                     .Where(gr => gr.Users.Contains(user));

            // 2. Fetch all the groups that came from the request
            var groupSubscriptionsThatCameFromTheRequest =
                this._unitOfWork.GroupRepository.GetGroups()
                .Where(gr => newRelations.GroupsUserSubscribes.Contains(gr.Id));

            // 3. Determine what groups have been unsubscribed: Everything that is in (1) and doesn't belong to (2)
            var forUserAroundCurrentLocation = groupsForUserAroundCurrentLocation as Group[] ?? groupsForUserAroundCurrentLocation.ToArray();

            var unsubscribedGroups =
                forUserAroundCurrentLocation.Where(gr => !groupSubscriptionsThatCameFromTheRequest.Contains(gr)).ToList();

            // 4. Determine what groups have bee added and are new: Everything that is in (2) and doesn't belong to (1)
            var newlySubscribedGroups = groupSubscriptionsThatCameFromTheRequest.Where(gr => !forUserAroundCurrentLocation.Contains(gr));

            // 5. Each group in (3) has to be removed from current user subscriptions
            this.DisconnectUserFromUnsubscribedGroups(unsubscribedGroups, user);

            // 6. Each group in (4) has to be added to the current user subscriptions
            this.ConnectUserToNewlySubscribedGroups(newlySubscribedGroups, user);

            this._unitOfWork.Save();

            if (this._configuration.AutomaticallyCleanupGroupsAndAreas)
            {
                this.DeactivateGroupsWithNoUsersInsideOfThem(unsubscribedGroups, newRelations.UserId);
                this._unitOfWork.Save();
            }
        }
Example #2
0
        public IHttpActionResult Post([FromBody] RelateUserToGroupsDto userToGroupsModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            try
            {
                this._subscriptionService.RelateUserToGroups(userToGroupsModel);
                return(Ok());
            }
            catch (Exception ex)
            {
                var errorMessage = _apiLogger.OnActionException(ActionContext, ex);
                return(InternalServerError(new HttpException(errorMessage)));
            }
        }
Example #3
0
        public void When_User_Location_Is_Updated_Proper_ResponseDto_IsReturned()
        {
            // arrange
            var userId = Guid.NewGuid();
            var user   = new User()
            {
                Id            = userId,
                FirstName     = "Stefcho",
                LastName      = "Stefchev",
                Email         = "*****@*****.**",
                IdsrvUniqueId = Guid.NewGuid().ToString(),
                AutomaticSubscriptionSettings = new AutomaticSubscriptionSetting()
                {
                    AutomaticallySubscribeToAllGroups        = true,
                    AutomaticallySubscribeToAllGroupsWithTag = false
                }
            };

            var groupOneId = Guid.NewGuid();
            var groupTwoId = Guid.NewGuid();

            var groupOne = new Group()
            {
                Id = groupOneId, Name = "GroupOne", IsActive = true, Users = new List <User>()
            };
            var groupTwo = new Group()
            {
                Id = groupTwoId, Name = "GroupTwo", IsActive = true, Users = new List <User>()
            };

            var areaId = Guid.NewGuid();
            var area   = new Area()
            {
                Id        = areaId,
                Latitude  = 10.00000,
                Longitude = 10.00000,
                Groups    = new List <Group>()
                {
                    groupOne, groupTwo
                },
                Radius   = RadiusRangeEnum.FiftyMeters,
                IsActive = true
            };

            groupOne.Areas = new List <Area>()
            {
                area
            };
            groupTwo.Areas = new List <Area>()
            {
                area
            };

            var populatedDatabase = new FakeLikkleDbContext()
            {
                Groups = new FakeDbSet <Group>()
                {
                    groupOne, groupTwo
                },
                Areas = new FakeDbSet <Area>()
                {
                    area
                },
                Users = new FakeDbSet <User>()
                {
                    user
                }
            }
            .Seed();

            this._mockedLikkleUoW.Setup(uow => uow.AreaRepository).Returns(new AreaRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.UserRepository).Returns(new UserRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.GroupRepository).Returns(new GroupRepository(populatedDatabase));

            // act
            var relateUserToGroupsDto = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupOneId, groupTwoId
                }
            };

            this._subscriptionService.RelateUserToGroups(relateUserToGroupsDto);
            Assert.IsNotNull(user.Groups);
            Assert.IsNotNull(user.HistoryGroups);

            Assert.AreEqual(2, user.Groups.Count);
            Assert.AreEqual(2, user.HistoryGroups.Count);

            this._userService.UpdateUserLocation(userId, 20, 20);

            Assert.AreEqual(0, user.Groups.Count);
            Assert.AreEqual(2, user.HistoryGroups.Count);

            var updateResponse = this._userService.UpdateUserLocation(userId, 10.00009, 10.00009);

            // TODO: When implemented double SecondsToClosestBoundary(double latitude, double longitude); update the assertions here
            Assert.AreEqual(2, updateResponse.SubscribedGroupIds.Count());
        }
Example #4
0
        public void We_Can_Relate_User_To_Groups()
        {
            // arrange
            var groupOneId = Guid.NewGuid();
            var groupTwoId = Guid.NewGuid();

            var groupOne = new Group()
            {
                Id = groupOneId, Name = "GroupOne", Users = new List <User>(), IsActive = true
            };
            var groupTwo = new Group()
            {
                Id = groupTwoId, Name = "GroupTwo", Users = new List <User>(), IsActive = true
            };

            var area = new Area()
            {
                Id        = Guid.NewGuid(),
                Latitude  = 10,
                Longitude = 10,
                Groups    = new List <Group>()
                {
                    groupOne, groupTwo
                },
                IsActive = true
            };

            groupOne.Areas = new List <Area>()
            {
                area
            };
            groupTwo.Areas = new List <Area>()
            {
                area
            };

            var userId = Guid.NewGuid();
            var user   = new User()
            {
                Id            = userId,
                FirstName     = "Stefcho",
                LastName      = "Stefchev",
                Email         = "*****@*****.**",
                IdsrvUniqueId = Guid.NewGuid().ToString()
            };

            var firstHistoryGroup = new HistoryGroup()
            {
                DateTimeGroupWasSubscribed = DateTime.UtcNow,
                GroupId = groupOneId,
                GroupThatWasPreviouslySubscribed = groupOne,
                UserId = userId,
                UserWhoSubscribedGroup = user,
                Id = Guid.NewGuid()
            };

            var secondHistoryGroup = new HistoryGroup()
            {
                DateTimeGroupWasSubscribed = DateTime.UtcNow,
                GroupId = groupTwoId,
                GroupThatWasPreviouslySubscribed = groupTwo,
                UserId = userId,
                UserWhoSubscribedGroup = user,
                Id = Guid.NewGuid()
            };

            var populatedDatabase = new FakeLikkleDbContext()
            {
                Groups = new FakeDbSet <Group>()
                {
                    groupOne, groupTwo
                },
                Areas = new FakeDbSet <Area>()
                {
                    area
                },
                Users = new FakeDbSet <User>()
                {
                    user
                },
                HistoryGroups = new FakeDbSet <HistoryGroup>()
                {
                    firstHistoryGroup, secondHistoryGroup
                }
            }
            .Seed();

            this._mockedLikkleUoW.Setup(uow => uow.AreaRepository).Returns(new AreaRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.GroupRepository).Returns(new GroupRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.UserRepository).Returns(new UserRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.HistoryGroupRepository).Returns(new HistoryGroupRepository(populatedDatabase));

            var relateUserToGroupsRequest = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupOneId, groupTwoId
                }
            };

            // act
            this._subscriptionService.RelateUserToGroups(relateUserToGroupsRequest);
            var userSubscribtionsAroundCoordintes = this._groupService.GetUserSubscriptions(userId, 10, 10);

            // assert subscription works
            Assert.IsNotNull(userSubscribtionsAroundCoordintes);
            Assert.AreEqual(userSubscribtionsAroundCoordintes.Count(), 2);
            Assert.IsTrue(userSubscribtionsAroundCoordintes.Contains(groupOneId));
            Assert.IsTrue(userSubscribtionsAroundCoordintes.Contains(groupTwoId));
            Assert.IsNotNull(user.HistoryGroups);
            Assert.AreEqual(user.HistoryGroups.Count(), 2);
            var historyGroupIds = user.HistoryGroups.Select(hgr => hgr.GroupId).ToList();

            Assert.IsTrue(historyGroupIds.Contains(groupOneId) && historyGroupIds.Contains(groupTwoId));

            // arrange
            relateUserToGroupsRequest = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupTwoId
                }
            };

            groupOne.Users = new List <User>()
            {
                user
            };
            groupTwo.Users = new List <User>()
            {
                user
            };
            user.HistoryGroups = new List <HistoryGroup>()
            {
                firstHistoryGroup, secondHistoryGroup
            };

            // act
            this._subscriptionService.RelateUserToGroups(relateUserToGroupsRequest);
            userSubscribtionsAroundCoordintes = this._groupService.GetUserSubscriptions(userId, 10, 10);

            // assert unsubscription works
            Assert.IsNotNull(userSubscribtionsAroundCoordintes);
            Assert.AreEqual(userSubscribtionsAroundCoordintes.Count(), 1);
            Assert.IsFalse(userSubscribtionsAroundCoordintes.Contains(groupOneId));
            Assert.IsTrue(userSubscribtionsAroundCoordintes.Contains(groupTwoId));
            Assert.IsTrue(user.HistoryGroups != null);
            Assert.IsTrue(user.HistoryGroups.Select(hgr => hgr.GroupId).Contains(groupTwoId));
            Assert.IsTrue(this._mockedLikkleUoW.Object.HistoryGroupRepository.AllHistoryGroups().Count() == 2);

            // arrange
            var groupThree = new Group()
            {
                Id = Guid.NewGuid(), Name = "GroupThree", Users = new List <User>(), IsActive = true
            };
            var groupFour = new Group()
            {
                Id = Guid.NewGuid(), Name = "GroupFour", Users = new List <User>(), IsActive = true
            };

            groupThree.Areas = new List <Area>()
            {
                area
            };
            groupFour.Areas = new List <Area>()
            {
                area
            };

            area.Groups.Clear();

            area.Groups.Add(groupThree);
            area.Groups.Add(groupFour);

            populatedDatabase.Groups = new FakeDbSet <Group>()
            {
                groupThree, groupFour
            };

            relateUserToGroupsRequest = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupThree.Id, groupFour.Id
                }
            };

            // act
            this._subscriptionService.RelateUserToGroups(relateUserToGroupsRequest);
            userSubscribtionsAroundCoordintes = this._groupService.GetUserSubscriptions(userId, 10, 10);

            // assert
            Assert.IsNotNull(userSubscribtionsAroundCoordintes);
            Assert.AreEqual(userSubscribtionsAroundCoordintes.Count(), 2);
            Assert.IsFalse(userSubscribtionsAroundCoordintes.Contains(groupOneId));
            Assert.IsFalse(userSubscribtionsAroundCoordintes.Contains(groupTwoId));
            Assert.IsTrue(userSubscribtionsAroundCoordintes.Contains(groupThree.Id));
            Assert.IsTrue(userSubscribtionsAroundCoordintes.Contains(groupFour.Id));
        }
Example #5
0
        public void Area_Gets_Inactive_When_No_Active_Groups_Belong_To_It()
        {
            // arrange
            this._configurationWrapperMock.Setup(config => config.AutomaticallyCleanupGroupsAndAreas).Returns(true);

            var userId = Guid.NewGuid();
            var user   = new User()
            {
                Id            = userId,
                FirstName     = "Stefcho",
                LastName      = "Stefchev",
                Email         = "*****@*****.**",
                IdsrvUniqueId = Guid.NewGuid().ToString()
            };

            var groupOneId = Guid.NewGuid();
            var groupTwoId = Guid.NewGuid();

            var groupOne = new Group()
            {
                Id = groupOneId, Name = "GroupOne", Users = new List <User>()
                {
                    user
                }, IsActive = true
            };
            var groupTwo = new Group()
            {
                Id = groupTwoId, Name = "GroupTwo", Users = new List <User>(), IsActive = false
            };

            var areaId = Guid.NewGuid();
            var area   = new Area()
            {
                Id        = areaId,
                Latitude  = 10,
                Longitude = 10,
                Groups    = new List <Group>()
                {
                    groupOne, groupTwo
                },
                IsActive = true
            };

            groupOne.Areas = new List <Area>()
            {
                area
            };
            groupTwo.Areas = new List <Area>()
            {
                area
            };

            var populatedDatabase = new FakeLikkleDbContext()
            {
                Groups = new FakeDbSet <Group>()
                {
                    groupOne, groupTwo
                },
                Users = new FakeDbSet <User>()
                {
                    user
                },
                Areas = new FakeDbSet <Area>()
                {
                    area
                }
            }
            .Seed();

            DataGenerator.SetupAreaUserAndGroupRepositories(this._mockedLikkleUoW, populatedDatabase);

            // act
            var relateUserToGroupsRequest = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupTwoId
                }
            };

            this._subscriptionService.RelateUserToGroups(relateUserToGroupsRequest);

            // assert
            Assert.AreEqual(2, this._areaService.GetAreaById(areaId).Groups.Count());

            Assert.IsFalse(this._mockedLikkleUoW.Object.GroupRepository.GetGroupById(groupOneId).IsActive);
            Assert.IsFalse(this._mockedLikkleUoW.Object.GroupRepository.GetGroupById(groupTwoId).IsActive);

            Assert.IsFalse(this._mockedLikkleUoW.Object.AreaRepository.GetAreaById(areaId).IsActive);
        }
Example #6
0
        public void When_User_Location_Is_Changed_Group_Is_Removed_But_HistoryGroup_Stays()
        {
            // arrange
            var groupOneId = Guid.NewGuid();
            var groupTwoId = Guid.NewGuid();

            var groupOne = new Group()
            {
                Id = groupOneId, Name = "GroupOne", Users = new List <User>()
            };
            var groupTwo = new Group()
            {
                Id = groupTwoId, Name = "GroupTwo", Users = new List <User>()
            };

            var area = new Area()
            {
                Id        = Guid.NewGuid(),
                Latitude  = 10,
                Longitude = 10,
                Groups    = new List <Group>()
                {
                    groupOne, groupTwo
                }
            };

            groupOne.Areas = new List <Area>()
            {
                area
            };
            groupTwo.Areas = new List <Area>()
            {
                area
            };

            var userId = Guid.NewGuid();
            var user   = new User()
            {
                Id            = userId,
                FirstName     = "Stefcho",
                LastName      = "Stefchev",
                Email         = "*****@*****.**",
                IdsrvUniqueId = Guid.NewGuid().ToString()
            };

            var populatedDatabase = new FakeLikkleDbContext()
            {
                Groups = new FakeDbSet <Group>()
                {
                    groupOne, groupTwo
                },
                Areas = new FakeDbSet <Area>()
                {
                    area
                },
                Users = new FakeDbSet <User>()
                {
                    user
                }
            }
            .Seed();

            this._mockedLikkleUoW.Setup(uow => uow.AreaRepository).Returns(new AreaRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.GroupRepository).Returns(new GroupRepository(populatedDatabase));
            this._mockedLikkleUoW.Setup(uow => uow.UserRepository).Returns(new UserRepository(populatedDatabase));

            var relateUserToGroupsRequest = new RelateUserToGroupsDto()
            {
                UserId               = userId,
                Latitude             = 10,
                Longitude            = 10,
                GroupsUserSubscribes = new List <Guid>()
                {
                    groupOneId, groupTwoId
                }
            };

            // act
            this._subscriptionService.RelateUserToGroups(relateUserToGroupsRequest);

            Assert.IsNotNull(user.Groups);
            Assert.AreEqual(user.Groups.Count(), 2);

            Assert.IsNotNull(user.HistoryGroups);
            Assert.AreEqual(user.HistoryGroups.Count(), 2);

            this._userService.UpdateUserLocation(userId, 90, 90);
            Assert.AreEqual(user.Groups.Count(), 0);
            Assert.AreEqual(user.HistoryGroups.Count(), 2);
        }