private async Task CopyWorkflows(CancellationToken cancellationToken, Data.Entities.Application newApplication)
        {
            var workflowSequences = await _dataContext.WorkflowSequences.AsNoTracking()
                                    .Where(seq => seq.WorkflowId == newApplication.WorkflowId).ToListAsync(cancellationToken);

            var groupedSequences = workflowSequences.GroupBy(seq => new { seq.SequenceNo, seq.IsActive }).ToList();

            var newApplicationSequences = groupedSequences.Select(seq => new ApplicationSequence
            {
                ApplicationId = newApplication.Id,
                SequenceNo    = seq.Key.SequenceNo,
                IsActive      = seq.Key.IsActive
            }).ToList();

            await _dataContext.ApplicationSequences.AddRangeAsync(newApplicationSequences, cancellationToken);

            _logger.LogInformation($"Created ApplicationSequence entities for Application: {newApplication.Id}");

            var sectionIds = groupedSequences.SelectMany(seq => seq).Select(seq => seq.SectionId).ToList();

            var workflowSections = await _dataContext.WorkflowSections.AsNoTracking()
                                   .Where(sec => sectionIds.Contains(sec.Id)).ToListAsync(cancellationToken: cancellationToken);

            var newApplicationSections = new List <ApplicationSection>();

            foreach (var sequence in groupedSequences)
            {
                var applicationSequence = newApplicationSequences.Single(appSeq => appSeq.SequenceNo == sequence.Key.SequenceNo);

                foreach (var sectionDetails in sequence)
                {
                    var workflowSection = workflowSections.Single(wSec => wSec.Id == sectionDetails.SectionId);

                    var newSection = new ApplicationSection
                    {
                        Id            = Guid.NewGuid(),
                        SequenceId    = applicationSequence.Id,
                        Title         = workflowSection.Title,
                        LinkTitle     = workflowSection.LinkTitle,
                        ApplicationId = newApplication.Id,
                        DisplayType   = workflowSection.DisplayType,
                        QnAData       = workflowSection.QnAData,
                        SectionNo     = sectionDetails.SectionNo,
                        SequenceNo    = sectionDetails.SequenceNo
                    };

                    foreach (var page in newSection.QnAData.Pages)
                    {
                        page.SectionId  = newSection.Id;
                        page.SequenceId = newSection.SequenceId;
                    }

                    newApplicationSections.Add(newSection);
                }
            }

            await _dataContext.ApplicationSections.AddRangeAsync(newApplicationSections, cancellationToken);

            _logger.LogInformation($"Created ApplicationSection entities for Application: {newApplication.Id}");
        }
        private void RemovePages(Data.Entities.Application application, ApplicationSection section)
        {
            var applicationData = JObject.Parse(application.ApplicationData);

            RemoveInactivePages(section);
            RemovePagesBasedOnNotRequiredConditions(section, applicationData);
        }
        public async Task <IActionResult> Post([FromBody] ApplicationPostModel model)
        {
            if (await ApplicationManager.Applications.AnyAsync(x => x.Name == model.Name || x.ApplicationId == model.AppId))
            {
                return(BadRequest(new ApiErrorResult <ApiError>(new ApiError(ApiErrorCodes.BadArgument, "存在重复的名称或应用程序Id。"))));
            }

            var app = new Data.Entities.Application
            {
                Id            = await IdentityGenerator.GenerateAsync(),
                Name          = model.Name,
                ApplicationId = model.AppId,
                Description   = model.Description,
                Enabled       = model.Enabled
            };
            var result = await ApplicationManager.CreateApplicationAsync(app);

            if (result.Succeeded)
            {
                return(StatusCode(201,
                                  new ApiResult <ObjectCreationOutputModel <long> >(new ObjectCreationOutputModel <long>(app.Id,
                                                                                                                         $"{Request.Scheme}://{Request.Host.Value}/api/applications/{app.Id}"))));
            }

            throw new NotImplementedException();
        }
        private async Task CopyFileUploads(Data.Entities.Application currentApplication, Data.Entities.Application newApplication, CancellationToken cancellationToken)
        {
            var sections = await _dataContext.ApplicationSections.AsNoTracking().Where(sec => sec.ApplicationId == currentApplication.Id).ToListAsync();

            var newSections = await _dataContext.ApplicationSections.AsNoTracking().Where(sec => sec.ApplicationId == newApplication.Id).ToListAsync();

            foreach (var section in sections)
            {
                var newSection = newSections.FirstOrDefault(s => s.SectionNo == section.SectionNo && s.SequenceNo == section.SequenceNo);
                if (newSection is null)
                {
                    continue;
                }

                // Go through each page that has a FileUpload question and copy any files across
                foreach (var pageWithFileUpload in section.QnAData.Pages.Where(p => p.Questions.Any(q => "FileUpload".Equals(q.Input?.Type))))
                {
                    foreach (var pageOfAnswer in pageWithFileUpload.PageOfAnswers)
                    {
                        foreach (var answer in pageOfAnswer.Answers)
                        {
                            if (!string.IsNullOrWhiteSpace(answer.Value))
                            {
                                var originalFileUrl = $"{section.ApplicationId.ToString().ToLower()}/{section.SequenceId.ToString().ToLower()}/{section.Id.ToString().ToLower()}/{pageWithFileUpload.PageId.ToLower()}/{answer.QuestionId.ToLower()}/{answer.Value}";
                                var snapshotFileUrl = $"{newSection.ApplicationId.ToString().ToLower()}/{newSection.SequenceId.ToString().ToLower()}/{newSection.Id.ToString().ToLower()}/{pageWithFileUpload.PageId.ToLower()}/{answer.QuestionId.ToLower()}/{answer.Value}";

                                await CopyFileInAzureStorage(originalFileUrl, snapshotFileUrl);
                            }
                        }
                    }
                }
            }

            _logger.LogInformation($"Copied over file uploads for Application: {newApplication.Id}");
        }
 public static ApplicationGetOutputModel FromApplication(Data.Entities.Application app)
 {
     return(new ApplicationDetailGetOutputModel
     {
         Id = app.Id,
         ApplicationId = app.ApplicationId,
         Name = app.Name,
         Enabled = app.Enabled,
         Description = app.Description
     });
 }
        public async Task GetSectionAndPage(Guid applicationId, Guid sectionId, string pageId)
        {
            Application = await _dataContext.Applications.SingleOrDefaultAsync(app => app.Id == applicationId);

            Section = await _dataContext.ApplicationSections.SingleOrDefaultAsync(sec => sec.Id == sectionId && sec.ApplicationId == applicationId);

            if (Section != null)
            {
                QnaData = new QnAData(Section.QnAData);
                Page    = QnaData.Pages.SingleOrDefault(p => p.PageId == pageId);
            }
        }
Exemplo n.º 7
0
 public static ApplicationDetailGetOutputModel FromApplication(Data.Entities.Application app, int eventCount)
 {
     return(new ApplicationDetailGetOutputModel
     {
         Id = app.Id,
         ApplicationId = app.ApplicationId,
         Name = app.Name,
         Enabled = app.Enabled,
         Description = app.Description,
         EventCount = eventCount,
         UserList = app.Users.Select(x => x.UserId).ToList()
     });
 }
        private async Task <Data.Entities.Application> CreateNewApplication(StartApplicationRequest request, Workflow latestWorkflow, CancellationToken cancellationToken, string applicationData)
        {
            var newApplication = new Data.Entities.Application
            {
                ApplicationStatus = ApplicationStatus.InProgress,
                WorkflowId        = latestWorkflow.Id,
                Reference         = request.UserReference,
                CreatedAt         = SystemTime.UtcNow(),
                ApplicationData   = applicationData
            };

            _dataContext.Applications.Add(newApplication);
            _logger.LogInformation($"Created Application entity: {newApplication.Id}");

            return(newApplication);
        }
        private async Task CopySections(Data.Entities.Application currentApplication, Data.Entities.Application newApplication, CancellationToken cancellationToken)
        {
            var sections = await _dataContext.ApplicationSections.AsNoTracking()
                           .Where(sec => sec.ApplicationId == currentApplication.Id).ToListAsync(cancellationToken: cancellationToken);

            var newApplicationSequences = await _dataContext.ApplicationSequences.AsNoTracking()
                                          .Where(seq => seq.ApplicationId == newApplication.Id).ToListAsync(cancellationToken);

            var newApplicationSections = new List <ApplicationSection>();

            foreach (var sequence in newApplicationSequences)
            {
                // Copy over all sections into the new Application Sequence
                foreach (var section in sections.Where(sec => sec.SequenceNo == sequence.SequenceNo))
                {
                    var newSection = new ApplicationSection
                    {
                        Id            = Guid.NewGuid(),
                        SequenceId    = sequence.Id,
                        Title         = section.Title,
                        LinkTitle     = section.LinkTitle,
                        ApplicationId = newApplication.Id,
                        DisplayType   = section.DisplayType,
                        QnAData       = section.QnAData,
                        SectionNo     = section.SectionNo,
                        SequenceNo    = section.SequenceNo
                    };

                    // Adjust page info appropriately
                    foreach (var page in newSection.QnAData.Pages)
                    {
                        page.SectionId  = newSection.Id;
                        page.SequenceId = newSection.SequenceId;
                    }

                    newApplicationSections.Add(newSection);
                }
            }

            await _dataContext.ApplicationSections.AddRangeAsync(newApplicationSections, cancellationToken);

            await _dataContext.SaveChangesAsync(cancellationToken);

            _logger.LogInformation($"Created ApplicationSection entities for Application: {newApplication.Id}");
        }
        private async Task CopySequences(Data.Entities.Application currentApplication, Data.Entities.Application newApplication, CancellationToken cancellationToken)
        {
            var sequences = await _dataContext.ApplicationSequences.AsNoTracking()
                            .Where(seq => seq.ApplicationId == currentApplication.Id).ToListAsync(cancellationToken);

            var newApplicationSequences = sequences.Select(seq => new ApplicationSequence
            {
                ApplicationId = newApplication.Id,
                SequenceNo    = seq.SequenceNo,
                IsActive      = seq.IsActive
            }).ToList();

            await _dataContext.ApplicationSequences.AddRangeAsync(newApplicationSequences, cancellationToken);

            await _dataContext.SaveChangesAsync(cancellationToken);

            _logger.LogInformation($"Created ApplicationSequence entities for Application: {newApplication.Id}");
        }
        private async Task <Data.Entities.Application> CreateNewApplication(Data.Entities.Application application, CancellationToken cancellationToken)
        {
            var newApplication = new Data.Entities.Application
            {
                ApplicationStatus = application.ApplicationStatus,
                WorkflowId        = application.WorkflowId,
                Reference         = application.Reference,
                CreatedAt         = SystemTime.UtcNow(),
                ApplicationData   = application.ApplicationData
            };

            _dataContext.Applications.Add(newApplication);
            await _dataContext.SaveChangesAsync(cancellationToken);

            _logger.LogInformation($"Created Application entity: {newApplication.Id}");

            return(newApplication);
        }
Exemplo n.º 12
0
        protected void UpdateApplicationData(string pageId, List <Answer> submittedAnswers, ApplicationSection section, Data.Entities.Application application)
        {
            if (application != null)
            {
                var applicationData = JObject.Parse(application.ApplicationData ?? "{}");

                var page = section?.QnAData?.Pages.SingleOrDefault(p => p.PageId == pageId);

                if (page != null)
                {
                    var questionTagsWhichHaveBeenUpdated = new List <string>();
                    var answers = GetAnswersFromRequest(submittedAnswers);

                    foreach (var question in page.Questions)
                    {
                        SetApplicationDataField(question, answers, applicationData);
                        if (!string.IsNullOrWhiteSpace(question.QuestionTag))
                        {
                            questionTagsWhichHaveBeenUpdated.Add(question.QuestionTag);
                        }

                        if (question.Input.Options != null)
                        {
                            foreach (var option in question.Input.Options.Where(o => o.FurtherQuestions != null))
                            {
                                foreach (var furtherQuestion in option.FurtherQuestions)
                                {
                                    SetApplicationDataField(furtherQuestion, answers, applicationData);
                                    if (!string.IsNullOrWhiteSpace(furtherQuestion.QuestionTag))
                                    {
                                        questionTagsWhichHaveBeenUpdated.Add(furtherQuestion.QuestionTag);
                                    }
                                }
                            }
                        }
                    }

                    application.ApplicationData = applicationData.ToString(Formatting.None);

                    SetStatusOfAllPagesBasedOnUpdatedQuestionTags(application, questionTagsWhichHaveBeenUpdated);
                    _tagProcessingService.ClearDeactivatedTags(application.Id, section.Id);
                }
            }
        }