public ActionResult Posts(string subName, PostsSortBy? sort, PostsTimeFilter? time, int? pageNumber, int? pageSize) { if (string.IsNullOrEmpty(subName)) return Redirect(Url.Subs()); var model = new SubPostsModel(); var subs = new List<Guid>(); Sub sub = null; if (subName.Equals("all", StringComparison.InvariantCultureIgnoreCase)) { // TODO: Filter only by subs that want to be including in "all". For now, we will do nothing, which will effectively return all posts. model.IsAll = true; } else { // the user wants to view a specific sub sub = _subDao.GetSubByName(subName); if (sub == null) throw new NotFoundException(); if (_userContext.CurrentUser != null) _subActivityDao.MarkSubActive(_userContext.CurrentUser.Id, sub.Id); subs.Add(sub.Id); } if (sort == null) sort = PostsSortBy.Hot; // TODO: get default from sub if (time == null) time = PostsTimeFilter.All; if (pageNumber == null || pageNumber < 1) pageNumber = 1; if (pageSize == null) pageSize = 25; if (pageSize > 100) pageSize = 100; if (pageSize < 1) pageSize = 1; var postIds = _postDao.GetPosts(subs, sortby: sort.Value, timeFilter: time.Value, onlyAll: model.IsAll, // anonymous users don't see NSFW content. // logged in users only see NSFW if preferences say so. // If they want to see NSFW, they will see all content (SFW/NSFW). nsfw: _userContext.CurrentUser == null ? false : (_userContext.CurrentUser.ShowNsfw ? (bool?)null : false), // we are showing posts for a specific sub, so we can show stickies stickyFirst: sub != null, skip: ((pageNumber - 1) * pageSize), take: pageSize); model.Sub = sub != null ? _subWrapper.Wrap(sub.Id, _userContext.CurrentUser) : null; model.SortBy = sort.Value; model.TimeFilter = time; model.Posts = new PagedList<PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, postIds.HasMore); return View(model); }
public SeekedList <Guid> GetPosts(List <Guid> subs = null, PostsSortBy sortby = PostsSortBy.New, PostsTimeFilter timeFilter = PostsTimeFilter.All, Guid?userId = null, bool hideRemovedPosts = true, bool showDeleted = false, bool onlyAll = false, bool?nsfw = null, bool?sticky = null, bool stickyFirst = false, int?skip = null, int?take = null) { return(_conn.Perform(conn => { var query = conn.From <Post>(); if (subs != null && subs.Count > 0) { query.Where(x => subs.Contains(x.SubId)); } if (timeFilter != PostsTimeFilter.All) { TimeSpan timeSpan; switch (timeFilter) { case PostsTimeFilter.Hour: timeSpan = TimeSpan.FromHours(1); break; case PostsTimeFilter.Day: timeSpan = TimeSpan.FromDays(1); break; case PostsTimeFilter.Week: timeSpan = TimeSpan.FromDays(7); break; case PostsTimeFilter.Month: timeSpan = TimeSpan.FromDays(30); break; case PostsTimeFilter.Year: timeSpan = TimeSpan.FromDays(365); break; default: throw new Exception("unknown time filter"); } var from = Common.CurrentTime() - timeSpan; query.Where(x => x.DateCreated >= from); } if (hideRemovedPosts) { query.Where(x => x.Verdict != (int)Verdict.ModRemoved); } if (!showDeleted) { query.Where(x => x.Deleted == false); } if (onlyAll) { query.Where(x => x.InAll); } if (nsfw.HasValue) { query.Where(x => x.Nsfw == nsfw.Value); } if (userId.HasValue) { query.Where(x => x.UserId == userId.Value); } if (sticky.HasValue) { query.Where(x => x.Sticky == sticky); } var totalCount = conn.Count(query); query.Skip(skip).Take(take); var orders = new List <string>(); if (stickyFirst) { orders.Add("sticky"); } switch (sortby) { case PostsSortBy.Hot: orders.Add("hot(vote_up_count, vote_down_count, date_created)"); orders.Add("date_created"); break; case PostsSortBy.New: orders.Add("date_created"); break; case PostsSortBy.Rising: throw new Exception("not implemented"); case PostsSortBy.Controversial: orders.Add("controversy(vote_up_count, vote_down_count)"); orders.Add("date_created"); break; case PostsSortBy.Top: orders.Add("score(vote_up_count, vote_down_count)"); orders.Add("date_created"); query.OrderByExpression = "ORDER BY (, date_created) DESC"; break; default: throw new Exception("uknown sort"); } if (orders.Count > 0) { query.OrderByExpression = "ORDER BY (" + string.Join(", ", orders) + ") DESC"; } query.SelectExpression = "SELECT \"id\""; return new SeekedList <Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount); })); }
public ActionResult Frontpage(PostsSortBy? sort, PostsTimeFilter? time, int? pageNumber, int? pageSize) { var subs = _contextService.GetSubscribedSubIds(); // if the user is not subscribe to any subs, show the default content. if (subs.Count == 0) subs = _subDao.GetDefaultSubs(); if (sort == null) sort = PostsSortBy.Hot; if (time == null) time = PostsTimeFilter.All; if (pageNumber == null || pageNumber < 1) pageNumber = 1; if (pageSize == null) pageSize = 25; if (pageSize > 100) pageSize = 100; if (pageSize < 1) pageSize = 1; var postIds = _postDao.GetPosts(subs, sortby: sort.Value, timeFilter: time.Value, // anonymous users don't see NSFW content. // logged in users only see NSFW if preferences say so. // If they want to see NSFW, they will see all content (SFW/NSFW). nsfw: _userContext.CurrentUser == null ? false : (_userContext.CurrentUser.ShowNsfw ? (bool?)null : false), skip: ((pageNumber - 1) * pageSize), take: pageSize); var model = new SubPostsModel(); model.SortBy = sort.Value; model.TimeFilter = time; if (subs.Any()) // maybe the user hasn't subscribed to any subs? model.Posts = new PagedList<PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, postIds.HasMore); return View("Posts", model); }
public SeekedList <Guid> QueryPosts(string text, Guid?subId = null, PostsSearchSortBy sortBy = PostsSearchSortBy.Relevance, PostsTimeFilter timeFilter = PostsTimeFilter.All, Guid?userId = null, bool hideRemovedPosts = true, bool showDeleted = false, bool?nsfw = null, int?skip = null, int?take = null) { // this implemention will eventually store an index, such as solr. return(_conn.Perform(conn => { var query = conn.From <Post>(); if (subId.HasValue) { query.Where(x => x.SubId == subId); } if (!string.IsNullOrEmpty(text)) { query.Where(x => x.Title.Contains(text) || x.Content.Contains(text)); } if (timeFilter != PostsTimeFilter.All) { TimeSpan timeSpan; switch (timeFilter) { case PostsTimeFilter.Hour: timeSpan = TimeSpan.FromHours(1); break; case PostsTimeFilter.Day: timeSpan = TimeSpan.FromDays(1); break; case PostsTimeFilter.Week: timeSpan = TimeSpan.FromDays(7); break; case PostsTimeFilter.Month: timeSpan = TimeSpan.FromDays(30); break; case PostsTimeFilter.Year: timeSpan = TimeSpan.FromDays(365); break; default: throw new Exception("unknown time filter"); } var from = Common.CurrentTime() - timeSpan; query.Where(x => x.DateCreated >= from); } if (hideRemovedPosts) { query.Where(x => x.Verdict != (int)Verdict.ModRemoved); } if (!showDeleted) { query.Where(x => x.Deleted == false); } if (nsfw.HasValue) { query.Where(x => x.Nsfw == nsfw.Value); } if (userId.HasValue) { query.Where(x => x.UserId == userId.Value); } var totalCount = conn.Count(query); query.Skip(skip).Take(take); switch (sortBy) { case PostsSearchSortBy.Relevance: // let the db do its thing break; case PostsSearchSortBy.Top: query.OrderByExpression = "ORDER BY (score(vote_up_count, vote_down_count), date_created) DESC"; break; case PostsSearchSortBy.New: query.OrderByDescending(x => x.DateCreated); break; case PostsSearchSortBy.Comments: query.OrderByDescending(x => x.NumberOfComments); break; default: throw new Exception("unknown sort"); } query.SelectExpression = "SELECT \"id\""; return new SeekedList <Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount); })); }
public ActionResult SearchSub(string subName, string query, PostsSearchSortBy? sort, PostsTimeFilter? time, int? pageNumber, int? pageSize) { if (string.IsNullOrEmpty(subName)) return Redirect(Url.Subs()); if (sort == null) sort = PostsSearchSortBy.Relevance; if (time == null) time = PostsTimeFilter.All; var sub = _subDao.GetSubByName(subName); if (sub == null) return Redirect(Url.Subs(subName)); if (pageNumber == null || pageNumber < 1) pageNumber = 1; if (pageSize == null) pageSize = 25; if (pageSize > 100) pageSize = 100; if (pageSize < 1) pageSize = 1; var model = new SearchResultsModel(); model.Query = query; model.SortBy = sort.Value; model.TimeFilter = time.Value; model.ResultType = SearchResultType.Post; model.LimitingToSub = _subWrapper.Wrap(sub.Id, _userContext.CurrentUser); var postIds = _postDao.QueryPosts(query, model.LimitingToSub.Sub.Id, sortBy: sort.Value, timeFilter: time.Value, nsfw: _userContext.CurrentNsfw, skip: ((pageNumber - 1) * pageSize), take: pageSize); if (!string.IsNullOrEmpty(model.Query)) model.Posts = new PagedList<PostWrapped>( _postWrapper.Wrap(postIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, postIds.HasMore); return View("Search", model); }
public ActionResult SearchSite(string query, PostsSearchSortBy? sort, PostsTimeFilter? time, SearchResultType? resultType, int? pageNumber, int? pageSize) { if (sort == null) sort = PostsSearchSortBy.Relevance; if (time == null) time = PostsTimeFilter.All; if (pageNumber == null || pageNumber < 1) pageNumber = 1; if (pageSize == null) pageSize = 25; if (pageSize > 100) pageSize = 100; if (pageSize < 1) pageSize = 1; var model = new SearchResultsModel(); model.Query = query; model.SortBy = sort.Value; model.TimeFilter = time.Value; model.ResultType = resultType; if (!string.IsNullOrEmpty(model.Query)) { SeekedList<Guid> postIds = null; SeekedList<Guid> subIds = null; switch (resultType) { case null: postIds = _postDao.QueryPosts(query, model.LimitingToSub != null ? model.LimitingToSub.Sub.Id : (Guid?)null, sortBy: sort.Value, timeFilter: time.Value, skip: ((pageNumber - 1) * pageSize), take: pageSize); subIds = _subDao.GetAllSubs(model.Query, sortBy: SubsSortBy.Relevance, nsfw: _userContext.CurrentNsfw, skip: ((pageNumber - 1) * pageSize), take: pageSize); break; case SearchResultType.Post: postIds = _postDao.QueryPosts(query, model.LimitingToSub != null ? model.LimitingToSub.Sub.Id : (Guid?)null, sortBy: sort.Value, timeFilter: time.Value, skip: ((pageNumber - 1) * pageSize), take: pageSize); break; case SearchResultType.Sub: subIds = _subDao.GetAllSubs(model.Query, sortBy: SubsSortBy.Relevance, nsfw: _userContext.CurrentNsfw, skip: ((pageNumber - 1) * pageSize), take: pageSize); break; default: throw new Exception("unknown result type"); } if (postIds != null) model.Posts = new PagedList<PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, postIds.HasMore); if (subIds != null) model.Subs = new PagedList<SubWrapped>(_subWrapper.Wrap(subIds, _userContext.CurrentUser), pageNumber.Value, pageSize.Value, subIds.HasMore); } return View("Search", model); }
public SeekedList<Guid> GetPosts(List<Guid> subs = null, PostsSortBy sortby = PostsSortBy.New, PostsTimeFilter timeFilter = PostsTimeFilter.All, Guid? userId = null, bool hideRemovedPosts = true, bool showDeleted = false, bool onlyAll = false, bool? nsfw = null, bool? sticky = null, bool stickyFirst = false, int? skip = null, int? take = null) { return _conn.Perform(conn => { var query = conn.From<Post>(); if (subs != null && subs.Count > 0) { query.Where(x => subs.Contains(x.SubId)); } if (timeFilter != PostsTimeFilter.All) { TimeSpan timeSpan; switch (timeFilter) { case PostsTimeFilter.Hour: timeSpan = TimeSpan.FromHours(1); break; case PostsTimeFilter.Day: timeSpan = TimeSpan.FromDays(1); break; case PostsTimeFilter.Week: timeSpan = TimeSpan.FromDays(7); break; case PostsTimeFilter.Month: timeSpan = TimeSpan.FromDays(30); break; case PostsTimeFilter.Year: timeSpan = TimeSpan.FromDays(365); break; default: throw new Exception("unknown time filter"); } var from = Common.CurrentTime() - timeSpan; query.Where(x => x.DateCreated >= from); } if (hideRemovedPosts) query.Where(x => x.Verdict != (int)Verdict.ModRemoved); if (!showDeleted) query.Where(x => x.Deleted == false); if (onlyAll) query.Where(x => x.InAll); if (nsfw.HasValue) query.Where(x => x.Nsfw == nsfw.Value); if (userId.HasValue) query.Where(x => x.UserId == userId.Value); if (sticky.HasValue) query.Where(x => x.Sticky == sticky); var totalCount = conn.Count(query); query.Skip(skip).Take(take); var orders = new List<string>(); if(stickyFirst) orders.Add("sticky"); switch (sortby) { case PostsSortBy.Hot: orders.Add("hot(vote_up_count, vote_down_count, date_created)"); orders.Add("date_created"); break; case PostsSortBy.New: orders.Add("date_created"); break; case PostsSortBy.Rising: throw new Exception("not implemented"); case PostsSortBy.Controversial: orders.Add("controversy(vote_up_count, vote_down_count)"); orders.Add("date_created"); break; case PostsSortBy.Top: orders.Add("score(vote_up_count, vote_down_count)"); orders.Add("date_created"); query.OrderByExpression = "ORDER BY (, date_created) DESC"; break; default: throw new Exception("uknown sort"); } if (orders.Count > 0) { query.OrderByExpression = "ORDER BY (" + string.Join(", ", orders) + ") DESC"; } query.SelectExpression = "SELECT \"id\""; return new SeekedList<Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount); }); }
public SeekedList<Guid> QueryPosts(string text, Guid? subId = null, PostsSearchSortBy sortBy = PostsSearchSortBy.Relevance, PostsTimeFilter timeFilter = PostsTimeFilter.All, Guid? userId = null, bool hideRemovedPosts = true, bool showDeleted = false, bool? nsfw = null, int? skip = null, int? take = null) { // this implemention will eventually store an index, such as solr. return _conn.Perform(conn => { var query = conn.From<Post>(); if (subId.HasValue) { query.Where(x => x.SubId == subId); } if (!string.IsNullOrEmpty(text)) { query.Where(x => x.Title.Contains(text) || x.Content.Contains(text)); } if (timeFilter != PostsTimeFilter.All) { TimeSpan timeSpan; switch (timeFilter) { case PostsTimeFilter.Hour: timeSpan = TimeSpan.FromHours(1); break; case PostsTimeFilter.Day: timeSpan = TimeSpan.FromDays(1); break; case PostsTimeFilter.Week: timeSpan = TimeSpan.FromDays(7); break; case PostsTimeFilter.Month: timeSpan = TimeSpan.FromDays(30); break; case PostsTimeFilter.Year: timeSpan = TimeSpan.FromDays(365); break; default: throw new Exception("unknown time filter"); } var from = Common.CurrentTime() - timeSpan; query.Where(x => x.DateCreated >= from); } if (hideRemovedPosts) query.Where(x => x.Verdict != (int)Verdict.ModRemoved); if (!showDeleted) query.Where(x => x.Deleted == false); if (nsfw.HasValue) query.Where(x => x.Nsfw == nsfw.Value); if (userId.HasValue) query.Where(x => x.UserId == userId.Value); var totalCount = conn.Count(query); query.Skip(skip).Take(take); switch (sortBy) { case PostsSearchSortBy.Relevance: // let the db do its thing break; case PostsSearchSortBy.Top: query.OrderByExpression = "ORDER BY (score(vote_up_count, vote_down_count), date_created) DESC"; break; case PostsSearchSortBy.New: query.OrderByDescending(x => x.DateCreated); break; case PostsSearchSortBy.Comments: query.OrderByDescending(x => x.NumberOfComments); break; default: throw new Exception("unknown sort"); } query.SelectExpression = "SELECT \"id\""; return new SeekedList<Guid>(conn.Select(query).Select(x => x.Id), skip ?? 0, take, totalCount); }); }