본문 바로가기
TIL

Node.js 백오피스 팀 프로젝트 (8)

by 황민도 2024. 7. 2.

내일배움캠프 스파르타 코딩클럽

 

< routers. reviews.router.js >

import express from 'express';
import { requireAccessToken } from '../middlewares/require-access-token.middleware.js';
import { ReviewController } from '../controllers/reviews.controller.js';
import { ReviewService } from '../services/reviews.service.js';
import { ReviewRepository } from '../repositories/reviews.repository.js';


const reviewRouter = express.Router();

const reivewsRepository = new ReviewRepository();
const reviewsService = new ReviewService(reivewsRepository);
const reviewsController = new ReviewController(reviewsService);



reviewRouter.post('/:petsitterId', requireAccessToken, reviewsController.create);

reviewRouter.get('/petsitter/:petsitterId',  requireAccessToken, reviewsController.petsitterReadMany);

reviewRouter.get('/myreviews/:userId',  requireAccessToken,reviewsController.myReadMany);

reviewRouter.get('/review/:reviewId',  requireAccessToken, reviewsController.readOne);

reviewRouter.patch('/myreviews/:reviewId',  requireAccessToken,reviewsController.update);

reviewRouter.delete('/myreviews/:reviewId',   requireAccessToken, reviewsController.delete);

export { reviewRouter };

 

< controllers. reviews.controller.js >


import { ReviewService } from '../services/reviews.service.js';
import { HTTP_STATUS } from '../constants/http-status.constant.js';


const reviewService = new ReviewService();


export class ReviewController{
    create = async (req, res, next) => {
     
        try {
          const { petsitterId }  = req.params;
          const { rating, comment } = req.body;
          const userId = req.user.id;
         
     
          const review = await reviewService.create({ petsitterId, rating, comment, userId})
     
          return res.status(HTTP_STATUS.CREATED).json({ message: '리뷰가 등록되었습니다.', data: review });
        } catch (err) {
          next(err);
        }
      };
     
    petsitterReadMany =  async (req, res, next) => {
     
      try {
        const { petsitterId } = req.params;

        const reviews = await reviewService.petsitterReadMany(petsitterId)
   
        res.status(HTTP_STATUS.OK).json(reviews);
        } catch (err) {
            next(err);
        }
    };

    myReadMany = async (req, res, next) => {
        const { userId } = req.params;
          try {
           
            const reviews = await reviewService.myReadMany(userId);
            return res.status(HTTP_STATUS.OK).json(reviews);
        } catch (err) {
            next(err);
        }
    };

    readOne = async (req, res, next) => {
        try {
          const { reviewId } = req.params;
 
   
          const review = await reviewService.readOne(reviewId);
         
         
          res.status(200).json(review);
        } catch (err) {
          next(err);
        }
      };

    update =  async (req, res, next) => {
        try {
            const { reviewId } = req.params;
            const userId  = req.user.id;
            const { rating, comment } = req.body;
         
     
         
          const updatedReview = await reviewService.update({ reviewId: +reviewId, userId, rating,comment });
          res.status(200).json(updatedReview);
        } catch (error) {
          next(error);
        }
    };

    delete = async (req, res, next) => {
        try {
          const { reviewId } = req.params;
          const userId  = req.user.id;
          console.log(req.user)
   
         
          const deletedReview = await reviewService.delete({reviewId: +reviewId, userId});
         
          res.status(200).json(deletedReview);
        } catch (error) {
          next(error);
        }
      };
}

 

< servieces. reviews.service.js >


import { ReviewRepository } from "../repositories/reviews.repository.js";
import { HttpError } from '../errors/http.error.js';


const reviewRepository = new ReviewRepository();

export class ReviewService{
    create = async({petsitterId,userId, rating, comment}) => {  

      const petsitter = await reviewRepository.findUniquePetsitter(petsitterId)

      if (!petsitter) {
       throw new Error('펫시터를 찾을 수 없습니다.');
     }

      if(!rating || !comment){
        throw new HttpError.BadRequest('평점과 리뷰를 모두 입력해주세요.');
    }
       const review = await reviewRepository.create({ petsitterId, userId, rating, comment })

    return review;
    };

    petsitterReadMany = async(petsitterId) => {
       
   const petsitter = await reviewRepository.findUniquePetsitter(petsitterId)

   if (!petsitter) {
    throw new Error('펫시터를 찾을 수 없습니다.');
  }
      const reviews = await reviewRepository.petsitterReadMany(petsitterId)

    return reviews;
  }

    myReadMany = async(userId) =>
    {
      const user = await reviewRepository.findUniqueUser(userId)


      if(!user){
        throw new HttpError.NotFound('사용자를 찾을 수 없습니다.');
    }
      const reviews = await reviewRepository.myReadMany(userId)
   
      return reviews;
   
};  
    readOne = async (reviewId) => {
       
 
      const review= await reviewRepository.readOne(reviewId)
     
      if(!review){
        throw new HttpError.NotFound('리뷰를 찾을 수 없습니다.');
    }


        return review;
     
    };

    update = async({reviewId, userId, rating, comment}) => {
     
      const review = await reviewRepository.findUnique(+reviewId)
     
      if(!review){
        throw new Error('리뷰를 찾을 수 없습니다.');
      }

      if(!rating){
        throw new HttpError.BadRequest('수정하실 평점을 작성해주세요')
      }

      if(!comment){
        throw new HttpError.BadRequest('수정하실 리뷰를 작성해주세요.')
      }

      if (review.userId !== userId) {
        throw new HttpError.Forbidden('해당 리뷰를 수정할 권한이 없습니다.');
      }

      const updatedReview = await reviewRepository.update({reviewId: +reviewId, userId, rating, comment})
      return updatedReview;
    };


    delete = async ({reviewId, userId}) => {
       
      const review = await reviewRepository.findUnique(+reviewId);


      if(!review){
        throw new HttpError.NotFound('리뷰를 찾을 수 없습니다.');
    }

    if (review.userId !== userId) {
      throw new HttpError.Forbidden('해당 리뷰를 삭제할 권한이 없습니다.');
    }
   
      const deletedreview = await reviewRepository.delete(+reviewId)
      return deletedreview;
};
}

 

< repositories. reviews.repository.js >

import { prisma } from "../utils/prisma.utils.js";

export class ReviewRepository {

  findUniquePetsitter = async(petsitterId) => {
    const petsitter = await prisma.petsitter.findUnique({
      where: { id: +petsitterId},
   
    })
    return petsitter;
  }

 
    create = async({ userId, petsitterId,rating,comment })=>{
     
          const review = await prisma.review.create({
            data: {
              userId: userId,
              petsitterId: +petsitterId,
              rating: +rating,
              comment,
            },
          });
          return review;
    };


    petsitterReadMany = async(petsitterId)=>{
        const reviews = await prisma.review.findMany({
            where: {
              petsitterId: +petsitterId,
            },
            include: {
              user: {
                select:{
                    id:true,
                    name: true,
                    profileImage: true,
              }
            }
            },
            orderBy: {
              createdAt: 'desc',
            },
          });
    return reviews;
};


findUniqueUser = async(userId) => {
  const user = await prisma.user.findUnique({
    where: { id: +userId},
 
  })
  return user;
}


    myReadMany=async(userId)=>{
        const reviews = await prisma.review.findMany({
            where: {
              userId: +userId,
            },
            include: {
              user: {
                select:{
                  id:true,
                  name: true,
                  profileImage: true,
                },
              },
           
            },
            orderBy: {
              createdAt: 'desc',
            },
          });
          return reviews;
    };
    readOne=async(reviewId)=>{
      const review = await prisma.review.findFirst({
        where: {
          id: +reviewId,
        },
        include:{
          user:{select:{
            id:true,
            name: true,
            profileImage: true,
          }},
          petsitter: {select:{
              id:true,
              name: true,
              profileImage: true,
            },
          },
        }
      });
      return review;
       
    };
    update = async({reviewId, rating, comment })=>{
   
      const updatedReview = await prisma.review.update({
        where:{ id: +reviewId},
        data:{
          rating: +rating,
          comment: comment,
        }
      })
      return updatedReview;
     
   };

   
    findUnique = async(reviewId) => {
      const review = await prisma.review.findUnique({
        where: { id: +reviewId},
      })
      return review;
    }

   
    delete= async(reviewId)=>{
       
   
      const deletedreview = await prisma.review.delete({
        where:{ id: +reviewId   }
  })
   return deletedreview;
  }
  }