public async Task UpdateItem(string list, StorageItem item, CancellationToken cancellationToken)
        {
            var idConditions = new[] { new EqualCondition(x => x.Id, item.Id) };
            var listItems    = (await this.GetListItems(list, idConditions, cancellationToken)).ToArray();

            this.EnsureSingleItemReturned(listItems);

            var existingListItem = listItems.First();

            var updateItemUrl = this.GetListItemsUrl(list, false);

            updateItemUrl += $"({existingListItem.Id})";

            var listItemType = await this.GetListItemType(list, cancellationToken);

            var requestData = this.StorageItemToListItemRequest(item, listItemType);

            var request = SharepointRequest
                          .Create(HttpMethod.Post, updateItemUrl)
                          .WithContent(requestData)
                          .WithIfMatchHeader()
                          .WithXHttpMethodHeader("MERGE");

            await this.requestExecutor.ExecuteSharepointRequest <SharepointListItem>(request, cancellationToken);
        }
        private async Task <string> GetListItemType(string list, CancellationToken cancellationToken)
        {
            var listUrl  = $"{this.GetListUrl(list)}?$select=ListItemEntityTypeFullName";
            var request  = SharepointRequest.Create(HttpMethod.Get, listUrl);
            var response = await this.requestExecutor.ExecuteSharepointRequest <SharepointListResponse>(request, cancellationToken);

            return(response.ListItemEntityTypeFullName);
        }
        public async Task <StorageItem> AddItem(string list, StorageItem item, CancellationToken cancellationToken)
        {
            var listItemType = await this.GetListItemType(list, cancellationToken);

            var requestData = this.StorageItemToListItemRequest(item, listItemType);

            var request = SharepointRequest
                          .Create(HttpMethod.Post, this.GetListItemsUrl(list))
                          .WithContent(requestData);

            var addedItem = await this.requestExecutor.ExecuteSharepointRequest <SharepointListItem>(request, cancellationToken);

            return(this.ListItemToStorageItem(addedItem));
        }
        private async Task <IEnumerable <SharepointListItem> > GetListItems(
            string list,
            IEnumerable <ICondition> conditions,
            CancellationToken cancellationToken)
        {
            var itemsUrl = this.GetListItemsUrl(list);

            var conditionsUrlPart = this.conditionsCompiler.CompileConditions(conditions);

            if (conditionsUrlPart != null)
            {
                itemsUrl += $"&{conditionsUrlPart}";
            }

            var request  = SharepointRequest.Create(HttpMethod.Get, itemsUrl);
            var response = await this.requestExecutor.ExecuteSharepointRequest <SharepointListItemsResponse>(request, cancellationToken);

            return(response.Value);
        }
        public async Task DeleteItem(string list, string itemId, CancellationToken cancellationToken)
        {
            var idConditions = new[] { new EqualCondition(x => x.Id, itemId) };
            var listItems    = (await this.GetListItems(list, idConditions, cancellationToken)).ToArray();

            this.EnsureSingleItemReturned(listItems);

            var existingListItem = listItems.First();

            var deleteItemUrl = this.GetListItemsUrl(list, false);

            deleteItemUrl += $"({existingListItem.Id})";

            var request = SharepointRequest
                          .Create(HttpMethod.Post, deleteItemUrl)
                          .WithIfMatchHeader()
                          .WithXHttpMethodHeader("DELETE");

            await this.requestExecutor.ExecuteSharepointRequest(request, cancellationToken);
        }