public bool TryResolveRoute(Uri absoluteUri, out SiteRoute route)
        {
            if (!absoluteUri.IsAbsoluteUri)
            {
                throw new Exception("Uris should be absolute.");
            }


            route = null;

            RouteConstraint constraint;

            try
            {
                constraint = GetBestRouteConstraint(absoluteUri);
            }
            catch (Exception e)
            {
                return(false);
            }

            var absPath = new Uri(absoluteUri.AbsolutePath, UriKind.Relative);

            absPath = RemoveTrailingSlashes(absPath);

            return(_siteRouteTables[constraint].TryGetRoute(absPath, out route));
        }
예제 #2
0
        public async Task <IActionResult> PostNewsDocLocalHostAsync([FromHeader] String source,
                                                                    [FromRoute] SiteRoute route,
                                                                    DateTime pushTime,
                                                                    DateTime?errStartTime
                                                                    )
        {
            var response = new Response <Object>();

            try {
                var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1, a => a.Sequence).ToListAsync();

                var iidn = await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName);

                List <WebNews> news = null;
                Expression <Func <WebNews, bool> > predicate;
                if (errStartTime != null)   //如果中途断掉则根据断掉的时间节点重新写入
                {
                    predicate = c => c.SiteId == route.mark && c.IsEnable == 1 &&
                                (c.PushTime <= pushTime && c.PushTime > errStartTime);
                }
                else
                {
                    predicate = c => c.SiteId == route.mark && c.IsEnable == 1 &&
                                c.PushTime <= pushTime;
                }
                for (int pageIndex = 1; pageIndex <= 1; pageIndex++)
                {
                    news = await _IWebNewsRepository.Query(predicate)
                           .ToPager(pageIndex, 100).ToListAsync();

                    var docs = new List <WebNewsDoc>();
                    news.ForEach(x => {
                        var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName);
                        if (category != null)
                        {
                            docs.Add(GetWebNewsDoc(x));
                        }
                    });
                    if (docs.Count > 0)
                    {
                        try {
                            var flag = await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs);

                            response.Data    = docs.Count * pageIndex;//写入es
                            response.Message = docs.LastOrDefault().PushTime.ToString();
                            response.Code    = flag;
                        } catch (Exception ex) {
                            LogHelper.LogError("写入ES错误信息:{0}", ex.Message + ex.StackTrace);
                        }
                    }
                }
            } catch (Exception ex) {
                LogHelper.LogError("db读取错误信息:{0}", ex.Message + ex.StackTrace);
            }
            return(response.ToHttpResponse());
        }
예제 #3
0
        public Uri CreateUriForRoute(SiteRoute sr, UriSettings settings, IDictionary <string, string> parameters)
        {
            var requireSsl = false;

            if (sr is ContentPageRoute cpr)
            {
                requireSsl = cpr.RequireSsl;
            }

            var needsAuthorityChange = (sr.Authority != UriAuthorityFilter.Any && _context.Authority != sr.Authority);
            var needsSslChange       = !_context.IsSsl && requireSsl;

            if (settings.PreferUriKind != UriKinds.AbsoluteUri && !needsSslChange && !needsAuthorityChange)
            {
                if (settings.PreferUriKind == UriKinds.RelativeFromSiteRoot)
                {
                    return(sr.VirtualPath);
                }

                if (settings.PreferUriKind == UriKinds.RelativeFromCurrent)
                {
                    return(_context.AbsolutePath.MakeRelativeUri(sr.VirtualPath));
                }
            }


            var protocol = "http://";

            if (requireSsl)
            {
                protocol = "https://";
            }

            var authority = sr.Authority;

            if (sr.Authority == UriAuthorityFilter.Any)
            {
                authority = _context.Authority;
            }

            var uriBase = new Uri($"{protocol}{authority}{sr.VirtualPath}");
            var builder = new UriBuilder(uriBase);

            if (parameters != null && parameters.Count > 0)
            {
                builder.Query = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result;
            }

            return(builder.Uri);
        }
예제 #4
0
        public async Task <IActionResult> GetCategoriesAsync([FromHeader] String source,
                                                             [FromRoute] SiteRoute route)
        {
            var response = new Response <List <WebCategoryValue> >();

            try {
                var result = await this._IWebCategoryRedis.GetAsync(route.mark);

                if (result.Count > 0)
                {
                    response.Code = true;
                    response.Data = result;
                }
                else
                {
                    var entities = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1,
                                                                       a => a.Sequence)
                                   .Select(a => new WebCategoryValue()
                    {
                        CategoryId   = a.CategoryId,
                        ChannelId    = Convert.ToInt32(a.Remarks),
                        CategoryName = a.CategoryName,
                        ParentId     = a.ParentId,
                        Controller   = a.Controller,
                        Action       = a.Action,
                        Urls         = a.Urls,
                        Title        = a.Title,
                        Keywords     = a.Keywords,
                        Description  = a.Description
                    })
                                   .ToListAsync();

                    if (entities.Count > 0)
                    {
                        await _IWebCategoryRedis.AddAsync(route.mark, entities);

                        response.Code = true;
                        response.Data = entities;
                    }
                    else
                    {
                        return(NoContent());
                    }
                }
            }
            catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
        public bool TryResolveRoute(Guid pageId, out SiteRoute route)
        {
            route = null;

            foreach (var site in _siteRouteTables.Keys)
            {
                var success = _siteRouteTables[site].TryGetRoute(pageId, out route);
                if (success)
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #6
0
        public async Task <IActionResult> PostNewsDocLocalHostAsync([FromHeader] String source,
                                                                    [FromRoute] SiteRoute route)
        {
            var response = new Response <Object>();

            try {
                var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1,
                                                                     a => a.Sequence).ToListAsync();

                await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName);

                var lastNews = new WebNews();
                var current  = System.DateTime.Now;
                for (int pageIndex = 1; pageIndex <= 40; pageIndex++)
                {
                    var news = new List <WebNews>();

                    var express = Express.Begin <WebNews>(true);
                    express = express.And(a => a.SiteId == route.mark && a.IsEnable == 1 && a.PushTime <= current);
                    news    = await _IWebNewsRepository.Query(express)
                              .OrderByDescending(a => a.PushTime)
                              .ToPager(pageIndex, 30000)
                              .ToListAsync();

                    lastNews = news.LastOrDefault();
                    if (lastNews != null)
                    {
                        var docs = new List <WebNewsDoc>();
                        news.ForEach(x => {
                            var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName);
                            if (category != null)
                            {
                                docs.Add(GetWebNewsDoc(x));
                            }
                        });
                        if (docs.Count > 0)
                        {
                            await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs);
                        }
                    }
                }
                response.Code  = true;
                response.Other = null;
            } catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
예제 #7
0
        public async Task <IActionResult> GetWebSiteAsync(
            [FromHeader] String source,
            [FromRoute] SiteRoute route)
        {
            var response = new Response <WebSiteValue>();

            try {
                var entity = await _IWebSiteRedis.GetAsync(route.mark);

                if (entity != null)
                {
                    response.Code = true;
                    response.Data = entity;
                }
                else
                {
                    var result = await _IWebSiteRepository.Query(a => a.SiteId == route.mark)
                                 .Select(a => new WebSiteValue()
                    {
                        SiteId      = a.SiteId,
                        SiteName    = a.SiteName,
                        SiteUrls    = a.SiteUrls,
                        LogoUrls    = a.LogoUrls,
                        Title       = a.Title,
                        Keywords    = a.Keywords,
                        Description = a.Description
                    })
                                 .SingleOrDefaultAsync();

                    if (result != null)
                    {
                        await _IWebSiteRedis.AddAsync(route.mark, result);

                        response.Code = true;
                        response.Data = result;
                    }
                    else
                    {
                        return(NotFound("数据不存在或未定义!"));
                    }
                }
            }
            catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
예제 #8
0
        public async Task <IActionResult> PostNewsDocAsync([FromHeader] String source,
                                                           [FromRoute] SiteRoute route,
                                                           string newsId = "10000000")
        {
            var response = new Response <Object>();

            try {
                var categories = await _IWebCategoryRepository.Query(a => a.SiteId == route.mark && a.IsEnable == 1,
                                                                     a => a.Sequence).ToListAsync();

                var iidn = await _IWebNewsElastic.AddIndexAsync(_IWebNewsElastic.IndexName);

                for (int pageIndex = 1; pageIndex <= 20; pageIndex++)
                {
                    var news = new List <WebNews>();
                    news = _IMySqlRepository.GetList(1, pageIndex, 1000, Convert.ToInt32(newsId));
                    var lastNews = news.LastOrDefault();
                    if (lastNews != null)
                    {
                        newsId = news.LastOrDefault().NewsId;
                        var docs      = new List <WebNewsDoc>();
                        var newsDatas = new List <WebNews>();
                        news.ForEach(x => {
                            var category = categories.SingleOrDefault(a => a.CategoryName == x.CategoryName);
                            if (category != null)
                            {
                                newsDatas.Add(SetWebNews(x, category));
                                docs.Add(GetWebNewsDoc(x));
                            }
                        });
                        if (newsDatas.Count > 0)
                        {
                            await _IWebNewsRepository.BatchAddAsync(newsDatas);//写入数据库
                        }
                        //if (docs.Count > 0)
                        //    response.Other += (await _IWebNewsElastic.BatchAddDocumentAsync(_IWebNewsElastic.IndexName, docs)).ToString() + "a|" + docs.Count;//写入es
                    }
                }
                response.Code  = true;
                response.Other = null;
            } catch (Exception ex) {
                LogHelper.LogError("错误信息:{0}", ex.Message + ex.StackTrace);
            }
            response.Data = newsId;
            return(response.ToHttpResponse());
        }
예제 #9
0
        public async Task <IActionResult> GetSiteAccessAsync(
            [FromHeader] String source,
            [FromRoute] SiteRoute route,
            [FromQuery] SiteAccessGet item)
        {
            var response = new Response <Object>();

            try {
                // 渠道访问
                if (!string.IsNullOrEmpty(item.From))
                {
                    await _IWebChannelRedis.AddAccessCount(route.mark, item.From);
                }
                // 站点访问
                await _IWebSiteRedis.AddAccessCount(route.mark);

                response.Code = true;
            }
            catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
예제 #10
0
        private string CreateUrl(SiteRoute transferRoute, IDictionary <string, string> parameters)
        {
            var uriBuilder = new CmsUriBuilder(httpRequest.ToUriBuilderContext());

            return(uriBuilder.CreateUriForRoute(transferRoute, UriSettings.Default, parameters).ToString());
        }
예제 #11
0
        public async Task <IActionResult> GetNewsHotAsync([FromHeader] String source,
                                                          [FromRoute] SiteRoute route,
                                                          [FromQuery] PagerElastic item)
        {
            var response = new Response <List <NewsListResponse> >();

            try {
                var request = new SearchRequest <WebNewsDoc>(_IWebNewsElastic.IndexName)
                {
                    TrackTotalHits = true,
                    Query          = new BoolQuery()
                    {
                        Must = new QueryContainer[] {
                            new TermQuery()
                            {
                                Field = "siteId",
                                Value = route.mark
                            } &&
                            new DateRangeQuery()
                            {
                                Field = "pushTime",
                                GreaterThanOrEqualTo = System.DateTime.Now.ToString("yyyy-MM-dd 00:00:00"),
                                LessThanOrEqualTo    = System.DateTime.Now.ToString("yyyy-MM-dd 23:59:59"),
                                Format = "yyyy-MM-dd HH:mm:ss"
                            }
                        },
                        MustNot = new QueryContainer[] {
                            new TermQuery()
                            {
                                Field = "contentType",
                                Value = 2
                            }
                        }
                    },
                    Source = new Union <bool, ISourceFilter>(new SourceFilter {
                        Excludes = new[] { "contents" }
                    }),
                    Sort = new List <ISort>()
                    {
                        new FieldSort()
                        {
                            Field = "accessCount", Order = SortOrder.Descending
                        }
                    },
                    Size = item.PageSize
                };
                if (item.PageIndex != null)
                {
                    request.From        = 0;
                    request.SearchAfter = item.PageIndex.Split(",");
                }
                var result = await this._IWebNewsElastic.Client
                             .SearchAsync <NewsListResponse>(request);

                if (result.ApiCall.Success && result.ApiCall.HttpStatusCode == 200)
                {
                    if (result.Documents.Count > 0)
                    {
                        response.Code  = true;
                        response.Data  = result.Documents.ToList();
                        response.Other = string.Join(',', result.Hits.LastOrDefault().Sorts);
                    }
                    else
                    {
                        return(NoContent());
                    }
                }
                else
                {
                    return(NoContent());
                }
            }
            catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
예제 #12
0
        public async Task <IActionResult> GetNewsSearchAsync([FromHeader] String source,
                                                             [FromRoute] SiteRoute route,
                                                             [FromQuery] NewsTitleSearchGet item)
        {
            var response = new Response <Object>();

            try {
                var headerSource = source.ToObject <HeaderSource>();
                item.ShowType = item.ShowType == 0 ? 1 : item.ShowType;
                // 针对安卓版本判断
                var lastVers = new Version("1.0.4"); // 最后版本
                //var newVers = new Version(headerSource.SystemVers); // 最新版本

                string[] newsSearchAfter  = null; // 新闻分页
                string[] videoSearchAfter = null; // 视频分页

                var mustNot = new QueryContainer[] {
                    new MatchPhraseQuery()
                    {
                        Field = "newsTitle",
                        Query = item.Title
                    }
                };
                if (headerSource.Device == "android" && (headerSource.SystemVers == "5" || headerSource.SystemVers == "1"))
                {
                    if (string.IsNullOrEmpty(item.NewsId))
                    {
                        mustNot = new QueryContainer[] {
                            new TermQuery()
                            {
                                Field = "contentType",
                                Value = 2
                            }
                        };
                    }
                    else
                    {
                        mustNot = new QueryContainer[] {
                            new TermQuery()
                            {
                                Field = "contentType",
                                Value = 2
                            } &&
                            new TermQuery()
                            {
                                Field = "newsId",
                                Value = item.NewsId
                            }
                        };
                    }
                }
                else if (!string.IsNullOrEmpty(item.NewsId))
                {
                    mustNot = new QueryContainer[] {
                        new TermQuery()
                        {
                            Field = "newsId",
                            Value = item.NewsId
                        }
                    };
                }

                // 页
                int?from = null;
                if (!string.IsNullOrEmpty(item.PageIndex))
                {
                    from = 0;
                    var after = item.PageIndex.Split("|");
                    if (after.Length > 1)
                    {
                        newsSearchAfter  = string.IsNullOrEmpty(after[0]) ? null : after[0].Split(',');
                        videoSearchAfter = string.IsNullOrEmpty(after[1]) ? null : after[1].Split(',');
                    }
                    else if (item.ShowType == 1)
                    {
                        newsSearchAfter = item.PageIndex.Split(",");
                    }
                    else if (item.ShowType == 2)
                    {
                        videoSearchAfter = item.PageIndex.Split(",");
                    }
                }
                else
                {
                    from = null;
                }
                Func <int, Func <SearchDescriptor <NewsListResponse>, ISearchRequest> > searchSelector = (x) => {
                    string[] searchAfter = null;
                    var      pageSize    = item.PageSize;
                    if (x == 1)
                    {
                        searchAfter = newsSearchAfter;
                    }
                    else if (x == 2 && item.ShowType == 3)
                    {
                        searchAfter = videoSearchAfter;
                        pageSize    = pageSize / 2;
                    }
                    else if (x == 2)
                    {
                        searchAfter = videoSearchAfter;
                    }
                    Func <SearchDescriptor <NewsListResponse>, ISearchRequest> func = a => a
                                                                                      .Index(_IWebNewsElastic.IndexName)
                                                                                      .TrackTotalHits(true)
                                                                                      .Query(c => c
                                                                                             .Bool(d => d
                                                                                                   .Must(e => e
                                                                                                         .Term("siteId", route.mark) && e
                                                                                                         .Term(f => f.ContentType, x) && e
                                                                                                         .Match(f => f.Field(g => g.NewsTitle).Query(item.Title))
                                                                                                         )
                                                                                                   .MustNot(mustNot)))
                                                                                      .Source(c => c.Excludes(d => d.Field("contents")))
                                                                                      .Sort(c => c.Field(d => d.PushTime, SortOrder.Descending))
                                                                                      .Highlight(c => c.PreTags("<em style='color:#f73131'>")
                                                                                                 .PostTags("</em>")
                                                                                                 .Fields(f => f
                                                                                                         .Field("newsTitle")
                                                                                                         ))
                                                                                      .Size(pageSize)
                                                                                      .From(from)
                                                                                      .SearchAfter(searchAfter);
                    return(func);
                };

                MultiSearchResponse result;
                if (item.ShowType == 3)
                {
                    // 显示文章和视频
                    result = await _IWebNewsElastic.Client.MultiSearchAsync(null, a => a.Search <NewsListResponse>("news", searchSelector(1))
                                                                            .Search <NewsListResponse>("videos", searchSelector(2)));
                }
                else
                {
                    result = await _IWebNewsElastic.Client.MultiSearchAsync(null, a => a.Search <NewsListResponse>("news", searchSelector(item.ShowType)));
                }
                if (result.ApiCall.Success && result.ApiCall.HttpStatusCode == 200)
                {
                    var news   = result.GetResponse <NewsListResponse>("news");
                    var videos = result.GetResponse <NewsListResponse>("videos");
                    if (news.Hits.Count > 0)
                    {
                        response.Code = true;
                        var data   = new List <Dictionary <string, Object> >();
                        var entity = new Dictionary <string, Object>();

                        if (item.ShowType == 3)
                        {
                            if (videos.Hits.Count > 0)
                            {
                                var videosHits = videos.Hits.ToList();
                                for (int i = 0; i < news.Hits.Count; i++)
                                {
                                    entity = new Dictionary <string, object>();
                                    var newsHit = news.Hits.ElementAt(i);
                                    if (i + 1 > news.Hits.Count)
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        entity.Add("highlight", newsHit.Highlight.Values.ElementAt(0).First());
                                        entity.Add("entity", newsHit.Source);
                                        data.Add(entity);

                                        if ((i + 1) % 2 == 0 && i > 0)
                                        {
                                            var videosHit = videosHits.FirstOrDefault();
                                            if (videosHit != null)
                                            {
                                                entity = new Dictionary <string, object>();
                                                if (videosHits.Count > 0)
                                                {
                                                    videosHits.Remove(videosHit);
                                                }
                                                entity.Add("highlight", videosHit.Highlight.Values.ElementAt(0).First());
                                                entity.Add("entity", videosHit.Source);
                                                data.Add(entity);
                                            }
                                        }
                                    }
                                }
                                videosHits.ForEach(x => {
                                    var videosHit = videosHits.FirstOrDefault();
                                    entity        = new Dictionary <string, Object>();
                                    entity.Add("highlight", videosHit.Highlight.Values.ElementAt(0).First());
                                    entity.Add("entity", videosHit.Source);
                                    data.Add(entity);
                                });
                                var ns = string.Join(',', news.Hits.LastOrDefault().Sorts);
                                var vs = string.Join(',', videos.Hits.LastOrDefault().Sorts);
                                response.Data  = data;
                                response.Other = $"{ns}|{vs}";
                            }
                            else
                            {
                                foreach (var hit in news.Hits)
                                {
                                    entity = new Dictionary <string, Object>();
                                    entity.Add("highlight", hit.Highlight.Values.ElementAt(0).First());
                                    entity.Add("entity", hit.Source);
                                    data.Add(entity);
                                }
                                response.Data  = data;
                                response.Other = string.Join(',', news.Hits.LastOrDefault().Sorts);
                            }
                        }
                        else
                        {
                            foreach (var hit in news.Hits)
                            {
                                entity = new Dictionary <string, Object>();
                                entity.Add("highlight", hit.Highlight.Values.ElementAt(0).First());
                                entity.Add("entity", hit.Source);
                                data.Add(entity);
                            }
                            response.Data  = data;
                            response.Other = string.Join(',', news.Hits.LastOrDefault().Sorts);
                        }
                    }
                    else
                    {
                        return(NoContent());
                    }
                }
                else
                {
                    return(NoContent());
                }
            }
            catch (Exception ex) {
                response.SetError(ex, this._ILogger);
            }
            return(response.ToHttpResponse());
        }
예제 #13
0
        public Task Upgrade(IVersionContext versionContext)
        {
            var rootTaliSiteRoute = new SiteRoute
            {
                Id        = "5f02cb57e63b2b3634d51373",
                ElemPath  = "/",
                PageId    = "5f02cb57e63b2b3634d51375",
                LocaleId  = "default",
                ParentId  = "5f02cb57e63b2b3634d51373",
                RoutePath = "/",
                SiteId    = Constants.MAIN_SITE_ID
            };

            var blogsListSiteRoute = new SiteRoute
            {
                Id          = "5f02cb57e63b2b3634d51374",
                ElemPath    = "blogs",
                PageId      = "5f0aa3731558bf76447b18d0",
                LocaleId    = "default",
                ParentId    = "5f02cb57e63b2b3634d51373",
                RoutePath   = "/blogs",
                ResolveMaps = new List <ResolveDataMap>
                {
                    new ResolveDataMap
                    {
                        Key      = "blogs",
                        Inputs   = "",
                        Resolver = "blogs"
                    }
                },
                SiteId = Constants.MAIN_SITE_ID
            };

            var blogCateSiteRoute = new SiteRoute
            {
                Id          = "5f0ab7065063a011e8fc2f85",
                ElemPath    = "*",
                RoutePath   = "/blogs/*",
                WildcardKey = "blog",
                LocaleId    = "default",
                PageId      = "5f0aa3731558bf76447b18d1",
                ParentId    = "5f02cb57e63b2b3634d51374",
                ResolveMaps = new List <ResolveDataMap>
                {
                    new ResolveDataMap
                    {
                        Key      = "blog",
                        Inputs   = "blog",
                        Resolver = "blog"
                    },
                    new ResolveDataMap
                    {
                        Key      = "posts",
                        Resolver = "postsOfBlog"
                    }
                },
                SiteId = Constants.MAIN_SITE_ID
            };

            var postsEmptySiteRoute = new SiteRoute
            {
                Id        = "5f204bc8d5ac7c6bd0dde43e",
                ElemPath  = "posts",
                RoutePath = "/posts",
                LocaleId  = "default",
                ParentId  = "5f02cb57e63b2b3634d51373",
                SiteId    = Constants.MAIN_SITE_ID
            };

            var blogPostSiteRoute = new SiteRoute
            {
                Id              = "5f0ab7065063a011e8fc2f86",
                ElemPath        = "*",
                RoutePath       = "/posts/*",
                WildcardKey     = "blogPost",
                LocaleId        = "default",
                PageId          = "5f0aa3731558bf76447b18d3",
                ParentId        = "5f204bc8d5ac7c6bd0dde43e",
                ResponseCaching = new ResponseCaching
                {
                    Enable       = true,
                    CacheControl = "public",
                    Duration     = 10
                },
                ResolveMaps = new List <ResolveDataMap>
                {
                    new ResolveDataMap
                    {
                        Key      = "blogPost",
                        Inputs   = "blogPost",
                        Resolver = "blogPost"
                    }
                },
                SiteId = Constants.MAIN_SITE_ID
            };

            var blogTagsSiteRoute = new SiteRoute
            {
                Id          = "5f1ef6fce9ce36726865ebc2",
                ElemPath    = "blog-tagged",
                RoutePath   = "/blog-tagged",
                LocaleId    = "default",
                PageId      = "5f1ef6fce9ce36726865ebc3",
                ParentId    = "5f02cb57e63b2b3634d51373",
                ResolveMaps = new List <ResolveDataMap>
                {
                    new ResolveDataMap
                    {
                        Key                 = "posts",
                        Resolver            = "postsOfTag",
                        EnableInMemoryCache = true,
                        CacheDuration       = 60
                    }
                },
                SiteId = Constants.MAIN_SITE_ID
            };

            versionContext.InsertData(rootTaliSiteRoute);
            versionContext.InsertData(blogsListSiteRoute);
            versionContext.InsertData(blogCateSiteRoute);
            versionContext.InsertData(blogPostSiteRoute);
            versionContext.InsertData(blogTagsSiteRoute);
            versionContext.InsertData(postsEmptySiteRoute);

            return(Task.CompletedTask);
        }