public IHttpActionResult PutTopStory(int id, TopStory topStory) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (id != topStory.ID) { return(BadRequest()); } db.Entry(topStory).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!TopStoryExists(id)) { return(NotFound()); } else { throw; } } return(StatusCode(HttpStatusCode.NoContent)); }
public void ComputeTopCommentsPerStoryBlock() { ConcurrentDictionary <string, int> comments = new ConcurrentDictionary <string, int>(); comments.TryAdd("a", 1); comments.TryAdd("b", 2); comments.TryAdd("c", 3); comments.TryAdd("d", 4); comments.TryAdd("e", 5); comments.TryAdd("f", 6); comments.TryAdd("g", 7); comments.TryAdd("h", 8); comments.TryAdd("i", 9); comments.TryAdd("j", 10); comments.TryAdd("k", 11); comments.TryAdd("l", 12); TopStory topStory = new TopStory("US takes 'richest nation on earth' crown from Switzerland", comments); ComputeTopCommentsPerStoryBlock traverseTopStoriesComments = new ComputeTopCommentsPerStoryBlock(); traverseTopStoriesComments.block.Post(topStory); var topStoryWithTopComments = traverseTopStoriesComments.bufferBlock.ReceiveAsync().Result; Assert.IsNotNull(topStoryWithTopComments.TopComments); Assert.AreEqual(topStoryWithTopComments.TopComments.Count, Constants.NBOFCOMMENTERS); }
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "TopStory") { try { using (RockyingDataClassesDataContext dc = new RockyingDataClassesDataContext(Utility.ConnectionString)) { TopStory ts = new TopStory(); ts.CreatedBy = CurrentUser.ID; ts.DateCreated = DateTime.UtcNow; ts.PostId = long.Parse(e.CommandArgument.ToString()); dc.TopStories.InsertOnSubmit(ts); dc.SubmitChanges(); Response.Redirect("topstory.aspx"); } } catch (Exception ex) { message1.Text = string.Format("Unable to set top story. Error - {0}", ex.Message); message1.Visible = true; message1.Indicate = AlertType.Error; Trace.Write("Unable to set top story."); Trace.Write(ex.Message); Trace.Write(ex.StackTrace); } } else if (e.CommandName == "DeleteCommand") { } }
private async Task Run(Item item) { var storyComment = (item.Kids != null) ? await traverseCommentTree(item.Kids) : new ConcurrentDictionary <string, int>(); var topStory = new TopStory(item.Title, storyComment); this.bufferBlock.Post(topStory); }
private void Run(TopStory topStory) { var topComments = (topStory.Comments.Count >= Constants.NBOFCOMMENTERS) ? getTopCommentators(topStory.Comments) : new List <KeyValuePair <string, int> >(topStory.Comments.ToArray()); topStory.TopComments = topComments; System.Console.WriteLine("Finished processing story : '{0}'", topStory.Title); this.bufferBlock.Post(topStory); }
private async Task <IList <TopStory> > FetchStoriesAsync(string url) { var html = await FetchHtml(new Uri(url)).ConfigureAwait(false); var outer = html.DocumentNode.Descendants("table").First(); var inner = outer.Descendants("table").Second(); var rows = inner.Descendants("tr").ToList(); var stories = new List <TopStory>(30); // usually will have 30 stories on the front page, minus job postings. const int rowsPerStory = 3; for (var i = 0; i < rows.Count - rowsPerStory; i += rowsPerStory) { var storyPieces = rows[i].Descendants("td").ToList(); var metaPieces = rows[i + 1].Descendants("td").ToList(); if (metaPieces[1].ChildNodes.Count == 1) { // We're in a job posting, bail continue; } var href = storyPieces[2].Descendants("a").First().Attributes["href"].Value; var link = new Uri(href.StartsWith("http") ? href : "http://news.ycombinator.com/" + href, UriKind.Absolute); // Ask HN posts have relative URIs, all others are absolute. var title = storyPieces[2].Descendants("a").First().InnerText; var scoreline = metaPieces[1].Descendants("span").First().InnerText.Trim(); var anchors = metaPieces[1].Descendants("a").ToList(); var byline = anchors[0].Attributes["href"].Value; var commentHref = anchors[1].Attributes["href"].Value; var commentLine = anchors[1].InnerText; var id = long.Parse(commentHref.Substring(commentHref.LastIndexOf('=') + 1)); var author = byline.Substring(byline.LastIndexOf('=') + 1); var score = int.Parse(scoreline.Split(' ')[0]); var timeline = ((HtmlTextNode)metaPieces[1].ChildNodes[3]).Text; var numComments = commentLine == "discuss" ? 0 : int.Parse(commentLine.Split(' ')[0]); var story = new TopStory { By = author, CommentCount = numComments, Id = id, RawType = "story", Score = score, Text = null, Time = InferTimeFromDisplayText(timeline), Title = title, Uri = link }; stories.Add(story); } return(stories); }
public IHttpActionResult GetTopStory(int id) { TopStory topStory = db.TopStories.Find(id); if (topStory == null) { return(NotFound()); } return(Ok(topStory)); }
public IHttpActionResult PostTopStory(TopStory topStory) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } db.TopStories.Add(topStory); db.SaveChanges(); return(CreatedAtRoute("DefaultApi", new { id = topStory.ID }, topStory)); }
public IHttpActionResult DeleteTopStory(int id) { TopStory topStory = db.TopStories.Find(id); if (topStory == null) { return(NotFound()); } db.TopStories.Remove(topStory); db.SaveChanges(); return(Ok(topStory)); }
public TopStoryViewModel(TopStory story, INavigationService navigationService) { this.story = story; this.navigationService = navigationService; }