public async Task <IResponse <IEnumerable <IWorkItem> > > GetWorkItemsAsync(WorkItemQueryModel query)
        {
            try
            {
                var settingsResponse = await _settingsService.GetSettings();

                if (!settingsResponse.Success)
                {
                    return(Response <IEnumerable <IWorkItem> > .FromFailure(settingsResponse.Message));
                }

                var settings = settingsResponse.Value;

                var sb = new StringBuilder();
                sb.Append($"SELECT [System.Id] FROM workitems WHERE [System.AssignedTo] contains '{settings.TfsUserName}'");
                foreach (var expression in query.Expressions.Where(p => p.Field != null))
                {
                    sb.Append(" AND ");

                    sb.Append($"[{expression.Field}] ");

                    sb.Append($"{VstsHelpers.GetExpressionOperatorString(expression.Operator)} ");

                    if (expression.Operator == WorkItemQueryExpressionOperator.In)
                    {
                        var valueSb = new StringBuilder();
                        valueSb.Append("(");

                        foreach (var value in expression.Values)
                        {
                            valueSb.Append($"'{value.Value}', ");
                        }

                        sb.Append($"{valueSb.ToString().TrimEnd(',', ' ')})");
                    }
                    else
                    {
                        sb.Append($"'{expression.Value}'");
                    }
                }

                var wiql      = sb.ToString();
                var queryBody = JsonConvert.SerializeObject(new { query = wiql });

                var queryResponse = await SendRequestAsync(HttpMethod.Post, "_apis/wit/wiql?api-version=5.0", queryBody);

                if (!queryResponse.Success)
                {
                    return(Response <IEnumerable <IWorkItem> > .FromFailure(queryResponse.Message));
                }
                var dto = JsonConvert.DeserializeObject <WiqlQueryResultDto>(queryResponse.Value);

                if (dto.WorkItems.Count == 0)
                {
                    return(Response <IEnumerable <IWorkItem> > .FromSuccess(new List <IWorkItem>()));
                }

                if (dto.WorkItems.Count > 200)
                {
                    dto.WorkItems = dto.WorkItems.Take(200).ToList();
                }

                var batchRequest = JsonConvert.SerializeObject(new
                {
                    expand = "Relations",
                    ids    = dto.WorkItems.Select(wi => wi.Id)
                });
                batchRequest = batchRequest.Replace("expand", "$expand");

                var batchResponse = await SendRequestAsync(HttpMethod.Post, "_apis/wit/workitemsbatch?api-version=5.0", batchRequest);

                if (!batchResponse.Success)
                {
                    return(Response <IEnumerable <IWorkItem> > .FromFailure(batchResponse.Message));
                }

                var batchResponseDto = JsonConvert.DeserializeObject <VstsCollectionDto <WorkItemApiResultDto> >(batchResponse.Value);

                var result = new List <IWorkItem>();
                foreach (var workItem in batchResponseDto.Value)
                {
                    result.Add(_mapper.Map <WorkItemModel>(workItem));
                }

                return(Response <IEnumerable <IWorkItem> > .FromSuccess(result));
            }
            catch (Exception ex)
            {
                return(Response <IEnumerable <IWorkItem> > .FromException($"An error occurred getting the requested work items", ex));
            }
        }
 public WorkItemQueryStepViewModel(WorkItemQueryModel model, IVstsService vstsService, ITelemetryService telemetryService)
 {
     _vstsService      = vstsService ?? throw new ArgumentNullException(nameof(vstsService));
     _telemetryService = telemetryService ?? throw new ArgumentNullException(nameof(telemetryService));
     Model             = model ?? throw new ArgumentNullException(nameof(model));
 }