-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #68 from LIKELION-TEAM4-HACKATHON/feature/evaluate…
…-member 멤버 평가하기 및 조회
- Loading branch information
Showing
8 changed files
with
213 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
src/main/java/likelion/MZConnent/dto/club/request/EvaluateMemberRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package likelion.MZConnent.dto.club.request; | ||
|
||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Getter | ||
@NoArgsConstructor | ||
public class EvaluateMemberRequest { | ||
private int score; | ||
|
||
public EvaluateMemberRequest(int score) { | ||
this.score = score; | ||
} | ||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/likelion/MZConnent/dto/club/response/EvaluateMemberResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package likelion.MZConnent.dto.club.response; | ||
|
||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Getter | ||
@NoArgsConstructor | ||
public class EvaluateMemberResponse { | ||
private int rateCount; | ||
|
||
public EvaluateMemberResponse(int rateCount) { | ||
this.rateCount = rateCount; | ||
} | ||
} |
24 changes: 24 additions & 0 deletions
24
src/main/java/likelion/MZConnent/dto/club/response/MemberRateResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package likelion.MZConnent.dto.club.response; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
import java.math.BigDecimal; | ||
|
||
@Getter | ||
@NoArgsConstructor | ||
public class MemberRateResponse { | ||
private int rateCount; | ||
private String userName; | ||
private BigDecimal averageMannersScore; | ||
private String profileImageUrl; | ||
|
||
@Builder | ||
public MemberRateResponse(int rateCount, String userName, BigDecimal averageMannersScore, String profileImageUrl) { | ||
this.rateCount = rateCount; | ||
this.userName = userName; | ||
this.averageMannersScore = averageMannersScore; | ||
this.profileImageUrl = profileImageUrl; | ||
} | ||
} |
6 changes: 6 additions & 0 deletions
6
src/main/java/likelion/MZConnent/repository/manner/MannerRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,15 @@ | ||
package likelion.MZConnent.repository.manner; | ||
|
||
import likelion.MZConnent.domain.club.ClubMember; | ||
import likelion.MZConnent.domain.manner.Manner; | ||
import likelion.MZConnent.domain.member.Member; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import java.util.List; | ||
|
||
@Repository | ||
public interface MannerRepository extends JpaRepository<Manner, Long> { | ||
long countByMemberAndClubMember(Member member, ClubMember clubMember); | ||
List<Manner> findByMember(Member member); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
130 changes: 130 additions & 0 deletions
130
src/main/java/likelion/MZConnent/service/club/RateService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
package likelion.MZConnent.service.club; | ||
|
||
import jakarta.transaction.Transactional; | ||
import likelion.MZConnent.domain.club.Club; | ||
import likelion.MZConnent.domain.club.ClubMember; | ||
import likelion.MZConnent.domain.manner.Manner; | ||
import likelion.MZConnent.domain.member.Member; | ||
import likelion.MZConnent.dto.club.request.EvaluateMemberRequest; | ||
import likelion.MZConnent.dto.club.response.EvaluateMemberResponse; | ||
import likelion.MZConnent.dto.club.response.MemberRateResponse; | ||
import likelion.MZConnent.repository.club.ClubRepository; | ||
import likelion.MZConnent.repository.manner.MannerRepository; | ||
import likelion.MZConnent.repository.member.MemberRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.math.BigDecimal; | ||
import java.util.List; | ||
|
||
@Service | ||
@Slf4j | ||
@RequiredArgsConstructor | ||
@Transactional | ||
public class RateService { | ||
private final MemberRepository memberRepository; | ||
private final ClubRepository clubRepository; | ||
private final MannerRepository mannerRepository; | ||
|
||
public EvaluateMemberResponse evaluateMember(String email, Long clubId, Long evaluateeId, EvaluateMemberRequest request) { | ||
Member member = getMemberByEmail(email); | ||
Member evaluatee = getMemberById(evaluateeId); | ||
Club club = getClubById(clubId); | ||
|
||
// 해당 유저들이 해당 모임에 가입되어 있는지 확인 | ||
validateClubMember(club, member, evaluatee); | ||
ClubMember memberClubMember = getClubMember(club, member); | ||
|
||
// 평가자가 해당 멤버에게 평가한 횟수 조회 | ||
// 평가자가 해당 멤버의 평가를 2번 이상한 경우 예외 처리 | ||
long evaluationCount = mannerRepository.countByMemberAndClubMember(evaluatee, memberClubMember); | ||
if (evaluationCount >= 2) { | ||
throw new IllegalArgumentException("해당 멤버에게 2번 이상 평가할 수 없습니다."); | ||
} | ||
|
||
// 평가 점수 저장 | ||
saveEvaluation(request.getScore(), evaluatee, memberClubMember); | ||
|
||
// 평가 점수 평균 계산 및 업데이트 | ||
updateAverageMannersScore(evaluatee); | ||
|
||
// 평가자가 해당 멤버에게 평가한 횟수 반환 | ||
return new EvaluateMemberResponse((int) (evaluationCount + 1)); | ||
} | ||
|
||
public MemberRateResponse getMemberRateCountAndCount(String email, Long clubId, Long evaluateeId) { | ||
Member member = getMemberByEmail(email); | ||
Member evaluatee = getMemberById(evaluateeId); | ||
Club club = getClubById(clubId); | ||
|
||
// 해당 멤버가 해당 모임에 가입되어 있는지 확인 | ||
ClubMember memberClubMember = getClubMember(club, member); | ||
validateClubMember(club, member, evaluatee); | ||
|
||
// 해당 멤버의 평가 점수 평균 조회 | ||
double averageScore = evaluatee.getAverageMannersScore().doubleValue(); | ||
|
||
// 해당 멤버에게 평가한 횟수 조회 | ||
long evaluationCount = mannerRepository.countByMemberAndClubMember(evaluatee, memberClubMember); | ||
|
||
return MemberRateResponse.builder() | ||
.rateCount((int) evaluationCount) | ||
.userName(evaluatee.getUsername()) | ||
.averageMannersScore(BigDecimal.valueOf(averageScore)) | ||
.profileImageUrl(evaluatee.getProfileImageUrl()) | ||
.build(); | ||
} | ||
|
||
private Member getMemberByEmail(String email) { | ||
return memberRepository.findByEmail(email) | ||
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 사용자입니다.")); | ||
} | ||
|
||
private Member getMemberById(Long evaluateeId) { | ||
return memberRepository.findById(evaluateeId) | ||
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 사용자입니다.")); | ||
} | ||
|
||
private Club getClubById(Long clubId) { | ||
return clubRepository.findById(clubId) | ||
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 모임입니다.")); | ||
} | ||
|
||
private void validateClubMember(Club club, Member evaluator, Member evaluatee) { | ||
boolean isMemberJoined = club.getClubMembers().stream() | ||
.anyMatch(cm -> cm.getMember().getId().equals(evaluator.getId())); | ||
boolean isEvaluateeJoined = club.getClubMembers().stream() | ||
.anyMatch(cm -> cm.getMember().getId().equals(evaluatee.getId())); | ||
if (!isMemberJoined || !isEvaluateeJoined) { | ||
throw new IllegalArgumentException("해당 사용자는 해당 모임에 가입되어 있지 않습니다."); | ||
} | ||
} | ||
|
||
private ClubMember getClubMember(Club club, Member member) { | ||
return club.getClubMembers().stream() | ||
.filter(cm -> cm.getMember().equals(member)) | ||
.findFirst() | ||
.orElseThrow(() -> new IllegalArgumentException("해당 멤버를 클럽 멤버에서 찾을 수 없습니다.")); | ||
} | ||
|
||
private void saveEvaluation(int score, Member evaluatee, ClubMember memberClubMember) { | ||
Manner manner = Manner.builder() | ||
.score(score) | ||
.member(evaluatee) | ||
.clubMember(memberClubMember) | ||
.build(); | ||
mannerRepository.save(manner); | ||
} | ||
|
||
private void updateAverageMannersScore(Member evaluatee) { | ||
List<Manner> allMannersForEvaluatee = mannerRepository.findByMember(evaluatee); | ||
double averageScore = allMannersForEvaluatee.stream() | ||
.mapToInt(Manner::getScore) | ||
.average() | ||
.getAsDouble(); | ||
evaluatee.setAverageMannersScore(BigDecimal.valueOf(averageScore)); | ||
memberRepository.save(evaluatee); | ||
} | ||
|
||
} |