public ArticlesResult News(string country, string sources, string category)
        {
            var newsApiClient = new NewsApiClient("4f9333875c98436787fa163b2604664a");
            var query         = new TopHeadlinesRequest();

            if (!string.IsNullOrEmpty(country))
            {
                query.Country = Enum.Parse <NewsAPI.Constants.Countries>(country.ToUpper());
            }

            if (!string.IsNullOrEmpty(sources))
            {
                query.Sources = new List <string> {
                    sources
                };
            }

            if (!string.IsNullOrEmpty(category))
            {
                query.Category = Enum.Parse <NewsAPI.Constants.Categories>(
                    new CultureInfo("en-US", false).TextInfo.ToTitleCase(category));
            }

            return(newsApiClient.GetTopHeadlines(query));
        }
예제 #2
0
 private void ValidateParams(TopHeadlinesRequest requestParams)
 {
     if (!(requestParams.Sources.Count == 0))
     {
         if (!(requestParams.Country is null) || !(requestParams.Category is null))
         {
             throw new TopArticlesReguestInputException(TOP_ARTICLES_PARAM_COMBINATION_ERROR);
         }
     }
     if (requestParams.Sources is null &&
         requestParams.Q is null &&
         requestParams.Language is null &&
         requestParams.Country is null &&
         requestParams.Category is null)
     {
         throw new TopArticlesReguestInputException(TOP_ARTICLES_MISSING_INPUT_MESSAGE);
     }
     if (requestParams.PageSize <= 0 || requestParams.PageSize > 100)
     {
         throw new TopArticlesReguestInputException(PAGE_SIZE_VIOLATION);
     }
     if (requestParams.Page <= 0)
     {
         throw new TopArticlesReguestInputException(PAGE_NUMBER_VIOLATION);
     }
 }
예제 #3
0
        public async Task NewsResponse_TopHeadlinesRequest_NotNull()
        {
            var request = new TopHeadlinesRequest("AI", NewsCategory.Technology);
            var result  = await _newsClient.FetchNewsAsync(request);

            Assert.Equal(ResponseStatus.Ok, result.ResponseStatus);
            Assert.NotNull(result.Articles);
        }
예제 #4
0
        /// <summary>
        /// Fetch News from the API.
        /// </summary>
        /// <param name="request">Returns the top headlines from all sources for an entered request.</param>
        /// <returns><see cref="NewsResult"/> The result of the search with an IEnumerable collection of articles.</returns>
        public async Task <NewsResult> FetchNewsAsync(TopHeadlinesRequest request)
        {
            var baseUrl = Constants.BaseUrl;
            var query   = RequestFormat.CreateUrl(request, baseUrl);

            var response = await SendRequestAsync(query);

            return(GetResult(response));
        }
예제 #5
0
        public ArticlesResult News()
        {
            var newsApiClient = new NewsApiClient("4f9333875c98436787fa163b2604664a");
            var topNews       = new TopHeadlinesRequest {
                Country = NewsAPI.Constants.Countries.CA
            };

            return(newsApiClient.GetTopHeadlines(topNews));
        }
예제 #6
0
        internal static string CreateUrl(TopHeadlinesRequest request, string baseUrl)
        {
            baseUrl += "top-headlines?";
            baseUrl += $"q={request.Query}";
            baseUrl += FormattedCountry(request.Country);
            baseUrl += FormattedCategory(request.Category);

            return(baseUrl);
        }
예제 #7
0
파일: Mapper.cs 프로젝트: nikipet/NewslyAE
        public static TopHeadlinesRequest DTOToHeadline(TopArticlesParamsDTO requestParamsDTO)
        {
            TopHeadlinesRequest requestParam = new TopHeadlinesRequest();

            requestParam.Q        = requestParamsDTO.Keywords;
            requestParam.Page     = requestParamsDTO.Page;
            requestParam.PageSize = requestParamsDTO.PageSize;
            if (!(requestParamsDTO.Sources is null))
            {
                requestParam.Sources = requestParamsDTO.Sources.Split(",").ToList();
            }

            if (!(requestParamsDTO.Category is null))
            {
                ///If the user doesnt select one of the options,
                ///it converts the user input to string with beggining capital letter
                ///followed only by lower case letters
                string userInputCat = requestParamsDTO.Category.ToLower().Substring(1);
                string firstLetter  = requestParamsDTO.Category[0].ToString().ToUpper();
                userInputCat = firstLetter + userInputCat;
                if (Enum.TryParse(userInputCat, out Categories category))
                {
                    requestParam.Category = category;
                }
                else
                {
                    throw new TopArticlesReguestInputException(string.Format(
                                                                   NO_SUCH_CATEGORY, requestParamsDTO.Category));
                }
            }
            if (!(requestParamsDTO.Language is null))
            {
                if (Enum.TryParse(requestParamsDTO.Language.ToUpper(), out Languages language))
                {
                    requestParam.Language = language;
                }
                else
                {
                    throw new EverythingRequestInputException(string.Format(
                                                                  NO_SUCH_LANGUAGE_CODE, requestParamsDTO.Language));
                }
            }
            if (!(requestParamsDTO.Country is null))
            {
                if (Enum.TryParse(requestParamsDTO.Country.ToUpper(), out Countries country))
                {
                    requestParam.Country = country;
                }
                else
                {
                    throw new TopArticlesReguestInputException(string.Format(
                                                                   NO_SUCH_COUNTRY_CODE, requestParamsDTO.Country));
                }
            }
            return(requestParam);
        }
예제 #8
0
        public ArticlesResult TopHeadlines()
        {
            var topHeadlinesRequest = new TopHeadlinesRequest();

            topHeadlinesRequest.Country = Countries.US;

            var articlesResult = _client.GetTopHeadlines(topHeadlinesRequest);

            return(articlesResult);
        }
예제 #9
0
        public async Task <IActionResult> TopHeadlines(TopHeadlinesRequest data)
        {
            var articles = await _googleNewsService.GetTopHeadlines(data.country, data.category, data.q);

            if (articles.Any())
            {
                return(Ok(articles));
            }
            else
            {
                return(NotFound());
            }
        }
예제 #10
0
        private void Service()
        {
            Receive <T>((msg =>
            {
                _everythingRequest = msg.TopHeadlinesRequest;
            }));

            Receive <FetchNews>(fetch =>
            {
                _client.GetTopHeadlinesAsync(_everythingRequest).ContinueWith((res) => new NewsResult(_everythingRequest.Q, res.Result)).PipeTo(_responseProcessActor);
                Self.Tell(PoisonPill.Instance);
            });
        }
예제 #11
0
        public void BasicTopHeadlinesRequestWorks()
        {
            var topHeadlinesRequest = new TopHeadlinesRequest();

            topHeadlinesRequest.Sources.Add("techcrunch");

            var result = NewsApiClient.GetTopHeadlines(topHeadlinesRequest);

            Assert.Equal(Statuses.Ok, result.Status);
            Assert.True(result.TotalResults > 0);
            Assert.True(result.Articles.Count > 0);
            Assert.Null(result.Error);
        }
예제 #12
0
        private IEnumerable <ArticleData> ApiArticles(TopHeadlinesRequest request)
        {
            // TODO: Perhaps use a call layer and do not call directly from client provider
            var result = _apiClientProvider.ExecuteRequest(c => c.GetTopHeadlines(request));

            if (result.Articles == null)
            {
                return(Enumerable.Empty <ArticleData>());
            }

            var category = Enum.GetName(typeof(Categories), request.Category);

            return(result.Articles.Select(a => ToArticle(a, category)).ToList());
        }
예제 #13
0
        public async Task <ArticlesResult> GetHeadlinesBySourcesAsync(List <string> sources, string topic, Languages?language)
        {
            var request = new TopHeadlinesRequest();

            request.Sources  = sources;
            request.Language = language;
            if (!string.IsNullOrEmpty(topic) && !string.IsNullOrWhiteSpace(topic))
            {
                request.Q = topic;
            }
            var response = await newsApiClient.GetTopHeadlinesAsync(request);

            return(response);
        }
예제 #14
0
        private async void button1_Click(object sender, EventArgs e)
        {
            label1.Text = label1.Text + "\nButton Clicked";

            TopHeadlinesRequest request = GenerateHeadlinesRequest();
            var response = await APIn.GetTopHeadlinesAsync(request);

            label1.Text += label1.Text + "\nResponse recieved";

            if (response.Status == Statuses.Ok)
            {
                Console.WriteLine("Responses: " + response.TotalResults);
                label1.Text += ("Responses: " + response.TotalResults);

                foreach (var article in response.Articles)
                {
                    /*
                     * Console.WriteLine("Title: {0} - ({1})", article.Title, article.PublishedAt);
                     * Console.WriteLine("Author: {0}", article.Author);
                     * Console.WriteLine("Description: {0}", article.Description);
                     */

                    string txt = "";
                    txt += "Title: " + article.Title;
                    txt += "\nPublished: " + article.PublishedAt;
                    txt += "\nAuthor: " + article.Author;
                    txt += "\nDescription: " + article.Description;
                    txt += "\nSource: " + article.Source.Name + "\n\n";

                    TextBox.Text += txt;


                    if (article.Title.Length > 5)
                    {
                        Headlines.Add(article.Title);
                    }
                }
            }
            else
            {
                label1.Text = label1.Text + "\nError fetching data" + response.Error.Code;
                label1.Text = label1.Text + "\n\t" + response.Error.Message;

                TextBox.Text = label1.Text + "\nError fetching data" + response.Error.Code;
                TextBox.Text = label1.Text + "\n\t" + response.Error.Message;
            }


            label1.Text = label1.Text + "\nButton push end";
        }
예제 #15
0
        /// <summary>
        /// Query the /v2/top-headlines endpoint for live top news headlines.
        /// </summary>
        /// <param name="request">The params and filters for the request.</param>
        /// <returns></returns>
        public async Task <ArticlesResult> GetTopHeadlinesAsync(TopHeadlinesRequest request)
        {
            // build the querystring
            var queryParams = new List <string>();

            // q
            if (!string.IsNullOrWhiteSpace(request.Q))
            {
                queryParams.Add("q=" + request.Q);
            }

            // sources
            if (request.Sources.Count > 0)
            {
                queryParams.Add("sources=" + string.Join(",", request.Sources));
            }

            if (request.Category.HasValue)
            {
                queryParams.Add("category=" + request.Category.Value.ToString().ToLowerInvariant());
            }

            if (request.Language.HasValue)
            {
                queryParams.Add("language=" + request.Language.Value.ToString().ToLowerInvariant());
            }

            if (request.Country.HasValue)
            {
                queryParams.Add("country=" + request.Country.Value.ToString().ToLowerInvariant());
            }

            // page
            if (request.Page > 1)
            {
                queryParams.Add("page=" + request.Page);
            }

            // page size
            if (request.PageSize > 0)
            {
                queryParams.Add("pageSize=" + request.PageSize);
            }

            // join them together
            var querystring = string.Join("&", queryParams.ToArray());

            return(await MakeRequest("top-headlines", querystring));
        }
예제 #16
0
        public ArticlesResult GetTopArticles(TopHeadlinesRequest requestParam)
        {
            ValidateParams(requestParam);
            var result = ApiConnector.GetTopArticles(requestParam);

            //Limits the description of each article to 250 characters
            foreach (var article in result.Articles)
            {
                if (!(article.Description is null) && article.Description.Length > 250)
                {
                    article.Description = article.Description.Substring(0, 250) + "...";
                }
            }
            return(result);
        }
예제 #17
0
        public void BadTopHeadlinesRequestReturnsError2()
        {
            var topHeadlinesRequest = new TopHeadlinesRequest();

            topHeadlinesRequest.Sources.Add("techcrunch");
            topHeadlinesRequest.Country  = Countries.AU;
            topHeadlinesRequest.Language = Languages.EN;

            var result = NewsApiClient.GetTopHeadlines(topHeadlinesRequest);

            Assert.Equal(Statuses.Error, result.Status);
            Assert.Null(result.Articles);
            Assert.NotNull(result.Error);
            Assert.Equal(ErrorCodes.ParametersIncompatible, result.Error.Code);
        }
예제 #18
0
        public IActionResult Index()
        {
            TopArticlesWrapper homePageExample = new TopArticlesWrapper();
            TopHeadlinesRequest homepageRequest = new TopHeadlinesRequest
            {
                Q = KEYWORDS_OF_THE_DAY,
                Page = EXAMPLE_PAGE,
                PageSize = EXAMPLE_PAGESIZE,
                Language = NewsAPI.Constants.Languages.EN

            };
            homePageExample.Result = topArticlesService.GetTopArticles(homepageRequest);
            ViewBag.Keywords = KEYWORDS_OF_THE_DAY;
            return View(homePageExample);
        }
예제 #19
0
        public async Task <ArticlesResult> GetHeadlinesByCountryOrCategoryAsync(Countries?country, Categories?category, string topic, Languages?language)
        {
            var request = new TopHeadlinesRequest();

            request.Country  = country;
            request.Category = category;
            request.Language = language;
            if (!string.IsNullOrEmpty(topic) && !string.IsNullOrWhiteSpace(topic))
            {
                request.Q = topic;
            }
            var response = await newsApiClient.GetTopHeadlinesAsync(request);

            return(response);
        }
예제 #20
0
        public void BadTopHeadlinesRequestReturnsError()
        {
            var topHeadlinesRequest = new TopHeadlinesRequest();

            var brokenClient = new NewsApiClient("nokey");

            topHeadlinesRequest.Sources.Add("techcrunch");

            var result = brokenClient.GetTopHeadlines(topHeadlinesRequest);

            Assert.Equal(Statuses.Error, result.Status);
            Assert.Null(result.Articles);
            Assert.NotNull(result.Error);
            Assert.Equal(ErrorCodes.ApiKeyInvalid, result.Error.Code);
        }
예제 #21
0
        public async Task <IActionResult> GetNewsTopheadlines([FromQuery] TopHeadlinesRequest topHeadlinesRequest)
        {
            var invokingUser = int.Parse(User.FindFirst(claim => claim.Type == ClaimTypes.NameIdentifier).Value);

            var newsApiClient    = new NewsApiClient(_configuration.GetSection("ApiKey").Value);
            var articlesResponse = await newsApiClient.GetTopHeadlinesAsync(topHeadlinesRequest);

            if (articlesResponse.Status == Statuses.Ok)
            {
                var queryObject = _mapper.Map <TopHeadlinesRequest, QueryObjectTopHeadLinesRequest>(topHeadlinesRequest);
                await _repository.PostQueryObjectTopHeadLinesRequestAsync(invokingUser, queryObject);

                var articlesResponseDto = _mapper.Map <ArticlesResult, ArticlesResultViewModel>(articlesResponse);
                return(Ok(articlesResponseDto));
            }

            return(BadRequest(articlesResponse.Error.Message));
        }
예제 #22
0
 public static ArticlesResult GetTopArticles(TopHeadlinesRequest reqParams)
 {
     try
     {
         var newsApiClient = new NewsApiClient(apiKey);
         var articleresult = newsApiClient.GetTopHeadlines(reqParams);
         if (articleresult.Status == Statuses.Ok)
         {
             return(articleresult);
         }
         else
         {
             throw new ApiResponseException(articleresult.Error.Message);
         }
     }catch (AggregateException e)
     {
         throw new ApiResponseException(e.Message);
     }
 }
        public async Task <List <Models.Article> > GetHeadlinesAsync()
        {
            var request = new TopHeadlinesRequest {
                Country = Countries.US
            };
            var articles = await News.GetArticlesAsync(request);

            var top20 = new Articles();

            foreach (var article in articles)
            {
                Models.Article art = new Models.Article();
                art.sourceName  = article.Source.Name;
                art.author      = article.Author;
                art.title       = article.Title;
                art.description = article.Description;
                art.url         = article.Url;
                art.urlToImage  = article.UrlToImage;
                art.publishedAT = article.PublishedAt.ToString();

                top20.data.Add(art);
            }
            return(top20.data);
        }
예제 #24
0
        private TopHeadlinesRequest GenerateHeadlinesRequest()
        {
            /*
             *  Creates Headlines Request based on menu selection
             */

            TopHeadlinesRequest request = new TopHeadlinesRequest();


            if (Check_Country.Checked)
            {
                switch (Country.SelectedItem.ToString().ToUpper())
                {
                case ("UAE"): request.Country = Countries.AE; break;

                case ("ARGENTINA"): request.Country = Countries.AR; break;

                case ("AUSTRIA"): request.Country = Countries.AT; break;

                case ("AUSTRALIA"): request.Country = Countries.AU; break;

                case ("BELGIUM"): request.Country = Countries.BE; break;

                case ("BULGARIA"): request.Country = Countries.BG; break;

                case ("BRAZIL"): request.Country = Countries.BR; break;

                case ("CANADA"): request.Country = Countries.CA; break;

                case ("SWITZERLAND"): request.Country = Countries.CH; break;

                case ("CHINA"): request.Country = Countries.CN; break;

                case ("COLUMBIA"): request.Country = Countries.CO; break;

                case ("CUBA"): request.Country = Countries.CU; break;

                case ("CZECHIA"): request.Country = Countries.CZ; break;

                case ("GERMANY"): request.Country = Countries.DE; break;

                case ("EGYPT"): request.Country = Countries.EG; break;

                case ("FRANCE"): request.Country = Countries.FR; break;

                case ("UK"): request.Country = Countries.GB; break;

                case ("GREECE"): request.Country = Countries.GR; break;

                case ("HONG KONG"): request.Country = Countries.HK; break;

                case ("HUNGARY"): request.Country = Countries.HU; break;

                case ("INDONESIA"): request.Country = Countries.ID; break;

                case ("IRELAND"): request.Country = Countries.IE; break;

                case ("ISRAEL"): request.Country = Countries.IL; break;

                case ("INDIA"): request.Country = Countries.IN; break;

                case ("ITALY"): request.Country = Countries.IT; break;

                case ("JAPAN"): request.Country = Countries.JP; break;

                case ("KOREA"): request.Country = Countries.KR; break;

                case ("LITHUANIA"): request.Country = Countries.LT; break;

                case ("LATVIA"): request.Country = Countries.LV; break;

                case ("MOROCCO"): request.Country = Countries.MA; break;

                case ("MEXICO"): request.Country = Countries.MX; break;

                case ("MALAYSIA"): request.Country = Countries.MY; break;

                case ("NIGERIA"): request.Country = Countries.NG; break;

                case ("NETHERLANDS"): request.Country = Countries.NL; break;

                case ("NORWAY"): request.Country = Countries.NO; break;

                case ("NEW ZEALAND"): request.Country = Countries.NZ; break;

                case ("PHILIPPINES"): request.Country = Countries.PH; break;

                case ("POLAND"): request.Country = Countries.PL; break;

                case ("PORTUGAL"): request.Country = Countries.PT; break;

                case ("ROMANIA"): request.Country = Countries.RO; break;

                case ("SERBIA"): request.Country = Countries.RS; break;

                case ("RUSSIA"): request.Country = Countries.RU; break;

                case ("SAUDI ARABIA"): request.Country = Countries.SA; break;

                case ("SWEDEN"): request.Country = Countries.SE; break;

                case ("SLOVENIA"): request.Country = Countries.SI; break;

                case ("SLOVAKIA"): request.Country = Countries.SK; break;

                case ("THAILAND"): request.Country = Countries.TH; break;

                case ("TURKEY"): request.Country = Countries.TR; break;

                case ("TAIWAN"): request.Country = Countries.TW; break;

                case ("UKRAINE"): request.Country = Countries.UA; break;

                case ("US"): request.Country = Countries.US; break;

                case ("VENEZUELA"): request.Country = Countries.VE; break;

                case ("SOUTH AFRICA"): request.Country = Countries.ZA; break;

                default: request.Country = Countries.GB; break;
                }
            }

            if (Check_Catagory.Checked)
            {
                switch (Catagory.SelectedItem.ToString().ToUpper())
                {
                case ("BUSINESS"): request.Category = Categories.Business; break;

                case ("ENTERTAINMENT"): request.Category = Categories.Entertainment; break;

                case ("HEALTH"): request.Category = Categories.Health; break;

                case ("SCIENCE"): request.Category = Categories.Science; break;

                case ("SPORTS"): request.Category = Categories.Sports; break;

                case ("TECHNOLOGY"): request.Category = Categories.Technology; break;

                default: request.Category = Categories.Technology; break;
                }
            }


            return(request);
        }
예제 #25
0
 /// <summary>
 /// Query the /v2/top-headlines endpoint for live top news headlines.
 /// </summary>
 /// <param name="request">The params and filters for the request.</param>
 /// <returns></returns>
 public ArticlesResult GetTopHeadlines(TopHeadlinesRequest request)
 {
     return(GetTopHeadlinesAsync(request).Result);
 }
예제 #26
0
 public GoogleRequest(TopHeadlinesRequest topHeadlinesRequest) : base(topHeadlinesRequest)
 {
 }
예제 #27
0
 public AppleRequest(TopHeadlinesRequest topHeadlinesRequest) : base(topHeadlinesRequest)
 {
 }
예제 #28
0
        public static async Task <IEnumerable <Article> > GetArticlesAsync(TopHeadlinesRequest request)
        {
            var articles = await client.GetTopHeadlinesAsync(request);

            return(articles.Articles.AsEnumerable());
        }
예제 #29
0
 protected Request(TopHeadlinesRequest topHeadlinesRequest)
 {
     TopHeadlinesRequest = topHeadlinesRequest;
 }