Exemplo n.º 1
0
        public async Task SaveExtractedAnswersForApplication(Guid applicationId, List <SubmittedApplicationAnswer> answers)
        {
            _logger.LogDebug($"Saving extracted answers for application {applicationId}");

            using (var dataContextTransaction = _applyDataContext.Database.BeginTransaction())
            {
                var existingAnswers = _applyDataContext.SubmittedApplicationAnswers.Where(ans => ans.ApplicationId == applicationId);
                _applyDataContext.SubmittedApplicationAnswers.RemoveRange(existingAnswers);

                var existingApplications = _applyDataContext.ExtractedApplications.Where(app => app.ApplicationId == applicationId);
                _applyDataContext.ExtractedApplications.RemoveRange(existingApplications);

                if (answers != null && answers.Any())
                {
                    answers.ForEach(a => a.ApplicationId = applicationId);
                    _applyDataContext.SubmittedApplicationAnswers.AddRange(answers);
                }

                var application = new ExtractedApplication {
                    ApplicationId = applicationId, ExtractedDate = DateTime.UtcNow
                };
                _applyDataContext.ExtractedApplications.Add(application);

                try
                {
                    await _applyDataContext.SaveChangesAsync();

                    await dataContextTransaction.CommitAsync();

                    _logger.LogInformation($"Extracted answers successfully saved for application {applicationId}");
                }
#pragma warning disable CA1031
                catch (NullReferenceException) when(dataContextTransaction is null && _applyDataContext.GetType() != typeof(ApplyDataContext))
                {
                    // Safe to ignore as it is the Unit Tests executing and it doesn't currently mock Transactions
                }
#pragma warning restore CA1031
                catch (DbUpdateException ex)
                {
                    _logger.LogError(ex, $"Unable to save extracted answers for Application: {applicationId}");
                    await dataContextTransaction.RollbackAsync();
                }
            }
        }