private static void SyncInsertedPosts(
            IEnumerable<BlogPost> sourcePosts,
            IEnumerable<BlogPostBase> dataStoragePosts,
            BlogSyncPostsChangeSet changeSet)
        {
            var dbIds = dataStoragePosts.Select(x => x.SourceId).ToList();

            var insertedPosts = sourcePosts.Where(post => !dbIds.Contains(post.SourceId)).Distinct().ToList();

            changeSet.InsertedBlogPosts.AddRange(insertedPosts);
        }
        public static BlogSyncPostsChangeSet GetChangeSet(
            string blogKey,
            IReadOnlyList<BlogPost> sourcePosts,
            IReadOnlyList<BlogPostBase> dataStoragePosts)
        {
            if (blogKey == null)
            {
                throw new ArgumentNullException(nameof(blogKey));
            }
            if (sourcePosts == null)
            {
                throw new ArgumentNullException(nameof(sourcePosts));
            }
            if (dataStoragePosts == null)
            {
                throw new ArgumentNullException(nameof(dataStoragePosts));
            }

            var cleanSourcePosts =
                sourcePosts.Where(x => x != null)
                    .OrderByDescending(x => x.UpdatedAt)
                    .Distinct(x => x.SourceId)
                    .ToReadOnlyList();

            var cleanDataStoragePosts =
                dataStoragePosts.Where(x => x != null).Distinct(x => x.SourceId).ToReadOnlyList();

            var changeSet = new BlogSyncPostsChangeSet(blogKey);

            SyncDeletedPosts(cleanSourcePosts, cleanDataStoragePosts, changeSet);

            SyncInsertedPosts(cleanSourcePosts, cleanDataStoragePosts, changeSet);

            SyncModifiedPosts(cleanSourcePosts, cleanDataStoragePosts, changeSet);

            return changeSet;
        }
        private static void SyncModifiedPosts(
            IEnumerable<BlogPost> sourcePosts,
            IEnumerable<BlogPostBase> dataStoragePosts,
            BlogSyncPostsChangeSet changeSet)
        {
            var modifiedPosts =
                dataStoragePosts.Join(
                    sourcePosts,
                    dbPost => dbPost.SourceId,
                    sourcePost => sourcePost.SourceId,
                    (dbPost, sourcePost) => new { DbPost = dbPost, SourcePost = sourcePost }).ToList();

            foreach (var modifiedPost in modifiedPosts)
            {
                var dbPost = modifiedPost.DbPost;
                var sourcePost = modifiedPost.SourcePost;

                bool isModified = (dbPost.Hash != sourcePost.Hash || sourcePost.UpdatedAt > dbPost.UpdatedAt);
                if (isModified)
                {
                    changeSet.UpdatedBlogPosts.Add(sourcePost);
                }
            }
        }
Beispiel #4
0
        public Task SaveChanges(BlogSetting blogSetting, BlogSyncPostsChangeSet changeSet)
        {
            this.OnSaveChangesRun?.Invoke(this, blogSetting.BlogKey);

            return Task.CompletedTask;
        }
        public async Task SaveChanges(BlogSetting blogSetting, BlogSyncPostsChangeSet changeSet)
        {
            if (blogSetting == null)
            {
                throw new ArgumentNullException(nameof(blogSetting));
            }
            if (changeSet == null)
            {
                throw new ArgumentNullException(nameof(changeSet));
            }

            using (var session = this.DocumentStore.OpenAsyncSession())
            {
                session.Advanced.MaxNumberOfRequestsPerSession = int.MaxValue;

                await DeletedPosts(session, changeSet.DeletedBlogPosts);
                await InsertOrUpdatePosts(session, changeSet.InsertedBlogPosts);
                await InsertOrUpdatePosts(session, changeSet.UpdatedBlogPosts);

                await session.SaveChangesAsync();
            }
        }
        private void HandleChanges(string blogKey, BlogSyncPostsChangeSet changeSet)
        {
            var posts = changeSet.InsertedBlogPosts.Concat(changeSet.UpdatedBlogPosts).ToList();

            foreach (var post in posts)
            {
                post.BlogKey = blogKey;

                post.UrlSlug = this.config.SlugProvider.GetUrlSlug(post);
                post.BlavenId = this.config.BlavenIdProvider.GetBlavenId(post);

                this.config.TransformersProvider.ApplyTransformers(post);
            }
        }
Beispiel #7
0
 internal void OnDataUpdated(BlogMeta blogMeta, BlogSyncPostsChangeSet changeSet)
 {
     this.BlogMeta = blogMeta;
     this.BlogPostsChanges = changeSet;
 }
        public async Task SaveChanges(BlogSetting blogSetting, BlogSyncPostsChangeSet changeSet)
        {
            if (blogSetting == null)
            {
                throw new ArgumentNullException(nameof(blogSetting));
            }
            if (changeSet == null)
            {
                throw new ArgumentNullException(nameof(changeSet));
            }

            await this.DeletedPosts(changeSet.DeletedBlogPosts);
            await this.InsertOrUpdatePosts(changeSet.InsertedBlogPosts);
            await this.InsertOrUpdatePosts(changeSet.UpdatedBlogPosts);

            await this.DbContext.SaveChangesAsync();
        }