private async Task <Json.CreateRecordResponse> GetResponseUsingBatches(CreateRecordRequest request, Func <PrivateConnection> connectionFactory, Json.CreateRecordRequest model) { Json.CreateRecordResponse responseObject = default(Json.CreateRecordResponse); var batchSizePerResource = BatchSize / model.Data.Count; for (var i = 0; i < model.Data.Max(x => x.Entries.Count); i += batchSizePerResource) { Json.CreateRecordRequest partialRequest = CreateAndInitializePartialRequest(model, batchSizePerResource, i); using (var connection = connectionFactory().ApiName(ApiName).Method(PrivateConnectionMethod.Create)) { try { responseObject = await SendPartialRequestAndUpdateResults(responseObject, partialRequest, connection); } catch (ConnectionResponseException e) { throw e.ToRequestException("Could not Create Record", request.WithoutFieldIdResolver); } } } return(responseObject); }
public async Task <CreateRecordResponse> Handle(PrivateSession session, CreateRecordRequest request, Func <PrivateConnection> connectionFactory) { var errors = new Dictionary <Guid, ValidationErrorCollection>(); var results = new Dictionary <Guid, ulong>(); foreach (var group in request.GroupedData) { try { var modelMappingPair = await BuildRequest(request.FieldIdResolver, group, request.References.Where(entry => results.ContainsKey(entry.Value)).ToDictionary(entry => entry.Key, entry => results[entry.Value])); var model = modelMappingPair.Key; var mapping = modelMappingPair.Value; Json.CreateRecordResponse responseObject = await GetResponseUsingBatches(request, connectionFactory, model); foreach (var entry in BuildResponse(responseObject, mapping)) { results.Add(entry.Key, entry.Value); } } catch (ValidationException e) { session.Logger.LogInformation(0, e, "validation error during record create"); // fixme : we should be able to split out the actual failures and assign correctly foreach (var entry in group) { errors.Add(entry.Id, e.Errors); } break; } catch (Exception e) { if (results.Count == 0) { throw; } session.Logger.LogError(0, e, "error during record create: {0}, msg: {1}, trace: {2}", e, e.Message, e.StackTrace); break; } } return(new CreateRecordResponse { Errors = errors, RecordIds = results }); }
private CreateRecordResponse BuildResponse(Json.CreateRecordResponse recordCreateResult, Dictionary <int, Dictionary <int, Guid> > mapping) { return(new CreateRecordResponse(recordCreateResult.ResultIds.SelectMany((value, key) => value.Select((id, key2) => new KeyValuePair <Guid, long>(mapping[key][key2], id))))); }
private async Task <Json.CreateRecordResponse> SendPartialRequestAndUpdateResults(Json.CreateRecordResponse responseObject, Json.CreateRecordRequest partialRequest, PrivateConnection connection) { using (var response = await connection.SendAsync(partialRequest)) { if (responseObject.ResultIds == null) { responseObject = await response.ReadAsync <Json.CreateRecordResponse>(); } else { var newResponse = await response.ReadAsync <Json.CreateRecordResponse>(); for (var j = 0; j < responseObject.ResultIds.Count; j++) { responseObject.ResultIds[j].AddRange(newResponse.ResultIds[j]); } } } return(responseObject); }