示例#1
0
        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);
        }
示例#2
0
        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
            });
        }
示例#3
0
 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)))));
 }
示例#4
0
        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);
        }