Exemple #1
0
        public async Task <Unit> Handle(Request request, CancellationToken cancellationToken)
        {
            var dbEntity = await this.dbContext.NavigationProvidersInfo
                           .Where(p => p.Id == request.NavigationProvider.Id)
                           .SingleAsync(cancellationToken);

            this.mapper.Map(request.NavigationProvider, dbEntity);
            await dbContext.SaveChangesAsync(cancellationToken);

            return(Unit.Value);
        }
Exemple #2
0
        public async Task <AnalysisSession> AnalyzeAsync <T>(
            INavigationProvider <T> navigationProvider,
            AnalyzerOptions options,
            Func <T, DocumentParseResult, Task> documentProcessedHandler = null,
            CancellationToken cancellationToken = default)
            where T : IDocumentId
        {
            var analysisSession = await this.analysisSessionsService.GetActualSession(navigationProvider.Id, cancellationToken);

            analysisSession.StartTime            = DateTime.Now;
            analysisSession.GetDocumentsInfoTime = DateTime.Now;
            analysisSession.Status = AnalysisSessionStatus.InProgress;
            await this.dbContext.SaveChangesAsync(cancellationToken);

            var documents = await navigationProvider.LoadDocuments(
                analysisSession,
                newOnly : options.Depth == AnalyzeDepth.NewOnly,
                updateDb : true,
                cancellationToken);

            var wasError = false;

            foreach (var document in documents)
            {
                try
                {
                    var provider = navigationProvider.GetProvider(document);

                    if (provider.IsReadonly)
                    {
                        document.SetReadonly();     // todo: вроде как это лишнее, потому что FileNavigationProvider.IsReadonly должен быть true в таком случае
                    }
                    var parseResult = await provider.ParseDocumentAsync(document);

                    foreach (var processor in documentParseResultProcessings)
                    {
                        await processor.ProcessAsync(document.DocumentId, parseResult, cancellationToken);
                    }

                    await documentProcessedHandler?.Invoke(document, parseResult);
                }
                catch (Exception ex)
                {
                    wasError = true;
                    // todo: куда сохранить ошибку?
                }
            }

            analysisSession.FinishTime = DateTime.Now;
            analysisSession.Status     = wasError ? AnalysisSessionStatus.CompletedWithErrors : AnalysisSessionStatus.Completed;
            await dbContext.SaveChangesAsync(cancellationToken);

            return(analysisSession);
        }
Exemple #3
0
        public async Task <AnalysisSessionVm> Handle(Request request, CancellationToken cancellationToken)
        {
            var analysisSession = await analysisSessionsService.GetActualSession(request.NavigationProviderId, cancellationToken);

            analysisSession.GetDocumentsInfoTime = DateTime.Now;
            await dbContext.SaveChangesAsync(cancellationToken);

            var navigationProviderInfo = await dbContext.NavigationProvidersInfo
                                         .Where(p => p.Id == request.NavigationProviderId)
                                         .SingleAsync(cancellationToken);

            oneNoteNavigationProvider.SetParameters(navigationProviderInfo);

            var documents = await oneNoteNavigationProvider.LoadDocuments(
                analysisSession,
                newOnly : false,
                updateDb : false,
                cancellationToken);

            return(mapper.Map <AnalysisSessionVm>(analysisSession));
        }
        public async Task <AnalysisSession> GetActualSession(int navigationProviderId, CancellationToken cancellationToken = default)
        {
            var analysisSession = await this.dbContext.AnalysisSessions
                                  .Where(s => s.NavigationProviderId == navigationProviderId)
                                  .Where(s => s.Status == AnalysisSessionStatus.NotStarted)
                                  .OrderByDescending(s => s.GetDocumentsInfoTime)
                                  .FirstOrDefaultAsync(cancellationToken);

            if (analysisSession == null)
            {
                analysisSession = new AnalysisSession()
                {
                    NavigationProviderId = navigationProviderId,
                    Status = AnalysisSessionStatus.NotStarted
                };

                this.dbContext.AnalysisSessions.Add(analysisSession);
                await dbContext.SaveChangesAsync(cancellationToken);
            }

            return(analysisSession);
        }