示例#1
0
        public async ValueTask <IActionResult> UserPosts(string id, [FromBody] ReqVm postReq)
        {
            var user = await db.Users.FirstOrDefaultAsync(u => u.UserName == id);

            if (user == null || !ModelState.IsValid)
            {
                return(BadRequest("User not found"));
            }
            var currentUser = await db.Users.FirstOrDefaultAsync(u =>
                                                                 u.UserName == User.FindFirstValue(ClaimTypes.NameIdentifier));

            if (user.IsPrivate)
            {
                var hasAccess = currentUser?.FollowedFollows?
                                .Any(f => f.Followed == user && f.Accepted) ?? false ||
                                User.IsInRole("Admin");
                if (!hasAccess)
                {
                    return(Forbid());
                }
            }
            IEnumerable <Post> prePosts = user.Posts;

            prePosts = postReq.TowardOlds ?
                       prePosts.OrderByDescending(p => p.Time) :
                       prePosts.OrderBy(p => p.Time);
            if (postReq.LastGuttedId != null)
            {
                prePosts = prePosts.SkipWhile(p => p.Id != postReq.LastGuttedId).Skip(1);
            }
            prePosts = prePosts.Take(postReq.MaxCountToGet);
            var posts = prePosts.ConvertToVm(currentUser);

            return(Ok(posts));
        }
示例#2
0
        public async ValueTask <IActionResult> Trends([FromBody] ReqVm postReq)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var currentUser = await db.Users.FirstOrDefaultAsync(u =>
                                                                 u.UserName == User.FindFirstValue(ClaimTypes.NameIdentifier));

            IEnumerable <Post> prePosts;

            prePosts = db.Posts.Where(p =>
                                      p.Parent == null &&
                                      (!p.Sender.IsPrivate ||
                                       p.Sender.FollowerFollows.Any(f => f.Follower == currentUser && f.Accepted)
                                      )
                                      )
                       .OrderByDescending(p => p.Likes.Count);
            prePosts = postReq.TowardOlds ?
                       prePosts.OrderByDescending(p => p.Time) :
                       prePosts.OrderBy(p => p.Time);
            if (postReq.LastGuttedId != null)
            {
                prePosts = prePosts.SkipWhile(p => p.Id != postReq.LastGuttedId).Skip(1);
            }
            prePosts = prePosts.Take(postReq.MaxCountToGet);
            var posts = prePosts.ConvertToVm(currentUser);

            return(Ok(posts));
        }
示例#3
0
        public async ValueTask <IActionResult> View(long?id, [FromBody] ReqVm postReq)
        {
            if (!ModelState.IsValid)
            {
                if (postReq == null && id != null)
                {
                    ModelState.Remove("");
                }
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var currentUser = await db.Users.FirstOrDefaultAsync(u =>
                                                                 u.UserName == User.FindFirstValue(ClaimTypes.NameIdentifier));

            if (id != null)
            {
                var prePost = await db.Posts.FindAsync(id);

                if (prePost.Sender.IsPrivate)
                {
                    var hasAccess = currentUser?.FollowedFollows?
                                    .Any(f => f.Followed == prePost.Sender && f.Accepted) ?? false ||
                                    User.IsInRole("Admin");
                    if (!hasAccess)
                    {
                        return(Forbid());
                    }
                }
                return(Ok(prePost.ConvertToVm(currentUser)));
            }
            IEnumerable <Post> prePosts;

            prePosts = currentUser.FollowedFollows.Where(f => f.Accepted)
                       .Select(f => f.Followed).SelectMany(u => u.Posts).Where(p => p.Parent == null);
            prePosts = postReq.TowardOlds ?
                       prePosts.OrderByDescending(p => p.Time) :
                       prePosts.OrderBy(p => p.Time);
            if (postReq.LastGuttedId != null)
            {
                prePosts = prePosts.SkipWhile(p => p.Id != postReq.LastGuttedId).Skip(1);
            }
            prePosts = prePosts.Take(postReq.MaxCountToGet);
            var posts = prePosts.ConvertToVm(currentUser);

            return(Ok(posts));
        }