예제 #1
0
 private void ValidateNotNullSubscription(SourceSubscription subscription)
 {
     if (subscription == null)
     {
         throw new NullSubscriptionException();
     }
 }
예제 #2
0
 private void ValidateSubscription(SourceSubscription subscription, int subscriptionId)
 {
     if (subscription == null)
     {
         throw new NotFoundSubscriptionException(subscriptionId);
     }
 }
예제 #3
0
        public async void ShouldThrowValidationExceptionOnUpdateWhenStorageSubscriptionIsNullAsync()
        {
            // arrange
            var randomSubscription  = GetRandomSubscription();
            var inputSubscription   = randomSubscription;
            var inputSubscriptionId = randomSubscription.Id;
            SourceSubscription invalidSubscription = null;
            var notFoundSubscriptionException      = new NotFoundSubscriptionException(inputSubscriptionId);

            var expectedValidationException =
                new SubscriptionValidationException(notFoundSubscriptionException);

            _storageBrokerMock.Setup(broker =>
                                     broker.SelectSourceSubscriptionByIdAsync(inputSubscriptionId))
            .ReturnsAsync(invalidSubscription);

            // act
            var actualSubscriptionTask = _subscriptionService.UpdateSubscriptionAsync(inputSubscription);

            // assert
            var actualException = await Assert.ThrowsAsync <SubscriptionValidationException>(() =>
                                                                                             actualSubscriptionTask);

            Assert.Equal(expectedValidationException.Message, actualException.Message);
            Assert.IsType <NotFoundSubscriptionException>(actualException.InnerException);
            Assert.Equal(expectedValidationException.InnerException.Message, actualException.InnerException.Message);

            _storageBrokerMock.Verify(broker =>
                                      broker.SelectSourceSubscriptionByIdAsync(inputSubscriptionId),
                                      Times.Once);

            _storageBrokerMock.VerifyNoOtherCalls();
        }
        public async Task <SourceSubscription> DeleteSourceSubscriptionAsync(SourceSubscription sourceSubscription)
        {
            var sourceSubscriptionEntry = SourceSubscriptions.Remove(sourceSubscription);

            await SaveChangesAsync();

            return(sourceSubscriptionEntry.Entity);
        }
        public async Task <SourceSubscription> UpdateSourceSubscriptionAsync(SourceSubscription sourceSubscription)
        {
            sourceSubscription.UpdateDate = DateTimeOffset.Now;
            var sourceSubscriptionEntry = SourceSubscriptions.Update(sourceSubscription);

            await SaveChangesAsync();
            await Entry(sourceSubscriptionEntry.Entity).Reference(r => r.SourceType).LoadAsync();

            return(sourceSubscriptionEntry.Entity);
        }
예제 #6
0
 public Task <SourceSubscription> AddSubscriptionAsync(SourceSubscription subscription)
 {
     return(TryCatch(async() =>
     {
         ValidateSubscriptionOnAdd(subscription);
         subscription.Id = 0;
         var storageSubscription = await _storageBroker.InsertSourceSubscriptionAsync(subscription);
         await UpdateSubscriptionVacanciesAsync(storageSubscription);
         return storageSubscription;
     }));
 }
예제 #7
0
        private async Task SaveSubscriptionVacancy(Vacancy vacancy, SourceSubscription subscription)
        {
            var subscriptionVacancy = new SubscriptionVacancy
            {
                SourceSubscriptionId = subscription.Id,
                VacancyId            = vacancy.Id
            };
            await _storageBroker.InsertSubscriptionVacancyAsync(subscriptionVacancy);

            _logger.Log(LogLevel.Information, "Saved subscription vacancy {VacancyId} for subscription {SubscriptionId}",
                        vacancy.Id, subscription.Id);
        }
예제 #8
0
        public Task <SourceSubscription> UpdateSubscriptionAsync(SourceSubscription subscription)
        {
            return(TryCatch(async() =>
            {
                ValidateSubscriptionOnUpdate(subscription);
                var storageSubscription = await _storageBroker.SelectSourceSubscriptionByIdAsync(subscription.Id);
                ValidateStorageSubscription(storageSubscription, subscription.Id);
                var updatedSubscription = await _storageBroker.UpdateSourceSubscriptionAsync(subscription);
                if (updatedSubscription.Parameters != storageSubscription.Parameters)
                {
                    await _syncSubscriptionService.UpdateSubscription(storageSubscription.Id);
                }

                return updatedSubscription;
            }));
        }
예제 #9
0
        public async void ShouldThrowValidationExceptionOnUpdateWhenInputSubscriptionIsNullAsync()
        {
            // arrange
            SourceSubscription nullInputSubscription = null;
            var nullSubscriptionException            = new NullSubscriptionException();

            var expectedValidationException =
                new SubscriptionValidationException(nullSubscriptionException);

            // act
            var actualSubscriptionTask = _subscriptionService.UpdateSubscriptionAsync(nullInputSubscription);

            // assert
            var actualException = await Assert.ThrowsAsync <SubscriptionValidationException>(() =>
                                                                                             actualSubscriptionTask);

            Assert.Equal(expectedValidationException.Message, actualException.Message);
            Assert.IsType <NullSubscriptionException>(actualException.InnerException);
            Assert.Equal(expectedValidationException.InnerException.Message, actualException.InnerException.Message);

            _storageBrokerMock.VerifyNoOtherCalls();
        }
예제 #10
0
 private void ValidateSubscriptionOnAdd(SourceSubscription subscription)
 {
     ValidateNotNullSubscription(subscription);
 }
예제 #11
0
        private async Task UpdateSubscriptionVacancies(SourceSubscription subscription)
        {
            _logger.LogInformation("Processing subscription with id {SubscriptionId}",
                                   subscription.Id);
            var sourceType             = subscription.SourceType;
            var subscriptionParameters = GetSubscriptionParameters(subscription.Parameters);
            var snippets = _headHunterBroker.GetSnippets(subscriptionParameters);

            // for each subscription load vacancies
            var count = 0;

            await foreach (var snippet in snippets)
            {
                _logger.Log(LogLevel.Information, "Processing vacancy #{VacancyOderNumber}", count);
                var existedVacancy = await _storageBroker.SelectVacancyBySourceIdAsync(sourceType.Id, snippet.Id);

                if (existedVacancy == null)
                {
                    _logger.Log(LogLevel.Information, "Adding vacancy #{VacancyOderNumber}", count);
                    var headHunterVacancy = await _headHunterBroker.GetVacancy(snippet.Id);

                    var vacancy = await CreateVacancyAsync(sourceType, snippet, headHunterVacancy);

                    vacancy = await _storageBroker.InsertVacancyAsync(vacancy);

                    var vacancySkills = await CreateVacancySkillsAsync(vacancy, headHunterVacancy.KeySkills);
                    await SaveVacancySkillsAsync(vacancySkills);
                    await SaveSubscriptionVacancy(vacancy, subscription);
                }
                else
                {
                    if (existedVacancy.SourceUpdatedDate < snippet.UpdateDate ||
                        existedVacancy.IsArchived != snippet.Archived)
                    {
                        _logger.Log(LogLevel.Information, "Updating vacancy #{VacancyOderNumber}", count);
                        var headHunterVacancy = await _headHunterBroker.GetVacancy(snippet.Id);

                        var updatedVacancy = await CreateVacancyAsync(sourceType, snippet, headHunterVacancy);

                        updatedVacancy.Id = existedVacancy.Id;
                        if (!existedVacancy.HasContentChanges(updatedVacancy))
                        {
                            updatedVacancy.ContentUpdatedDate = existedVacancy.ContentUpdatedDate;
                        }
                        await _storageBroker.UpdateVacancyAsync(updatedVacancy);
                    }

                    var subscriptionVacancy = await
                                              _storageBroker.SelectSubscriptionVacancyByVacancyAndSubscriptionIdAsync(subscription.Id,
                                                                                                                      existedVacancy.Id);

                    if (subscriptionVacancy == null)
                    {
                        await SaveSubscriptionVacancy(existedVacancy, subscription);
                    }
                }

                count++;
            }
            _logger.LogInformation("Subscription with id {SubscriptionId} was updated",
                                   subscription.Id);
        }
예제 #12
0
        private static IEnumerable <SubscriptionVacancy> GetSeedingSubscriptionVacancies(SourceSubscription subscription)
        {
            var subscriptionVacancies = _subscriptionVacancyFaker.Generate(25);

            subscriptionVacancies.ForEach(sv => sv.SourceSubscriptionId = subscription.Id);
            return(subscriptionVacancies);
        }
예제 #13
0
 public async Task UpdateSubscriptionVacanciesAsync(SourceSubscription subscription)
 {
     await _syncSubscriptionService.UpdateSubscription(subscription.Id);
 }