109DAYS) [Main-Project] review-reservation 연결, GET reviews 2가지 나누기, 버그 수정

nacSeo (낙서)·2023년 3월 24일
0

완성된 review와 reservation을 reviewPostDto에 reservationId를 추가해주면서 연결하는 작업을 먼저 했다.

이 외에도 특정 resrvation을 조회하는 API 로직은 요구사항을 살펴보니 굳이 필요없는 기능이라 생각하여 삭제해주었고, member에 대한 reviews를 조회하는 로직과 hairShop에 대한 reviews를 불러오는 로직을 나눠야된다는 것을 뒤늦게 알았다. 그리고 memberReviews 조회 시 response에 hairShopName을 추가해달라는 FE 분들의 요청도 받았다. 되게 짜잘짜잘한 수정사항들이 많았는데, 이를 통해 요구사항 정의서를 작성하면서 어떻게 API를 구성해야할지 구체적으로 생각을 해야한다는 것을 다시 한번 몸소 느꼈다 ,, 😂

구현하고 보니 member에 대한 reviews 조회하는 로직에서는 hairShopId가 null로 나오고, hairShop에 대한 reviews 조회 로직에서는 memberId가 null로 나오는 에러를 맞이했다.

mapstruct쪽 문제인 걸 파악했고, default로 직접 수동 매핑해주어 에러를 해결하였다.



다음 문제는 reservation이 없어도 review가 써지는 버그가 존재했다.
따라서 reservation의 hairShopId와 review의 hairShopId가 같을 때, reservation의 memberId와 review의 memberId가 같을 때만 review가 POST되게 로직을 추가해주었고, reservation에 대한 review가 없을 경우에만 review가 POST되도록 하는 로직을 추가해주었다.

따라서 ReviewCompositeService에 있는 createReview의 로직은 다음과 같다.

public Review createReview(Review creatingReview, MultipartFile reviewImage, String email) {
        Member member = memberService.findLoginMemberByEmail(email);
        Reservation foundReservation = reservationService.findVerifiedReservation(creatingReview.getReservation().getReservationId());

        if (foundReservation.getHairShop().getHairShopId() != creatingReview.getHairShop().getHairShopId()) {
            throw new BusinessLogicException(ExceptionCode.INVALID_HAIR_SHOP_ID);
        }

        if (foundReservation.getMember().getMemberId() != member.getMemberId()) {
            throw new BusinessLogicException(ExceptionCode.INVALID_MEMBER_ID);
        }

        if (foundReservation.getReview() != null) {
            throw new BusinessLogicException(ExceptionCode.ALREADY_EXISTING_REVIEW);
        }

        if (foundReservation.getReserveDate().isAfter(LocalDate.now())) {
            throw new BusinessLogicException(ExceptionCode.REVIEW_DATE_IS_BEFORE);
        }

        if (foundReservation.getReserveDate().isEqual(LocalDate.now()) &&
                foundReservation.getReserveTime().isAfter(LocalTime.now())) {
            throw new BusinessLogicException(ExceptionCode.REVIEW_TIME_IS_BEFORE);
        }

        creatingReview.setMember(member);
        creatingReview.setReviewImage(fileUploadService.uploadImage(reviewImage));

        creatingReview.setReservation(foundReservation);

        Review createdReview = reviewService.createReview(creatingReview);

        foundReservation.setReview(createdReview);
        reservationService.updateReservation(foundReservation);

        return createdReview;
    }
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글