Пример #1
0
        /*public void Tick(PerformContext hangfireContext)
         * {
         *  Task.Run(async () =>
         *  {
         *      try
         *      {
         *          hangfireContext.WriteLine("Starting to check.");
         *          var containers = await _containerService.CheckAsync();
         *          bool anyUpdate = false;
         *
         *          foreach (var container in containers)
         *          {
         *              hangfireContext.WriteLine($"{container.Name} {container.Folder}");
         *              var probes = container.CheckForProbes();
         *
         *              hangfireContext.WriteLine($"{container.Name} is updating..");
         *
         *              var provider = _providerFactory.GetProvider(container.Repository.Provider);
         *
         *              var fileList = container.Update(provider);
         *
         *              if (fileList.Count() > 0)
         *              {
         *                  container.Repository.UpdatedTime = DateTime.Now;
         *                  anyUpdate = true;
         *
         *                  foreach (var item in fileList)
         *                  {
         *                      hangfireContext.WriteLine($"{container.Name} {item} file updated.");
         *                  }
         *
         *                  hangfireContext.WriteLine($"{container.Name} is updated.");
         *
         *                  var activatedProbes = probes.Where(i => fileList.Contains(i.Object.Path));
         *
         *                  foreach (var item in activatedProbes)
         *                  {
         *                      hangfireContext.WriteLine($"{item.Object.Path} file's probe is activated.");
         *                      _jobClient.Enqueue<ProbeControl>(i => i.Execute(null, item.Id, container.Repository.Id));
         *                      //BackgroundJob.Enqueue<ProbeControl>(i => i.Execute(null, item.Id, container.Repository.Id));
         *                  }
         *              }
         *              else
         *              {
         *                  hangfireContext.WriteLine($"{container.Name} no new changes.");
         *              }
         *          }
         *
         *          if (anyUpdate)
         *          {
         *              await _context.SaveChangesAsync();
         *          }
         *
         *          hangfireContext.WriteLine($"Total found containers {containers.Count()}.");
         *
         *          hangfireContext.WriteLine("End of check.");
         *      }
         *      catch (Exception ex)
         *      {
         *          hangfireContext.WriteLine(ConsoleTextColor.Red, ex);
         *      }
         *
         *
         *  });
         *
         * }*/

        public void Trigger(PerformContext hangfireContext, string repoName, string owner, List <string> modified)
        {
            var repo = _context.Repositories.FirstOrDefault(i => i.Name.Equals(repoName) && i.OwnerName.Equals(owner));

            if (repo != null)
            {
                var container = _containerService.GetContainer(repo);

                var probes = container.CheckForProbes();

                var provider = _providerFactory.GetProvider(repo.Provider);

                container.Update(provider);

                foreach (var probe in probes)
                {
                    if (modified.Contains(probe.Object.Path))
                    {
                        hangfireContext?.WriteLine($"{probe.Object.Path} file's probe is activated.");
                        _jobClient.Enqueue <ProbeControl>(i => i.Execute(null, probe.Id, repo.Id));
                        //BackgroundJob.Enqueue<ProbeControl>(i => i.Execute(null, probe.Id, container.Repository.Id));
                    }
                }
            }
        }
Пример #2
0
        public static IUnitOfWork Create(IProviderFactory providerFactory, string providerName)
        {
            var connection = providerFactory.GetProvider(providerName).GetConnection();

            connection.Open();

            return(new UnitOfWork(connection));
        }
        public async Task PerformMonitoringAsync()
        {
            var vehiclesFromDb = await _vehicleRepository.GetAllAsync();

            foreach (var vehicle in vehiclesFromDb)
            {
                // TODO: perform db request to get not archived
                if (vehicle.IsArchived)
                {
                    continue;
                }

                var provider = _providerFactory.GetProvider(vehicle.Url);

                try
                {
                    var newVehicleData = await provider.GetByUrlAsync(vehicle.Url);

                    var newCost = newVehicleData.Costs[0].CostInUsd;
                    var oldCost = vehicle.Costs.Last().CostInUsd;

                    if (newCost != oldCost)
                    {
                        foreach (var vehicleUserId in vehicle.UserIds)
                        {
                            var user = await _userRepository.GetByIdAsync(vehicleUserId);

                            await _botClient.SendTextMessageAsync(user.ChatId,
                                                                  $"Цена на {vehicle.Name} ({vehicle.Url}) изменилась! Новая цена - ${newCost}. Старая цена - ${oldCost}");
                        }
                    }

                    vehicle.Costs = vehicle.Costs.Concat(newVehicleData.Costs).ToArray();
                    await _vehicleRepository.UpdateAsync(vehicle);
                }
                catch (ProviderException exception)
                {
                    switch (exception.Type)
                    {
                    case ProviderExceptionType.ProviderNotFound:
                        break;

                    case ProviderExceptionType.AdClosedOrNotFound:
                        await ArchiveVehicle(vehicle);

                        break;

                    default:
                        throw new NotSupportedException($"Exception type {exception.Type} is not supported");
                    }
                }
            }
        }
Пример #4
0
        /*public void Execute(PerformContext hangfireContext, Container container)
         * {
         *  if (!container.IsTriggrProject())
         *      return;
         *
         *  var probes = container.CheckForProbes();
         *  hangfireContext.WriteLine($"Executing ProbeControl");
         *
         *  var codeChangeProbes = probes.Where(i => i.ProbeType == ProbeType.CodeChanges).ToList();
         *
         *  var oldFiles = new Dictionary<Probe, string>();
         *  if (codeChangeProbes.Count > 0)
         *  {
         *      foreach (var probe in codeChangeProbes)
         *      {
         *          var tempFile = Path.GetTempFileName();
         *
         *          var objectPath = Path.Combine(container.Folder, probe.Object.Path);
         *          if (File.Exists(objectPath))
         *          {
         *              hangfireContext.WriteLine($"Probe {probe.Object.Path}");
         *
         *              File.Copy(objectPath, tempFile, true);
         *
         *              oldFiles.Add(probe, tempFile);
         *          }
         *      }
         *  }
         *
         *  var provider = _providerFactory.GetProvider(container.Repository.Provider);
         *  var updatedPath = provider.Update(container.Repository);
         *
         *  if (!string.IsNullOrEmpty(updatedPath))
         *  {
         *      foreach (var probe in probes)
         *      {
         *          if (probe.ProbeType == ProbeType.CodeChanges)
         *          {
         *              var tempFile = oldFiles[probe];
         *              var objectPath = Path.Combine(container.Folder, probe.Object.Path);
         *              var language = _languageService.Define(probe.Object.Path);
         *
         *              var result = _scriptExecutor.Execute(probe.ProbeType, language.FolderName,
         *                              objectPath, tempFile, probe.Object.Type, probe.Object.Name);
         *
         *              hangfireContext.WriteLine($"Result of comparision {result}");
         *
         *              // it will changed with executing shell script
         *          }
         *      }
         *  }
         *  hangfireContext.WriteLine($"Finished ProbeControl");
         *
         * }
         */
        public void Execute(PerformContext hangfireContext, string probeId, string repoId)
        {
            var repository = _dbContext.Repositories.Find(repoId); // get the repository

            if (repository != null)
            {
                var container = _containerService.GetContainer(repoId); // get the container

                // get all probes and look for probeId
                var probes = container.CheckForProbes();
                var probe  = probes.FirstOrDefault(i => i.Id.Equals(probeId));

                if (probe != null)
                {
                    hangfireContext?.WriteLine(ConsoleTextColor.Gray, $"{probe.Object.Path} is found.");
                    // define the language
                    var language = _languageService.Define(probe.Object.Path);
                    // get the provider
                    var provider = _providerFactory.GetProvider(repository.Provider);
                    // restore to previous file
                    if (provider.Restore(repository, probe.Object.Path, true))
                    {
                        hangfireContext?.WriteLine(ConsoleTextColor.Gray, $"{probe.Object.Path} is restored to old.");
                        // get the file path
                        var objectPath = Path.Combine(container.Folder, probe.Object.Path);

                        // look for the object
                        var ast1 = _scriptExecutor.Execute("AST", language.FolderName, objectPath, probe.Object.Type, probe.Object.Name);

                        hangfireContext?.WriteLine(ConsoleTextColor.Gray, $"{probe.Object.Path} old version is loaded.");

                        var temp1 = WriteToTemp(ast1);

                        // restore to original file
                        if (provider.Restore(repository, probe.Object.Path, false))
                        {
                            // look for the object
                            var ast2 = _scriptExecutor.Execute("AST", language.FolderName, objectPath, probe.Object.Type, probe.Object.Name);

                            var temp2 = WriteToTemp(ast2);

                            hangfireContext?.WriteLine(ConsoleTextColor.Gray, $"{probe.Object.Path} new version is loaded.");

                            Control(hangfireContext, probe, repository, temp1, temp2, language.FolderName);
                        }
                    }
                }
            }
        }
Пример #5
0
        public static List <IProvider> GetProviders(string configuration)
        {
            var providers = new List <IProvider> {
                new OpenRepoProviderFactory().GetProvider(string.Empty)
            };
            var lines = configuration.Split("\n");
            IProviderFactory currentProviderFactory = null;

            foreach (var line in lines)
            {
                try
                {
                    if (line.Trim().StartsWith('#') || string.IsNullOrEmpty(line.Trim()))
                    {
                        continue; // Lines starting with # is a comment.
                    }

                    if (line.StartsWith(' ') || line.StartsWith('\t'))
                    {
                        if (currentProviderFactory == null)
                        {
                            LogService.Log($"Please provide a provider before you add configuration.");
                            continue;
                        }

                        providers.Add(currentProviderFactory.GetProvider(line.Trim()));
                    }
                    else if (!string.IsNullOrEmpty(line.Trim()))
                    {
                        var providerId = line.Replace(":", " ").Trim();
                        currentProviderFactory = m_factories.FirstOrDefault(f => f.Id == providerId);
                        if (currentProviderFactory == null)
                        {
                            LogService.Log($"Can't find provider with id {providerId}");
                        }
                    }
                }
                catch (Exception e)
                {
                    LogService.Log("Config Error: <<" + line + ">> " + e.Message);
                }
            }

            return(providers);
        }
Пример #6
0
        public async Task <bool> FetchProviderAssets(ProviderCredentials accountProvider, string password, string code, CancellationToken cancellationToken)
        {
            var providerUserName     = _encryptorManager.Decrypt(accountProvider.ProviderUserName, password);
            var providerUserPassword = _encryptorManager.Decrypt(accountProvider.ProviderUserPassword, password);

            try
            {
                var provider          = _providerFactory.GetProvider(accountProvider.ProviderName);
                var isLoginSuccessful = await provider.LoginAsync(providerUserName, providerUserPassword, code, cancellationToken);

                if (!isLoginSuccessful)
                {
                    return(false);
                }

                var assets = await provider.GetAssetsAsync(cancellationToken);

                var dateTimeNow = DateTimeOffset.UtcNow;

                if (accountProvider.LastSuccessfulUpdate.Date == dateTimeNow.Date)
                {
                    var sameDayAssets = await GetCurrentAssetsForProviderAsync(accountProvider.Email, accountProvider, cancellationToken);

                    var deleteAssetsTasks =
                        sameDayAssets.Select(a => DeleteAssetAsync(accountProvider.Email, a, cancellationToken));
                    await Task.WhenAll(deleteAssetsTasks);
                }

                var saveAssetsTask = assets.Select(a =>
                {
                    a.StorageDate = dateTimeNow;
                    return(SetAssetAsync(accountProvider.Email, a, cancellationToken));
                });
                await Task.WhenAll(saveAssetsTask);

                await _accountProvidersManager.SetLastSuccessfulUpdate(accountProvider.Email, accountProvider, dateTimeNow, cancellationToken);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Пример #7
0
        private static MigrationOptions GetOptions(out IEnumerable <ProviderInfo> providerInfos)
        {
            IProviderMetadata metadata = A.Fake <IProviderMetadata>();

            A.CallTo(() => metadata.MaximumDbObjectNameLength).Returns(MaximumSupportedLength);
            A.CallTo(() => metadata.MajorVersion).Returns(Platform.MajorVersion);
            A.CallTo(() => metadata.InvariantName).Returns("System.Data.Odbc"); // for the Odbc specific tests

            IProvider provider = new ProviderStub();

            IProviderFactory providerFactory = A.Fake <IProviderFactory>();

            A.CallTo(() => providerFactory.GetProvider(metadata)).Returns(provider);
            providerInfos = new[] { new ProviderInfo(provider, metadata) };

            var options = new MigrationOptions();

            options.SupportedPlatforms.AddOrReplaceMinimumRequirement(Platform);
            return(options);
        }
Пример #8
0
        public virtual T GetProvider <T>()
        {
            var innerProvider = innerFactory.GetProvider <T>();

            if (innerProvider is ISchemaProvider)
            {
                return((T)(object)new SchemaProvider((ISchemaProvider)innerProvider));
            }

            if (innerProvider is ITextFolderProvider)
            {
                return((T)(object)new TextFolderProvider((ITextFolderProvider)innerProvider));
            }

            if (innerProvider is IMediaFolderProvider)
            {
                return((T)(object)new MediaFolderProvider((IMediaFolderProvider)innerProvider));
            }

            return(innerProvider);
        }
Пример #9
0
        public Container GetContainer(Repository repository)
        {
            Container result = null;

            var    provider = _providerFactory.GetProvider(repository.Provider);
            string path     = string.Empty;

            if (!provider.Exist(repository))
            {
                path = provider.Clone(repository);
            }
            else
            {
                path = _storage.Combine(repository.Id);
            }

            result = new Container($"Container #{repository.Id}", path, repository)
            {
                UpdatedTime = repository.UpdatedTime
            };

            return(result);
        }
Пример #10
0
        public static List <IProvider> GetProviders(string configuration)
        {
            var providers = new List <IProvider>();
            var lines     = configuration.Split("\n");
            IProviderFactory currentProviderFactory = null;

            foreach (var line in lines)
            {
                if (line.Trim().StartsWith('#'))
                {
                    continue; // Lines starting with # is a comment.
                }

                if (line.StartsWith(' ') || line.StartsWith('\t'))
                {
                    if (currentProviderFactory == null)
                    {
                        LogService.Log($"Please provider a provider before you configure nothing?");
                        continue;
                    }

                    providers.Add(currentProviderFactory.GetProvider(line.Trim()));
                }
                else if (!string.IsNullOrEmpty(line.Trim()))
                {
                    var providerId = line.Replace(":", " ").Trim();
                    currentProviderFactory = m_factories.FirstOrDefault(f => f.Id == providerId);
                    if (currentProviderFactory == null)
                    {
                        LogService.Log($"Can't find provider with id {providerId}");
                    }
                }
            }

            return(providers);
        }
Пример #11
0
        public async Task <IEnumerable <HandlerResult> > HandleContextAsync(Message message)
        {
            var user = await _userRepository.GetByChatIdAsync(message.UserInfo.ChatId);

            var existingVehicle = await _vehicleRepository.GetByUrlAsync(message.Text);

            if (existingVehicle != null)
            {
                if (existingVehicle.UserIds.Contains(user.Id))
                {
                    user.Status = null;
                    await _userRepository.UpdateAsync(user);

                    return(new[] { new HandlerResult {
                                       Message = "Вы уже добавили эту ссылку. /help"
                                   } });
                }

                user.VehicleIds = user.VehicleIds.Concat(new[] { existingVehicle.Id }).ToArray();
                await _userRepository.UpdateAsync(user);

                existingVehicle.UserIds = existingVehicle.UserIds.Concat(new[] { user.Id }).ToArray();
                await _vehicleRepository.UpdateAsync(existingVehicle);

                // TODO: refactor code duplication
                return(new[] { new HandlerResult {
                                   Message = "Ссылка сохранена. Я уведомлю вас когда цена изменится. /help"
                               } });
            }

            try
            {
                var vehicle = await _providerFactory.GetProvider(message.Text).GetByUrlAsync(message.Text);

                vehicle.UserIds = new[] { user.Id };
                await _vehicleRepository.InsertAsync(vehicle);

                user.VehicleIds = user.VehicleIds.Concat(new[] { vehicle.Id }).ToArray();
                user.Status     = null;
                await _userRepository.UpdateAsync(user);

                return(new[] { new HandlerResult {
                                   Message = "Ссылка сохранена. Я уведомлю вас когда цена изменится. /help"
                               } });
            }
            catch (ProviderException exception)
            {
                var resultMessage = exception.Type switch
                {
                    ProviderExceptionType.ProviderNotFound =>
                    "Извините, на данный момент мы не поддерживаем данного провайдера, либо вы отправили некорректную ссылку. Попробуйте еще раз.",
                    ProviderExceptionType.AdClosedOrNotFound => "Извините, объявление закрыто или не найдено. Попробуйте еще раз.",
                    _ => throw new NotSupportedException($"Exception with type {exception.Type} is not supported")
                };

                return(new[] { new HandlerResult {
                                   Message = resultMessage
                               } });
            }
        }
    }
Пример #12
0
        public ProviderInfo GetExactly(DbPlatform dbPlatform)
        {
            IProviderMetadata metadata = _providerFactory.GetProviderMetadatas().Single(m => m.Platform == dbPlatform.Platform && m.MajorVersion == dbPlatform.MajorVersion && m.Driver == dbPlatform.Driver);

            return(new ProviderInfo(_providerFactory.GetProvider(metadata), metadata));
        }