public async Task <List <SetOptionResponse> > Handle(PrivateSession session, SetOptionRequest request, Func <PrivateConnection> connectionFactory) { var requestObject = await ConvertRequestToDataContract(session, request, connectionFactory); var responseObject = new List <Json.OptionCreateResponseItem>(); for (var i = 0; i < requestObject.Count; i += CreateOptionRequestBatchSize) { var range = Math.Min(CreateOptionRequestBatchSize, requestObject.Count - i); using (var connection = connectionFactory().ApiName(ApiName).Method(PrivateConnectionMethod.Create)) { try { using (var response = await connection.SendAsync(requestObject.Skip(i).Take(range).ToList())) { responseObject.AddRange(await response.ReadAsync <List <Json.OptionCreateResponseItem> >()); } } catch (ConnectionResponseException e) { throw e.ToRequestException("Option set request failed", request); } } } return(responseObject.Select(ConvertResponseItem).ToList()); }
private async Task <List <Json.OptionCreateRequestItem> > ConvertRequestToDataContract(PrivateSession session, SetOptionRequest request, Func <PrivateConnection> connectionFactory) { var missingIds = request.Items .Where(item => !item.ParentId.HasValue && !string.IsNullOrEmpty(item.ParentAlias)) .Select(x => x.ParentAlias) .Distinct() .ToDictionary(item => item, item => GetParentIdByAlias(session, item, connectionFactory)); for (var i = 0; i < missingIds.Count; i += GetParentIdBatchSize) { int range = Math.Min(GetParentIdBatchSize, missingIds.Values.Count - i); await Task.WhenAll(missingIds.Values.Skip(i).Take(range).ToList()); } return(request.Items.Select(item => new Json.OptionCreateRequestItem { Alias = item.Alias, Name = item.Name, ParentId = item.ParentId ?? missingIds[item.ParentAlias].Result, Sort = item.Sort, Type = item.Type, Children = item.Children?.Select(ConvertRequestItem).ToList() } ).ToList()); }