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(); } }
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))); } }
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()); }
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)); }
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); }
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); }