using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.UI; using DR.FV2016.Service.Interfaces; using DR.FV2016.Web.Models.Sitemap; using Newtonsoft.Json; namespace DR.FV2016.Web.Controllers { public class SitemapController : Controller { private readonly ICompositeCandidateService _compositeCandidateService; private readonly RouteCollection _routes; private readonly DateTime _createdDate; private readonly string _virtualPath; public SitemapController(ICompositeCandidateService compositeCandidateService) { _compositeCandidateService = compositeCandidateService; _routes = RouteTable.Routes; //As we don't have a (proper) creation dates for our pages we need to fake one _createdDate = new DateTime(2010, 1, 1); _virtualPath = HttpRuntime.AppDomainAppVirtualPath; } // GET: Sitemap [OutputCache(Location = OutputCacheLocation.Downstream, Duration = 600)] public ActionResult Index(int page, int size, DateTime? startdate, DateTime? endDate) { var offset = (page - 1) * size; if (!startdate.HasValue) startdate = DateTime.MinValue; if (!endDate.HasValue) endDate = DateTime.MaxValue; var pages = MainPages().ToList(); //Only add candiate pages if necessary if (pages.Count() < (offset + size)) pages.AddRange(CandidateProfiles(startdate.Value, endDate.Value)); pages = pages.Skip(offset).Take(size).ToList(); return Content(JsonConvert.SerializeObject(pages), "application/json", Encoding.UTF8); } private IEnumerable MainPages() { var mainPages = new List(); //Forside mainPages.Add(new SitemapItem { Name = "FV forside | Valg 2015 | DR", Url = string.Format("{0}", _virtualPath), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Live side mainPages.Add(new SitemapItem { Name = "Live | Valg 2015 | DR", Url = string.Format("{0}/live", _virtualPath), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Kandidat testen mainPages.Add(new SitemapItem { Name = "Kandidat-testen | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Match"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Se din stemmeseddel mainPages.Add(new SitemapItem { Name = "Se din stemmeseddel | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Se din stemmeseddel"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Min regering mainPages.Add(new SitemapItem { Name = "Min regering | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Min-regering"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Meningsmaalinger mainPages.Add(new SitemapItem { Name = "Meningsmålinger | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Meningsmaaling"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Vælgervandringer mainPages.Add(new SitemapItem { Name = "Vælgervandringer | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Vaelgervandringer"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Resultattilmelding mainPages.Add(new SitemapItem { Name = "Resultattilmelding | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["ResultNotification"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); //Plakatgenerator mainPages.Add(new SitemapItem { Name = "Plakatgenerator | Valg 2015 | DR", Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Plakatgenerator"])).Url), Created = _createdDate.ToString("o"), Modified = DateTime.Now.ToString("o") }); return mainPages; } private IEnumerable CandidateProfiles(DateTime startDate, DateTime endDate) { if (endDate < _createdDate) return new List(); var candidates = _compositeCandidateService.GetCandidates().GroupBy(c => c.Id).Select(g => g.FirstOrDefault()); if (_createdDate <= startDate) { candidates = candidates.Where(c => c.LastModified >= startDate && c.LastModified < endDate); } return candidates.Select(candidate => new SitemapItem { Name = string.Format("{0} | {1} | Valg 2015 | DR", candidate.Name, candidate.Party.Name), Url = string.Format("{0}/{1}", _virtualPath, ((Route)(_routes["Candidate"])).Url.Replace("{name}", candidate.Name).Replace("{id}", candidate.Id.ToString())), Created = _createdDate.ToString("o"), Modified = candidate.LastModified.ToString("o"), }); } } }