public Task UpdateAsync(UpdateTodoItemInfo updateTodoItemInfo)
        {
            if (updateTodoItemInfo == null)
            {
                throw new ArgumentNullException(nameof(updateTodoItemInfo));
            }

            Validator.ValidateObject(updateTodoItemInfo, new ValidationContext(updateTodoItemInfo),
                                     validateAllProperties: true);

            return(InternalUpdateAsync(updateTodoItemInfo));
        }
        private async Task InternalUpdateAsync(UpdateTodoItemInfo updateTodoItemInfo)
        {
            TodoItem existingTodoItem = await GetExistingTodoItem(updateTodoItemInfo.Id, updateTodoItemInfo.Owner);

            if (updateTodoItemInfo.IsComplete.HasValue)
            {
                existingTodoItem.IsComplete = updateTodoItemInfo.IsComplete.Value;
            }

            existingTodoItem.Name          = updateTodoItemInfo.Name;
            existingTodoItem.LastUpdatedBy = updateTodoItemInfo.Owner.GetName();
            existingTodoItem.LastUpdatedOn = DateTime.UtcNow;

            todoDbContext.TodoItems.Update(existingTodoItem);
            await todoDbContext.SaveChangesAsync();

            logger.LogInformation("Item with id {TodoItemId} has been updated by user [{User}]"
                                  , existingTodoItem.Id, existingTodoItem.LastUpdatedBy);
        }