示例#1
0
        /// <exception cref="ArgumentNullException"><paramref name="trainingProvider"/> is <see langword="null" />.</exception>
        public async Task <CallResult> ReassignCourseSpecializationsAsync(TrainingProvider trainingProvider, bool useArchiveData = false)
        {
            if (trainingProvider == null)
            {
                throw new ArgumentNullException("trainingProvider");
            }

            if (!await _semaphore.WaitAsync(WaitTimeout))
            {
                return(CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState));
            }

            try
            {
                var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });

                using (var catalog = _activatorProxy.CreateInstance <ITrainingCatalog>(trainingProvider.AssemblyType))
                {
                    // ReSharper disable once ExceptionNotDocumented
                    catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
                                       trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer, _archiveDirectoryPath);
                    using (var context = _contextFactory.CreateDbContext())
                    {
                        await catalog.ReassignCourseSpecializationsAsync(context, useArchiveData);
                    }
                }
            }
            finally
            {
                _semaphore.Release();
            }

            return(CallResult.Success);
        }
示例#2
0
        public async Task <CallResult> UpdateTrainingCatalogAsync(int trainingProviderId)
        {
            if (!await _semaphore.WaitAsync(WaitTimeout))
            {
                return(CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState));
            }

            try
            {
                using (var context = _contextFactory.CreateDbContext())
                {
                    var trainingProvider = await context.TrainingProviders.FindAsync(trainingProviderId);

                    var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });

                    var description = Resources.UpdateEventDescription_ManualEvent;

                    await UpdateTrainingCatalogAsync(context, trainingProvider, description, pathsContainer);
                }
            }
            finally
            {
                _semaphore.Release();
            }

            return(CallResult.Success);
        }
示例#3
0
        internal async Task UpdateTrainingCatalogAsync(UpdateDbContext context, TrainingProvider trainingProvider,
                                                       string description, ServerMediaPathsContainer pathsContainer, bool useArchiveData = false, bool logUpdateToDb = true)
        {
            var updateEvent = new UpdateEvent(trainingProvider.Id, description, _dateTimeProxy.UtcNow);

            context.UpdateEvents.Add(updateEvent);

            await context.SaveChangesAsync();

            using (var catalog = _activatorProxy.CreateInstance <ITrainingCatalog>(trainingProvider.AssemblyType))
            {
                catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
                                   trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer, _archiveDirectoryPath);
                try
                {
                    await catalog.UpdateAsync(updateEvent, context, useArchiveData, logUpdateToDb);

                    updateEvent.EndedOn = _dateTimeProxy.UtcNow;
                    if (context.AuthorsResolves.Local.Any())
                    {
                        updateEvent.UpdateResult = UpdateResult.NeedManualResolve;
                    }
                    else
                    {
                        updateEvent.UpdateResult = UpdateResult.Success;
                    }

                    await context.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    updateEvent.EndedOn      = _dateTimeProxy.UtcNow;
                    updateEvent.UpdateResult = UpdateResult.Error;

                    var aggregateException = ex as AggregateException;
                    var errorData          = aggregateException != null
                  ? aggregateException.Flatten().ToString()
                  : ex.ToString();

                    updateEvent.ErrorData = errorData;

                    updateEvent.AuthorsUpdates    = null;
                    updateEvent.CategoriesUpdates = null;
                    updateEvent.CoursesUpdates    = null;

                    context.SetStateToDetached(updateEvent);

                    using (var ctx = _contextFactory.CreateDbContext())
                    {
                        ctx.SetStateToModified(updateEvent);
                        ctx.SaveChanges();
                    }
                }
            }
        }
示例#4
0
        public async Task <CallResult> UpdateTrainingCatalogsAsync()
        {
            if (!await _semaphore.WaitAsync(WaitTimeout))
            {
                return(CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState));
            }

            try
            {
                List <TrainingProvider> trainingProviders;
                using (var context = _contextFactory.CreateDbContext())
                {
                    trainingProviders = await context.TrainingProviders
                                        .Where(x => !x.IsDeleted).ToListAsync();
                }

                var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, trainingProviders);

                foreach (var trainingProvider in trainingProviders)
                {
                    using (var context = _contextFactory.CreateDbContext())
                    {
                        var lastUpdateEventInfo = await GetLastUpdateEventInfoAsync(trainingProvider.Id, context);

                        if (
                            !CanProcessUpdate(trainingProvider.UpdateFrequency, trainingProvider.AllowedUpdateUtcHours,
                                              lastUpdateEventInfo))
                        {
                            continue;
                        }

                        var description = Resources.UpdateEventDescription_ScheduledEvent;

                        await UpdateTrainingCatalogAsync(context, trainingProvider, description, pathsContainer);
                    }
                }
            }
            finally
            {
                _semaphore.Release();
            }

            return(CallResult.Success);
        }
示例#5
0
      public async Task<CallResult> UpdateTrainingCatalogsAsync()
      {
         if (!await _semaphore.WaitAsync(WaitTimeout))
         {
            return CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState);
         }

         try
         {
            List<TrainingProvider> trainingProviders;
            using (var context = _contextFactory.CreateDbContext())
            {
               trainingProviders = await context.TrainingProviders
                  .Where(x => !x.IsDeleted).ToListAsync();
            }

            var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, trainingProviders);

            foreach (var trainingProvider in trainingProviders)
            {
               using (var context = _contextFactory.CreateDbContext())
               {
                  var lastUpdateEventInfo = await GetLastUpdateEventInfoAsync(trainingProvider.Id, context);

                  if (
                     !CanProcessUpdate(trainingProvider.UpdateFrequency, trainingProvider.AllowedUpdateUtcHours,
                        lastUpdateEventInfo))
                     continue;

                  var description = Resources.UpdateEventDescription_ScheduledEvent;

                  await UpdateTrainingCatalogAsync(context, trainingProvider, description, pathsContainer);
               }
            }
         }
         finally
         {
            _semaphore.Release();
         }

         return CallResult.Success;
      }
示例#6
0
      internal async Task UpdateTrainingCatalogAsync(UpdateDbContext context, TrainingProvider trainingProvider,
         string description, ServerMediaPathsContainer pathsContainer, bool useArchiveData = false, bool logUpdateToDb = true)
      {
         var updateEvent = new UpdateEvent(trainingProvider.Id, description, _dateTimeProxy.UtcNow);

         context.UpdateEvents.Add(updateEvent);

         await context.SaveChangesAsync();

         using (var catalog = _activatorProxy.CreateInstance<ITrainingCatalog>(trainingProvider.AssemblyType))
         {
            catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
               trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer,_archiveDirectoryPath);
            try
            {
               await catalog.UpdateAsync(updateEvent, context, useArchiveData, logUpdateToDb);

               updateEvent.EndedOn = _dateTimeProxy.UtcNow;
               if (context.AuthorsResolves.Local.Any())
               {
                  updateEvent.UpdateResult = UpdateResult.NeedManualResolve;
               } else
               {
                  updateEvent.UpdateResult = UpdateResult.Success;
               }

               await context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
               updateEvent.EndedOn = _dateTimeProxy.UtcNow;
               updateEvent.UpdateResult = UpdateResult.Error;

               var aggregateException = ex as AggregateException;
               var errorData = aggregateException != null
                  ? aggregateException.Flatten().ToString()
                  : ex.ToString();

               updateEvent.ErrorData = errorData;

               updateEvent.AuthorsUpdates = null;
               updateEvent.CategoriesUpdates = null;
               updateEvent.CoursesUpdates = null;

               context.SetStateToDetached(updateEvent);

               using (var ctx = _contextFactory.CreateDbContext())
               {
                  ctx.SetStateToModified(updateEvent);
                  ctx.SaveChanges();
               }
            }
         }
      }
示例#7
0
      /// <exception cref="UpdateServiceException">Author already in db.</exception>
      public async Task<CallResult<Author>> CreateAuthorAsync(int trainingProviderId, string authorUrlName, IHttpDownloadManager httpDownloadManager)
      {
         if (authorUrlName == null) throw new ArgumentNullException("authorUrlName");
         if (httpDownloadManager == null) throw new ArgumentNullException("httpDownloadManager");

         if (!await _semaphore.WaitAsync(WaitTimeout))
         {
            return CallResult<Author>.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState);
         }


         Author author;

         try
         {
            using (var context = _contextFactory.CreateDbContext())
            {
               var trainingProvider = await context.TrainingProviders.FindAsync(trainingProviderId);

               var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });


               using (var catalog = _activatorProxy.CreateInstance<ITrainingCatalog>(trainingProvider.AssemblyType))
               {
                  // ReSharper disable once ExceptionNotDocumented
                  catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
                     trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer, _archiveDirectoryPath);

                  author = await catalog.GetAuthorAsync(authorUrlName, httpDownloadManager);
               }

               var sameAuthorsIds = await context.Authors
                  .Where(x => x.LastName == author.LastName &&
                              x.FirstName == author.FirstName &&
                              x.Social.FacebookLink == author.Social.FacebookLink &&
                              x.Social.LinkedInLink == author.Social.LinkedInLink &&
                              x.Social.RssLink == author.Social.RssLink &&
                              x.Social.TwitterLink == author.Social.TwitterLink)
                  .Select(x => x.Id).ToListAsync();

               if (sameAuthorsIds.Any())
               {
                  var message = string.Format(Resources.UpdateServiceException_AuthorAlreadyInDb_Message, author.FullName,
                     string.Join(";", sameAuthorsIds));

                  return CallResult<Author>.Failed(message);
               }

               // save avatar to media folder
               var pathToSave = Path.Combine(pathsContainer.AuthorsLogoPath[trainingProviderId], author.Avatar.Name);

               if (!FileSystemProxy.Instance.IsFileExists(pathToSave))
               {
                  // ensure http scheme
                  var avatarUriBuilder = new UriBuilder(new Uri(author.Avatar.SiteUrl))
                  {
                     Scheme = "http"
                  };

                  var avatarResponse = await httpDownloadManager.DownloadFileAsync(avatarUriBuilder.Uri);

                  if (avatarResponse.IsSuccess)
                  {
                     await FileSystemProxy.Instance.WriteToFileAsync(pathToSave, avatarResponse.Result);
                  }
               }

               context.Authors.Add(author);

               await context.SaveChangesAsync();
            }
         }
         finally
         {
            _semaphore.Release();
         }

         return CallResult<Author>.Success(author);
      }
示例#8
0
      /// <exception cref="ArgumentNullException"><paramref name="trainingProvider"/> is <see langword="null" />.</exception>
      public async Task<CallResult> ReassignCourseSpecializationsAsync(TrainingProvider trainingProvider, bool useArchiveData = false)
      {
         if (trainingProvider == null)
            throw new ArgumentNullException("trainingProvider");

         if (!await _semaphore.WaitAsync(WaitTimeout))
         {
            return CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState);
         }

         try
         {
            var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });

            using (var catalog = _activatorProxy.CreateInstance<ITrainingCatalog>(trainingProvider.AssemblyType))
            {
               // ReSharper disable once ExceptionNotDocumented
               catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
                  trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer, _archiveDirectoryPath);
               using (var context = _contextFactory.CreateDbContext())
               {
                  await catalog.ReassignCourseSpecializationsAsync(context, useArchiveData);
               }
            }
         }
         finally
         {
            _semaphore.Release();
         }

         return CallResult.Success;
      }
示例#9
0
      public async Task<CallResult> UpdateTrainingCatalogAsync(int trainingProviderId)
      {
         if (!await _semaphore.WaitAsync(WaitTimeout))
         {
            return CallResult.Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState);
         }

         try
         {
            using (var context = _contextFactory.CreateDbContext())
            {
               var trainingProvider = await context.TrainingProviders.FindAsync(trainingProviderId);

               var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });

               var description = Resources.UpdateEventDescription_ManualEvent;

               await UpdateTrainingCatalogAsync(context, trainingProvider, description, pathsContainer);
            }
         }
         finally
         {
            _semaphore.Release();
         }

         return CallResult.Success;
      }
示例#10
0
        /// <exception cref="UpdateServiceException">Author already in db.</exception>
        public async Task <CallResult <Author> > CreateAuthorAsync(int trainingProviderId, string authorUrlName, IHttpDownloadManager httpDownloadManager)
        {
            if (authorUrlName == null)
            {
                throw new ArgumentNullException("authorUrlName");
            }
            if (httpDownloadManager == null)
            {
                throw new ArgumentNullException("httpDownloadManager");
            }

            if (!await _semaphore.WaitAsync(WaitTimeout))
            {
                return(CallResult <Author> .Failed(Resources.UpdateService_CannotUpdateBecauseDatabaseIsInUpdateState));
            }


            Author author;

            try
            {
                using (var context = _contextFactory.CreateDbContext())
                {
                    var trainingProvider = await context.TrainingProviders.FindAsync(trainingProviderId);

                    var pathsContainer = new ServerMediaPathsContainer(_serverImagesPath, new[] { trainingProvider });


                    using (var catalog = _activatorProxy.CreateInstance <ITrainingCatalog>(trainingProvider.AssemblyType))
                    {
                        // ReSharper disable once ExceptionNotDocumented
                        catalog.Initialize(trainingProvider.Name, trainingProvider.Id, trainingProvider.SiteUrl,
                                           trainingProvider.SourceUrl, trainingProvider.SourceLocation, pathsContainer, _archiveDirectoryPath);

                        author = await catalog.GetAuthorAsync(authorUrlName, httpDownloadManager);
                    }

                    var sameAuthorsIds = await context.Authors
                                         .Where(x => x.LastName == author.LastName &&
                                                x.FirstName == author.FirstName &&
                                                x.Social.FacebookLink == author.Social.FacebookLink &&
                                                x.Social.LinkedInLink == author.Social.LinkedInLink &&
                                                x.Social.RssLink == author.Social.RssLink &&
                                                x.Social.TwitterLink == author.Social.TwitterLink)
                                         .Select(x => x.Id).ToListAsync();

                    if (sameAuthorsIds.Any())
                    {
                        var message = string.Format(Resources.UpdateServiceException_AuthorAlreadyInDb_Message, author.FullName,
                                                    string.Join(";", sameAuthorsIds));

                        return(CallResult <Author> .Failed(message));
                    }

                    // save avatar to media folder
                    var pathToSave = Path.Combine(pathsContainer.AuthorsLogoPath[trainingProviderId], author.Avatar.Name);

                    if (!FileSystemProxy.Instance.IsFileExists(pathToSave))
                    {
                        // ensure http scheme
                        var avatarUriBuilder = new UriBuilder(new Uri(author.Avatar.SiteUrl))
                        {
                            Scheme = "http"
                        };

                        var avatarResponse = await httpDownloadManager.DownloadFileAsync(avatarUriBuilder.Uri);

                        if (avatarResponse.IsSuccess)
                        {
                            await FileSystemProxy.Instance.WriteToFileAsync(pathToSave, avatarResponse.Result);
                        }
                    }

                    context.Authors.Add(author);

                    await context.SaveChangesAsync();
                }
            }
            finally
            {
                _semaphore.Release();
            }

            return(CallResult <Author> .Success(author));
        }