Пример #1
0
        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);
        }
Пример #2
0
        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);
            }));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
            }));
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
            });
        }
Пример #8
0
        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);
            });
        }