Skip to content

Commit

Permalink
Refactor: 간접참조를 직접참조로 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
onetuks committed Dec 13, 2023
1 parent ef2ea9f commit 82a605d
Show file tree
Hide file tree
Showing 15 changed files with 178 additions and 168 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.guzzing.studayserver.domain.academy.model.ReviewCount;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

public interface ReviewCountJpaRepository extends JpaRepository<ReviewCount, Long>, ReviewCountRepository {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.concurrent.ConcurrentHashMap;
import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.academy.model.Lesson;
import org.guzzing.studayserver.domain.academy.model.ReviewCount;
import org.guzzing.studayserver.domain.academy.repository.academy.AcademyRepository;
import org.guzzing.studayserver.domain.academy.repository.academycategory.AcademyCategoryRepository;
import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByFilterWithScroll;
Expand Down Expand Up @@ -52,6 +53,11 @@ public Academy getAcademy(final long academyId) {
return academyRepository.getById(academyId);
}

@Transactional(readOnly = true)
public ReviewCount getReviewCountOfAcademy(final long academyId) {
return reviewCountRepository.getByAcademyId(academyId);
}

@Transactional(readOnly = true)
public AcademyFeeInfo findAcademyFeeInfo(final long academyId) {
return AcademyFeeInfo.from(academyRepository.findAcademyFeeInfo(academyId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,13 @@ public MemberFacade(
public void removeMember(final long memberId) {
final Member member = memberService.getMember(memberId);

final List<Long> childIds = childService.findByMemberId(memberId).children()
final List<Long> childIds = childService.findByMemberId(member.getId())
.children()
.stream()
.map(ChildFindResult::childId)
.toList();

reviewFacade.removeReview(memberId);
reviewFacade.removeReview(member);
likeCommandService.deleteLikesOfMember(member);
calendarService.removeCalendar(childIds);
dashboardService.removeDashboard(childIds);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package org.guzzing.studayserver.domain.review.model;

import static jakarta.persistence.FetchType.LAZY;

import io.hypersistence.utils.hibernate.type.json.JsonType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.member.model.Member;
import org.hibernate.annotations.Type;

@Getter
Expand All @@ -25,29 +32,31 @@ public class Review {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "member_id", nullable = false)
private Long memberId;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member;

@Column(name = "academy_id", nullable = false)
private Long academyId;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "academy_id")
private Academy academy;

@Type(JsonType.class)
@Column(name = "reviewed_type", nullable = false, columnDefinition = "LONGTEXT")
private Map<String, Boolean> reviewType;

public Review(
final Long memberId,
final Long academyId,
final Member member,
final Academy academy,
final Map<String, Boolean> reviewType
) {
this.memberId = memberId;
this.academyId = academyId;
this.member = member;
this.academy = academy;
this.reviewType = reviewType;
}

public static Review of(
final Long memberId,
final Long academyId,
final Member member,
final Academy academy,
final Map<ReviewType, Boolean> reviewType
) {
final Map<String, Boolean> selectedRevieType = reviewType.entrySet()
Expand All @@ -57,7 +66,15 @@ public static Review of(
Entry::getValue
));

return new Review(memberId, academyId, selectedRevieType);
return new Review(member, academy, selectedRevieType);
}

public long getMemberId() {
return this.member.getId();
}

public long getAcademyId() {
return this.academy.getId();
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package org.guzzing.studayserver.domain.review.repository;

import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.member.model.Member;
import org.guzzing.studayserver.domain.review.model.Review;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ReviewJpaRepository extends JpaRepository<Review, Long>, ReviewRepository {

boolean existsByMemberIdAndAcademyId(final Long memberId, final Long academyId);
boolean existsByMemberAndAcademy(final Member member, final Academy academy);

void deleteByMemberId(final long memberId);
void deleteByMember(final Member member);

}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package org.guzzing.studayserver.domain.review.repository;

import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.member.model.Member;
import org.guzzing.studayserver.domain.review.model.Review;

public interface ReviewRepository {

Review save(final Review review);

boolean existsByMemberIdAndAcademyId(final Long memberId, final Long academyId);
boolean existsByMemberAndAcademy(final Member member, final Academy academy);

void deleteByMemberId(final long memberId);

void deleteAll();
void deleteByMember(final Member member);

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.guzzing.studayserver.domain.review.service;

import org.guzzing.studayserver.domain.review.event.NewReviewEvent;
import org.guzzing.studayserver.domain.member.model.Member;
import org.guzzing.studayserver.domain.review.model.Review;
import org.guzzing.studayserver.domain.review.repository.ReviewRepository;
import org.springframework.stereotype.Service;
Expand All @@ -22,8 +22,8 @@ public Review saveReview(final Review review) {
return reviewRepository.save(review);
}

public void deleteReviewOfMember(final long memberId) {
reviewRepository.deleteByMemberId(memberId);
public void deleteReviewOfMember(final Member member) {
reviewRepository.deleteByMember(member);
}

}
Original file line number Diff line number Diff line change
@@ -1,66 +1,73 @@
package org.guzzing.studayserver.domain.review.service;

import org.guzzing.studayserver.domain.academy.service.AcademyAccessService;
import org.guzzing.studayserver.domain.member.service.MemberAccessService;
import jakarta.persistence.EntityExistsException;
import java.util.Map;
import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.academy.service.AcademyService;
import org.guzzing.studayserver.domain.member.model.Member;
import org.guzzing.studayserver.domain.member.service.MemberService;
import org.guzzing.studayserver.domain.review.model.Review;
import org.guzzing.studayserver.domain.review.model.ReviewType;
import org.guzzing.studayserver.domain.review.service.dto.request.ReviewPostParam;
import org.guzzing.studayserver.domain.review.service.dto.response.ReviewPostResult;
import org.guzzing.studayserver.domain.review.service.dto.response.ReviewableResult;
import org.guzzing.studayserver.global.exception.ReviewException;
import org.springframework.stereotype.Service;

@Service
public class ReviewFacade {

private final ReviewCommandService reviewCommandService;
private final ReviewReadService reviewReadService;
private final AcademyAccessService academyAccessService;
private final MemberAccessService memberAccessService;
private final MemberService memberService;
private final AcademyService academyService;

public ReviewFacade(
final ReviewCommandService reviewCommandService,
final ReviewReadService reviewReadService,
final AcademyAccessService academyAccessService,
final MemberAccessService memberAccessService
final MemberService memberService,
final AcademyService academyService
) {
this.reviewCommandService = reviewCommandService;
this.reviewReadService = reviewReadService;
this.academyAccessService = academyAccessService;
this.memberAccessService = memberAccessService;
this.memberService = memberService;
this.academyService = academyService;
}

public ReviewPostResult createReviewOfAcademy(final ReviewPostParam param) {
memberAccessService.validateMember(param.memberId());
academyAccessService.validateAcademy(param.academyId());
final Member member = memberService.getMember(param.memberId());
final Academy academy = academyService.getAcademy(param.academyId());

final ReviewableResult reviewableResult = getReviewableToAcademy(param.memberId(), param.academyId());
checkReviewExists(member, academy);

if (!reviewableResult.reviewable()) {
throw new ReviewException("이미 리뷰를 남겼습니다.");
}

final Review review = Review.of(
param.memberId(),
param.academyId(),
ReviewType.getSelectedReviewMap(param));
final Map<ReviewType, Boolean> selectedReviewMap = ReviewType.getSelectedReviewMap(param);

final Review savedReview = reviewCommandService.saveReview(review);
final Review savedReview = reviewCommandService.saveReview(
Review.of(member, academy, selectedReviewMap));
academyService.getReviewCountOfAcademy(academy.getId())
.updateSelectedReviewCount(selectedReviewMap);

return ReviewPostResult.from(savedReview);
}

public void removeReview(final long memberId) {
reviewCommandService.deleteReviewOfMember(memberId);
public void removeReview(final Member member) {
reviewCommandService.deleteReviewOfMember(member);
}

public ReviewableResult getReviewableToAcademy(final Long memberId, final Long academyId) {
memberAccessService.validateMember(memberId);
academyAccessService.validateAcademy(academyId);
public ReviewableResult getReviewableToAcademy(final long memberId, final long academyId) {
final Member member = memberService.getMember(memberId);
final Academy academy = academyService.getAcademy(academyId);

final boolean existsReview = reviewReadService.existsReview(member, academy);

boolean existsReview = reviewReadService.existsReview(memberId, academyId);
return ReviewableResult.of(member.getId(), academy.getId(), !existsReview);
}

private void checkReviewExists(Member member, Academy academy) {
final boolean existsReview = reviewReadService.existsReview(member, academy);

return ReviewableResult.of(memberId, academyId, !existsReview);
if (existsReview) {
throw new EntityExistsException("이미 리뷰를 남겼습니다.");
}
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.guzzing.studayserver.domain.review.service;

import org.guzzing.studayserver.domain.academy.model.Academy;
import org.guzzing.studayserver.domain.member.model.Member;
import org.guzzing.studayserver.domain.review.repository.ReviewRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -14,8 +16,8 @@ public ReviewReadService(final ReviewRepository reviewRepository) {
this.reviewRepository = reviewRepository;
}

public boolean existsReview(final long memberId, final long academyId) {
return reviewRepository.existsByMemberIdAndAcademyId(memberId, academyId);
public boolean existsReview(final Member member, final Academy academy) {
return reviewRepository.existsByMemberAndAcademy(member, academy);
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.guzzing.studayserver.domain.review.service.dto.request;

public record ReviewPostParam(
Long memberId,
Long academyId,
long memberId,
long academyId,
boolean kindness,
boolean cheapFee,
boolean goodFacility,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
import org.guzzing.studayserver.domain.review.model.ReviewType;

public record ReviewPostResult(
Long reviewId,
Long memberId,
Long academyId,
long reviewId,
long memberId,
long academyId,
boolean kindness,
boolean cheapFee,
boolean goodFacility,
Expand All @@ -22,7 +22,7 @@ public record ReviewPostResult(
) {

public static ReviewPostResult from(final Review entity) {
final Map<ReviewType, Boolean> reviewType = ReviewType.convertReviewListToReviewMap(entity.getReviewType());
final Map<ReviewType, Boolean> reviewType = ReviewType.convertToReviewTypeMap(entity.getReviewType());

return new ReviewPostResult(
entity.getId(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package org.guzzing.studayserver.domain.review.service.dto.response;

public record ReviewableResult(
Long memberId,
Long academyId,
long memberId,
long academyId,
boolean reviewable
) {

public static ReviewableResult of(final Long memberId, final Long academyId, final boolean reviewable) {
public static ReviewableResult of(final long memberId, final long academyId, final boolean reviewable) {
return new ReviewableResult(memberId, academyId, reviewable);
}

Expand Down
Loading

0 comments on commit 82a605d

Please sign in to comment.