내일배움캠프 스파르타 코딩클럽
< 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;
}
}
'TIL' 카테고리의 다른 글
Node.js 복습 (1) ( prettier, dotenv, MongoDB ) (0) | 2024.07.03 |
---|---|
Node.js 백오피스 팀 프로젝트 회고 (0) | 2024.07.02 |
Node.js 백오피스 팀 프로젝트 (7) (0) | 2024.06.28 |
Node.js 백오피스 팀 프로젝트 (6) (0) | 2024.06.28 |
Node.js 백오피스 팀 프로젝트 (5) (0) | 2024.06.26 |