/// <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); }
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); }
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(); } } } }
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); }
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; }
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(); } } } }
/// <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); }
/// <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; }
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; }
/// <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)); }