Day9 - User 페이지

RINM·2023년 1월 11일

NextJS - Reddit Clone

목록 보기
9/9

User page

해당 유저가 작성한 게시물, 댓글을 시간 순으로 나열

Frontend

const username = router.query.username; 
const {data, error} = useSWR<any>(username? `/users/${username}`:null)

Backend

유저가 작성한 post, comment도 함께 전달
클래스 형식을 json으로 변환해야 expose한 getter들을 사용할 수 있다.

const getUserData =async (req: Request, res: Response) => {
    try {
        //get user info
        const user = await User.findOneOrFail({
            where:{username: req.params.username},
            select:["username","createdAt"],
        })

        //post that user posted
        const posts = await Post.find({
            where: {username: user.username},
            relations:["comments","votes","sub"],
        })

        //comment that user made
        const comments = await Comment.find({
            where:{username:user.username},
            relations:["post"]
        });

        //set user vote
        if(res.locals.user){
            const {user} = res.locals;
            posts.forEach((p)=>p.setUserVote(user));
            comments.forEach((c)=>c.setUserVote(user));
        }

        let userData : any[] = [];

        //convert post & comment to JSON and add to userData
        posts.forEach((p)=>userData.push({type: "Post",...p.toJSON()}))
        comments.forEach((c)=>userData.push({type: "Comment",...c.toJSON()}))

        //sort by date
        userData.sort((a,b)=>{
            if(b.createdAt>a.createdAt) return 1;
            if(b.createdAt<a.createdAt) return -1;
            return 0;
        })
    
        return res.json({user,userData});
    } catch (error) {
        console.error(error);
        return res.status(500).json({error: "Something went wrong"})
        
    }
}

router.get("/:username",userMiddleware,getUserData)

0개의 댓글