示例#1
0
        public ActionResult Index(int?page)
        {
            const string assetsPrefix    = "finance.index";
            const int    articlesPerPage = 6;

            var pageNum = page ?? 1;
            // *** should be using skip/take collection symantic here ...all the way through to the service ***
            var startRow = articlesPerPage * (pageNum - 1) + 1;

            var metadata    = MetadataService.GetMetadataForPage(HttpContext);
            var financeTask = VehicleContentService.GetArticlesByTopicAsync("finance", startRow, articlesPerPage);

            financeTask.Wait();
            var financeArticles = financeTask.Result;

            var totalNumOfPages = financeArticles.TotalRecords > articlesPerPage
        ? (int)Math.Ceiling(((decimal)financeArticles.TotalRecords / articlesPerPage))
        : 1;

            var viewModel = new IndexViewModel(assetsPrefix, metadata)
            {
                InlineHeadScript = AssetService.GetInlineHeadScript(),
                InlineHeadStyles = AssetService.GetInlineHeadStyles(assetsPrefix),
                FinanceArticles  = financeArticles.Articles,
                Paginator        = new Paginator("/finance/", totalNumOfPages, pageNum)
            };

            return(View("Index", viewModel));
        }
示例#2
0
        public ActionResult ArticlePage(int contentId, int page)
        {
            var articlePageTask = VehicleContentService.GetArticlePageAsync(contentId, page);

            articlePageTask.Wait();

            var articlePage = articlePageTask.Result;

            return(null);
        }
示例#3
0
        public ActionResult BuyingGuidesByCategory(string categorySeoName)
        {
            const string assetsPrefix = "buyingguides.articlecategory";

            var metadata = MetadataService.GetMetadataForPage(HttpContext);
            var categoriesSectionTask = VehicleContentService.GetArticlesByCategoryAttributeSeoNameAsync(categorySeoName);

            categoriesSectionTask.Wait();
            var categoriesSectionArticles = categoriesSectionTask.Result;

            var viewModel = new CategoryViewModel(assetsPrefix, metadata)
            {
                InlineHeadScript          = AssetService.GetInlineHeadScript(),
                InlineHeadStyles          = AssetService.GetInlineHeadStyles(assetsPrefix),
                CategoriesSectionArticles = categoriesSectionArticles.Articles,
                VehicleCategoryName       = categoriesSectionArticles.Category
            };

            return(View("ArticleCategory", viewModel));
        }
示例#4
0
        public ActionResult Index()
        {
            const string assetsPrefix = "site.index";

            const int startRow = 1;
            const int take     = 9;

            var metadata     = MetadataService.GetMetadataForPage(HttpContext);
            var buyingGuides = VehicleContentService.GetArticlesByTopic("buying guides", startRow, take);

            var viewModel = new IndexViewModel(assetsPrefix, metadata)
            {
                InlineHeadScript = AssetService.GetInlineHeadScript(),
                InlineHeadStyles = AssetService.GetInlineHeadStyles(assetsPrefix),
                TrackMeta        = new TrackMeta(metadata),
                BuyingGuides     = buyingGuides.Articles
            };

            return(View("Index", viewModel));
        }
示例#5
0
        public ActionResult Index(int?page)
        {
            const string assetsPrefix    = "buyingguides.index";
            const int    articlesPerPage = 6;

            var metadata = MetadataService.GetMetadataForPage(HttpContext);
            var pageNum  = page ?? 1;
            // *** should be using skip/take collection semantic here ...all the way through to the service ***
            var startRow = articlesPerPage * (pageNum - 1) + 1;

            var financeTask = VehicleContentService.GetArticlesByTopicAsync("finance", startRow, articlesPerPage);

            var mostRecentGroupTask = VehicleContentService.GetArticlesGroupMostRecentAsync();

            var categoriesTask = VehicleContentService.GetArticlesByVehiclesCategoryAsync();

            mostRecentGroupTask.Wait();
            var mostRecentGroup = mostRecentGroupTask.Result;

            financeTask.Wait();
            var financeArticles = financeTask.Result;

            categoriesTask.Wait();
            var categoriesArticles = categoriesTask.Result;

            var viewModel = new IndexViewModel(assetsPrefix, metadata)
            {
                InlineHeadScript   = AssetService.GetInlineHeadScript(),
                InlineHeadStyles   = AssetService.GetInlineHeadStyles(assetsPrefix),
                TrackMeta          = new TrackMeta(metadata),
                MostRecentGroup    = mostRecentGroup.Articles,
                FinanceArticles    = financeArticles.Articles,
                CategoriesArticles = categoriesArticles.Articles,
            };

            return(View("Index", viewModel));
        }
示例#6
0
        public ActionResult Article(string title, int contentId)
        {
            const string assetsPrefix = "finance.article";
            const int    numAdUnits   = 4;

            var metadata    = MetadataService.GetMetadataForPage(HttpContext);
            var articleTask = VehicleContentService.GetArticleByIdAsync(contentId);

            articleTask.Wait();

            var article = articleTask.Result;

            var makeTranslator     = String.Empty;
            var modelTranslator    = String.Empty;
            var yearTranslator     = String.Empty;
            var categoryTranslator = String.Empty;

            if (article.Make.IsNotNullOrEmpty())
            {
                makeTranslator = UriTokenTranslators.GetMakeTranslatorByName(article.Make).Name;
            }

            if (article.Model.IsNotNullOrEmpty())
            {
                modelTranslator = UriTokenTranslators.GetModelTranslatorByName(article.Model).Name;
            }

            if (article.Year.ToString().IsNotNullOrEmpty())
            {
                yearTranslator = article.Year.ToString();
            }

            if (article.VehicleCategory.IsNotNullOrEmpty())
            {
                var tempcategoryTranslator = UriTokenTranslators.GetCategoryTranslatorByName(article.VehicleCategory);

                if (tempcategoryTranslator != null)
                {
                    categoryTranslator = tempcategoryTranslator.Name;
                }
            }

            var currentUrl = HttpContext.Request.Url.AbsoluteUri;

            // throws a 404 exception if the current URL doesn't match the URL of the article.
            if (article.Url.IsNullOrEmpty() || currentUrl.IndexOf(article.Url) == -1)
            {
                throw new HttpException(404, "HTTP/1.1 404 Not Found");
            }

            ICollection <ArticleAd>          ads             = new Collection <ArticleAd>();
            IList <ICollection <ArticleAd> > articleAds      = new List <ICollection <ArticleAd> >();
            IList <TrackerVehicle>           articleVehicles = new List <TrackerVehicle>();

            TrackerVehicle vehicle;

            // set article page ads
            foreach (var articlePage in article.ArticlePages)
            {
                ads = articlePage.AdUnits;

                articleAds.Add(ads);

                if (articlePage.Make != null)
                {
                    vehicle = new TrackerVehicle
                    {
                        Make       = articlePage.Make,
                        Model      = articlePage.Model,
                        SuperModel = articlePage.Model,
                        Year       = articlePage.Year
                    };
                }
                else
                {
                    vehicle = new TrackerVehicle
                    {
                        Make       = makeTranslator,
                        Model      = modelTranslator,
                        SuperModel = modelTranslator,
                        Year       = Int32.Parse(yearTranslator)
                    };
                }

                articleVehicles.Add(vehicle);
            }

            // set article page ads for endcap

            ICollection <ArticleAd> adsEndcap = new Collection <ArticleAd>();

            for (var adUnit = 1; adUnit <= numAdUnits; adUnit++)
            {
                var articleAdUnit = article.AdUnits.FirstOrDefault(x => x.AdUnitId == adUnit);

                adsEndcap.Add(new ArticleAd
                {
                    AdMake        = articleAdUnit.AdMake ?? String.Empty,
                    AdModel       = articleAdUnit.AdModel ?? String.Empty,
                    AdVehicleYear = articleAdUnit.AdVehicleYear,
                    AdCategory    = articleAdUnit.AdCategory ?? String.Empty,
                    AdUnitId      = articleAdUnit.AdUnitId
                });
            }

            articleAds.Add(adsEndcap);

            var articleVehiclesJsonStr = JsonConvert.SerializeObject(articleVehicles);
            var articleAdsJsonStr      = JsonConvert.SerializeObject(articleAds);

            var viewModel = new ArticleViewModel(assetsPrefix, metadata)
            {
                InlineHeadScript = AssetService.GetInlineHeadScript(),
                InlineHeadStyles = AssetService.GetInlineHeadStyles(assetsPrefix),
                AdvertMeta       = new AdvertMeta(new
                {
                    ads = articleAds[0]
                })
                ,
                PageMeta = new PageMeta
                {
                    Title       = article.Title,
                    Canonical   = "http://www.car.com" + article.Url,
                    Keywords    = article.MetaKeywords,
                    Description = article.MetaDescription
                },
                TrackMeta = new TrackMeta
                {
                    Make       = makeTranslator,
                    SuperModel = modelTranslator,
                    Year       = yearTranslator,
                    Category   = categoryTranslator
                },
                OpenGraphMeta = new OpenGraphMeta
                {
                    Title       = article.Title,
                    Description = article.MetaDescription,
                    Type        = "article",
                    Url         = "http://www.car.com" + article.Url,
                    Images      = article.ArticlePages.Select(x => x.PageImage).Where(x => x.IsNotNullOrEmpty()).ToList()
                },
                Article = article
            };

            viewModel.RegisterPageJson(articleVehiclesJsonStr, "ABT.pageJson.articleVehicles");
            viewModel.RegisterPageJson(articleAdsJsonStr, "ABT.pageJson.articleAds");

            ArticleGalleryViewModel articleGallery = new ArticleGalleryViewModel();

            {
                articleGallery.Article = viewModel.Article;
            }

            viewModel.ArticleGallery = articleGallery;

            return(View("Article", viewModel));
        }
示例#7
0
        private static void CacheAllSiteMapData()
        {
            try
            {
                var pagesBySectionDict = new Dictionary <string, IEnumerable <Page> >();
                var lastModified       = DateTime.Now.ToString("yyyy-MM-dd");

                #region **! Here, we are caching all the sitemap sections for the sitemap-index page.

                _sections = SectionNames
                            .Select(sectionName => new Section
                {
                    DomainAndPath = String.Format("{0}/sitemap/{1}", Host, sectionName),
                    LastModified  = lastModified
                });

                #endregion


                #region **! Here, we are caching all the pages for each sitemap section.

                #region Cache all pages for the *general* sitemap section.
                const string generalSection = "general";

                pagesBySectionDict.Add(generalSection, new List <Page>
                {
                    new Page
                    {
                        DomainAndPath   = Host,
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Weekly,
                        Priority        = Priority.Top
                    },
                    new Page
                    {
                        DomainAndPath   = String.Format("{0}/{1}", Host, "cars-for-sale"),
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Weekly,
                        Priority        = Priority.Medium
                    }
                });

                #endregion


                #region Cache all pages for the *car-research* sitemap section.

                // NOTE: We are only going after all the *NEW* cars in this section.
                const string researchSection = "car-research";

                // landing page
                var researchPages = new List <Page>
                {
                    new Page
                    {
                        DomainAndPath   = String.Format("{0}/{1}", Host, researchSection),
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Weekly,
                        Priority        = Priority.Top
                    }
                };

                // make pages
                var researchMakes = UriTokenTranslators.GetAllMakeTranslators()
                                    .Where(make => make.IsActive)
                                    .Select(make => new Dto.CarResearchUrl
                {
                    Make = make.SeoName
                }).ToList().OrderBy(s => s.Make);

                researchPages.AddRange(researchMakes
                                       .Select(carResearchUrl => new Page
                {
                    DomainAndPath   = String.Format("{0}/{1}", Host, carResearchUrl.Make),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Medium
                }).ToList());


                // make/super-model pages
                var researchMakeSuperModels = VehicleSpecService.GetAllNewSuperModels()
                                              .Select(superModel => new Dto.CarResearchUrl
                {
                    Make       = UriTokenTranslators.GetMakeTranslatorByName(superModel.Make).SeoName,
                    SuperModel = superModel.SeoName
                }).ToList().OrderBy(s => s.Make).ThenBy(s => s.SuperModel);

                researchPages.AddRange(researchMakeSuperModels
                                       .Select(carResearchUrl => new Page
                {
                    DomainAndPath   = String.Format("{0}/{1}/{2}", Host, carResearchUrl.Make, carResearchUrl.SuperModel),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Medium
                }).ToList());


                // make/super-model/year pages
                var makeSuperModelYears =
                    (from superModel in VehicleSpecService.GetAllNewSuperModels()
                     from year in superModel.Years
                     where year.IsNew
                     select new Dto.CarResearchUrl
                {
                    Make = UriTokenTranslators.GetMakeTranslatorByName(superModel.Make).SeoName,
                    SuperModel = superModel.SeoName,
                    Year = year.Number
                }).ToList().OrderBy(s => s.Make).ThenBy(s => s.SuperModel).ThenBy(s => s.Year);

                researchPages.AddRange(makeSuperModelYears
                                       .Select(carResearchUrl => new Page
                {
                    DomainAndPath =
                        String.Format("{0}/{1}/{2}/{3}",
                                      Host, carResearchUrl.Make, carResearchUrl.SuperModel, carResearchUrl.Year),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Medium
                }).ToList());


                // make/super-model/year/trim pages
                var makeSuperModelYearTrims =
                    (from msmy in makeSuperModelYears
                     from trim in VehicleSpecService.GetTrimsByMakeBySuperModelByYear(msmy.Make, msmy.SuperModel, msmy.Year)
                     select new Dto.CarResearchUrl
                {
                    Make = msmy.Make,
                    SuperModel = msmy.SuperModel,
                    Year = msmy.Year,
                    Trim = trim.CanonicalSeoName
                }).ToList().OrderBy(s => s.Make).ThenBy(s => s.SuperModel).ThenBy(s => s.Trim).ThenBy(s => s.Year);

                var makeSuperModelYearTrimsDistinct = makeSuperModelYearTrims.GroupBy(x => x.Trim).Select(g => g.First());

                researchPages.AddRange(makeSuperModelYearTrimsDistinct
                                       .Select(carResearchUrl => new Page
                {
                    DomainAndPath =
                        String.Format("{0}/{1}/{2}/{3}/{4}",
                                      Host, carResearchUrl.Make, carResearchUrl.SuperModel, carResearchUrl.Year, carResearchUrl.Trim),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Medium
                }).ToList());


                // make/super-model/year/trim/section pages
                var trimSectionNames = new List <string>
                {
                    "specifications",
                    "color",
                    "warranty",
                    "pictures-videos",
                    "incentives",
                    "safety"
                };

                var makeSuperModelYearTrimSections =
                    (from msmyt in makeSuperModelYearTrimsDistinct
                     from sectionName in trimSectionNames
                     select new Dto.CarResearchUrl
                {
                    Make = msmyt.Make,
                    SuperModel = msmyt.SuperModel,
                    Year = msmyt.Year,
                    Trim = msmyt.Trim,
                    Section = sectionName
                }).ToList().OrderBy(s => s.Make).ThenBy(s => s.SuperModel).ThenBy(s => s.Trim).ThenBy(s => s.Year).ThenBy(s => s.Section);

                researchPages.AddRange(makeSuperModelYearTrimSections
                                       .Select(carResearchUrl => new Page
                {
                    DomainAndPath =
                        String.Format("{0}/{1}/{2}/{3}/{4}/{5}",
                                      Host, carResearchUrl.Make, carResearchUrl.SuperModel, carResearchUrl.Year, carResearchUrl.Trim, carResearchUrl.Section),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Low
                }).ToList());


                // Add them all here!
                pagesBySectionDict.Add(researchSection, researchPages);

                #endregion


                #region Cache all pages for the *buying-tools* sitemap section.
                const string toolsSection = "buying-tools";

                var toolNames = new List <string>
                {
                    "tools/car-comparison",
                    "tools/calculators",
                    "tools/calculators/payment-calculator",
                    "tools/calculators/affordability-calculator",
                    "tools/calculators/fuel-savings-calculator",
                    "tools/calculators/lease-vs-buy-calculator",
                    "tools/calculators/early-payoff-calculator",
                    "tools/calculators/rebate-vs-financing-calculator",
                    "tools/used-car-values"
                };

                var toolPages = new List <Page>
                {
                    new Page
                    {
                        DomainAndPath   = String.Format("{0}/{1}", Host, "tools"),
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Monthly,
                        Priority        = Priority.Top
                    }
                };

                toolPages.AddRange(toolNames
                                   .Select(toolName => new Page
                {
                    DomainAndPath   = String.Format("{0}/{1}", Host, toolName),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Monthly,
                    Priority        = Priority.Medium
                }));


                // Add them all here!
                pagesBySectionDict.Add(toolsSection, toolPages);

                #endregion


                #region Cache all pages for the *content* sitemap section.

                const string contentSection = "content";

                var contentPages = new List <Page>
                {
                    new Page
                    {
                        DomainAndPath   = String.Format("{0}/{1}", Host, "buying-guides"),
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Weekly,
                        Priority        = Priority.Top
                    },
                    new Page
                    {
                        DomainAndPath   = String.Format("{0}/{1}", Host, "finance"),
                        LastModified    = lastModified,
                        ChangeFrequency = ChangeFrequency.Weekly,
                        Priority        = Priority.Medium
                    }
                };

                // article urls
                var articleUrls = VehicleContentService.GetAllArticleUrlsForSitemap();

                contentPages.AddRange(articleUrls
                                      .Select(articleUrl => new Page
                {
                    DomainAndPath   = String.Format("{0}{1}", Host, articleUrl.TrimEnd(new [] { '/' })),
                    LastModified    = lastModified,
                    ChangeFrequency = ChangeFrequency.Weekly,
                    Priority        = Priority.Low
                }).ToList());

                pagesBySectionDict.Add(contentSection, contentPages);

                #endregion

                lock (Mutex)
                {
                    _pagesBySectionDict = pagesBySectionDict;
                }

                #endregion
            }
            catch (Exception ex)
            {
                Log.Fatal(String.Format(
                              "The SitemapService Failed during the caching process. It's likely an SeoName problem exists in the data./r/n{0}",
                              ex.Message));
            }
        }