Ejemplo n.º 1
0
        public async Task <ActionResult> Sitemap()
        {
            List <Uri> model = new List <Uri>();

            var defaultPostKeys = await Repository.ApiClient.Posts.GetAllKeysAsync("home", "default", "default", null, 0, Repository.APIVersion);

            foreach (var pair in defaultPostKeys)
            {
                model.Add(NewsroomExtensions.GetPostUri(pair.Value, pair.Key));
            }

            return(View("SitemapView", model));
        }
Ejemplo n.º 2
0
        public async Task <ActionResult> Reference(string reference)
        {
            if (!Regex.IsMatch(reference, @"\d+"))
            {
                throw new ArgumentException();
            }

            var pair = await Repository.ApiClient.Posts.GetKeyFromReferenceAsync(string.Format("NEWS-{0}", reference), Repository.APIVersion);

            if (pair == null)
            {
                return(await NotFound());
            }

            return(Redirect(NewsroomExtensions.GetPostUri(pair.Value, pair.Key).ToString()));
        }
Ejemplo n.º 3
0
        protected async Task <SearchViewModel> Search(SearchViewModel.SearchQuery query, string page = null)
        {
            var model          = new SearchViewModel();
            int ResultsPerPage = 10;

            model.ResultsPerPage = ResultsPerPage;

            await LoadAsync(model);

#if !DEBUG
            try
            {
#endif
            model.Title = "Search";

            bool isTranslationsSearch = string.Equals(query.Text, "translation", StringComparison.OrdinalIgnoreCase) ||
                                        string.Equals(query.Text, "translations", StringComparison.OrdinalIgnoreCase);
            string requestPath = Properties.Settings.Default.AzureSearchUri.ToString();
            if (!string.IsNullOrEmpty(query.Text))
            {
                if (!isTranslationsSearch)
                {
                    requestPath += string.Format("&{0}={1}", "search", UrlEncoder.Default.Encode(query.Text));
                }
                requestPath += string.Format("&{0}={1}", "searchMode", "all");
            }
            //if (!string.IsNullOrEmpty(query.DateRange))
            //requestPath += string.Format("+{0}:{1}", "daterange", query.DateRange);

            requestPath += string.Format("&{0}={1}", "$top", Convert.ToString(ResultsPerPage));

            requestPath += string.Format("&{0}={1}", "$select", "key,releaseType,documentsHeadline,documentsSubheadline,summary,publishDateTime,hasMediaAssets,assetUrl,translations,hasTranslations, socialMediaHeadline");

            requestPath += string.Format("&{0}={1}", "$orderby", "publishDateTime desc");

            var facets = new Dictionary <string, string> {
                { "languages", "Language" }, { "collection", "Date" }, { "ministries", "Ministry" }, { "sectors", "Sector" }, { "location", "City" }, { "releaseType", "Content" }
            };

            bool useCustomRange = query.UseCustomRange();
            foreach (var facet in facets)
            {
                if (facet.Value == "Date" && useCustomRange)
                {
                    continue;
                }
                if (query.Filters?.ContainsKey(facet.Value) != true)
                {
                    requestPath += string.Format("&{0}={1}", "facet", facet.Key);
                }
            }

            var filters = new List <string>();
            if (isTranslationsSearch)
            {
                filters.Add("hasTranslations eq true");
                filters.Add("translations ne null");
                filters.Add("translations ne ''");
            }
            if (useCustomRange)
            {
                filters.Add("publishDateTime le " + query.ToDate.ToUniversalTime().AddDays(1).ToString("s") + "Z"); // include the selected day too
                filters.Add("publishDateTime ge " + query.FromDate.ToUniversalTime().ToString("s") + "Z");
            }
            if (query.Filters != null)
            {
                foreach (var filter in query.Filters)
                {
                    string facetKey = facets.SingleOrDefault(f => f.Value == filter.Key).Key;
                    filters.Add(string.Format(facetKey.EndsWith('s') ? "{0}/any(t: t eq '{1}')" : "{0} eq '{1}'", facetKey, filter.Value.Replace("'", "''")));
                }
            }
            if (filters.Count != 0)
            {
                requestPath += string.Format("&{0}={1}", "$filter", string.Join(" and ", filters));
            }

            //This should match page meta data date format, which is now "yyyy-mm"
            //if (query.YearMonth != null)
            //    requestPath += String.Format("&{0}={1}", "partialfields", "DC%252Edate%252Eissued:" + query.YearMonth);

            requestPath += string.Format("&{0}={1}", "$count", "true");

            int skip = (int.Parse(page ?? "1") - 1) * ResultsPerPage;
            if (skip > 0)
            {
                requestPath += string.Format("&{0}={1}", "$skip", skip);
            }

            dynamic searchServiceResult = null;
            using (Profiler.StepStatic("Calling search.gov.bc.ca"))
            {
                System.Net.WebRequest request = System.Net.WebRequest.Create(requestPath);
                request.Headers.Add("api-key", Properties.Settings.Default.AzureSearchKey);

                using (System.Net.WebResponse response = await request.GetResponseAsync())
                {
                    using (System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream()))
                    {
                        string res = reader.ReadToEnd();
                        searchServiceResult = JsonConvert.DeserializeObject <dynamic>(res);
                    }
                }
            }

            model.Count = searchServiceResult["@odata.count"];

            model.FirstResult = Math.Min(Math.Max(skip + 1, 1), (model.Count / ResultsPerPage) * ResultsPerPage + 1);

            model.LastResult = Math.Min(model.FirstResult + ResultsPerPage - 1, model.Count);

            model.Query = query;

            var searchFacets = searchServiceResult["@search.facets"];
            if (searchFacets != null)
            {
                foreach (var facet in facets) // iterate in the order we asked for
                {
                    var    facetHits = new List <SearchViewModel.FacetHit>();
                    string filteredFacet;
                    var    searchFacet = searchFacets[facet.Key];
                    if (searchFacet != null)
                    {
                        foreach (var facetHit in searchFacet)
                        {
                            string facetHitValue = facetHit["value"];
                            if (string.IsNullOrEmpty(facetHitValue))
                            {
                                continue;
                            }
                            facetHits.Add(new SearchViewModel.FacetHit
                            {
                                Value = facetHitValue,
                                Count = facetHit["count"]
                            });
                        }
                    }
                    else if (query.Filters != null && query.Filters.TryGetValue(facet.Value, out filteredFacet))
                    {
                        facetHits.Add(new SearchViewModel.FacetHit
                        {
                            Value = filteredFacet,
                            Count = model.Count
                        });
                    }
                    bool isDateCollection = facet.Key == "collection";
                    model.FacetResults.Add(facet.Value, isDateCollection ? facetHits.OrderByDescending(f => f.Value) : facetHits.OrderByDescending(f => f.Count));
                }
            }

            if (searchServiceResult.value != null)
            {
                foreach (var result in searchServiceResult.value)
                {
                    string key = result["key"];

                    string postKind = result["releaseType"];
                    postKind = postKind.EndsWith("y") ? postKind.Substring(0, postKind.Length - 1) + "ies" : postKind + "s";

                    IEnumerable <object> titles    = result["documentsHeadline"];
                    IEnumerable <object> headlines = result["documentsSubheadline"];
                    string translations            = result["translations"];
                    bool   hasTranslations         = result["hasTranslations"];

                    string assetUrl = result["assetUrl"];
                    var    date     = (DateTimeOffset)DateTimeOffset.Parse(Convert.ToString(result["publishDateTime"]));

                    model.Results.Add(new SearchViewModel.Result()
                    {
                        Title               = System.Net.WebUtility.HtmlDecode(titles.FirstOrDefault().ToString()),
                        Headline            = System.Net.WebUtility.HtmlDecode(headlines?.FirstOrDefault().ToString()),
                        Uri                 = NewsroomExtensions.GetPostUri(postKind.ToLower(), key),
                        Description         = result["summary"],
                        HasMediaAssets      = result["hasMediaAssets"],
                        HasTranslations     = translations != null && hasTranslations,
                        PublishDate         = DateTime.Parse(date.FormatDateLong()),
                        ThumbnailUri        = NewsroomExtensions.GetThumbnailUri(assetUrl),
                        AssetUrl            = result["assetUrl"],
                        SocialMediaHeadline = result["socialMediaHeadline"]
                    });
                }
            }


            model.LastPage = Math.Min(Convert.ToInt32(Math.Ceiling(model.Count / (decimal)ResultsPerPage)), 100);
#if !DEBUG
        }

        catch
        {
            model.Success = false;

            //TODO: Report exception message
        }
#endif

            return(model);
        }