public IActionResult UpdateElement(int collectionId, int elementId, ElementUpdateData updateData)
        {
            var userId           = _userProvider.GetCurrentUserId();
            var parentCollection = _dbContext.Collection
                                   .Include(col => col.Elements)
                                   .SingleOrDefault(c => c.Id == collectionId);
            var element = parentCollection?.Elements.SingleOrDefault(el => el.Id == elementId);

            if (element == null)
            {
                return(NotFound());
            }

            var usersWithEditPermission = _dbContext.SharedCollection
                                          .Where(sc => sc.CollectionId == collectionId)
                                          .Where(sc => sc.EditRights == true)
                                          .Select(sc => sc.UserId)
                                          .ToList();

            if (parentCollection.OwnerId != userId && usersWithEditPermission.Contains(userId) == false)
            {
                return(Forbid());
            }

            if (updateData.Name.IsNullOrEmpty() == false)
            {
                element.Name = updateData.Name;
            }
            if (updateData.Link.IsNullOrEmpty() == false)
            {
                element.Link = updateData.Link;
            }
            _dbContext.SaveChanges();
            return(Ok());
        }
        public void UpdateElement_ElementDoesNotExist_NotFound()
        {
            //Arrange
            var userId     = NewGuid;
            var newLink    = NewGuid;
            var updateData = new ElementUpdateData {
                Link = newLink
            };

            AddUser(userId);
            var     collection = AddCollection(userId, 1);
            Element element    = null;

            InTransaction(context =>
            {
                element = context.Element.First();
            });

            //Act
            IActionResult result = null;

            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId), getCollectionConfigurationProviderMock());
                result         = controller.UpdateElement(collection.Id, element.Id + 1, updateData);
            });

            //Assert
            result.Should().BeOfType <NotFoundResult>();
        }
        public void UpdateElement_CollectionNotOwnedByUserButHasEditRights_Ok()
        {
            //Arrange
            var userId1    = NewGuid;
            var userId2    = NewGuid;
            var newLink    = NewGuid;
            var updateData = new ElementUpdateData {
                Link = newLink
            };

            AddUser(userId1);
            AddUser(userId2);
            var collection = AddCollection(userId1, 50);

            ShareCollection(collection.Id, userId2, true);
            Element element = null;

            InTransaction(context =>
            {
                element = context.Element.First();
            });

            //Act
            IActionResult result = null;

            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId2), getCollectionConfigurationProviderMock());
                result         = controller.UpdateElement(collection.Id, element.Id, updateData);
            });

            //Assert
            result.Should().BeOfType <OkResult>();
        }
        public void UpdateElement_MixedUpdateData_ProperFieldsUpdated(string newName, string newLink)
        {
            //Arrange
            var userId     = NewGuid;
            var updateData = new ElementUpdateData {
                Link = newLink, Name = newName
            };

            AddUser(userId);
            var     collection = AddCollection(userId, 50);
            Element element    = null;

            InTransaction(context =>
            {
                element = context.Element.First();
            });

            //Act
            IActionResult result = null;

            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId), getCollectionConfigurationProviderMock());
                result         = controller.UpdateElement(collection.Id, element.Id, updateData);
            });

            //Assert
            result.Should().BeOfType <OkResult>();
            InTransaction(context =>
            {
                context.Element.Single(el => el.Id == element.Id).Link.Should().Be(newLink ?? element.Link);
                context.Element.Single(el => el.Id == element.Id).Name.Should().Be(newName ?? element.Name);
            });
        }