크루 가입 탈퇴 기능을 구현하다가 객체의 비교에 있어서 정리하고자한다.
// 크루에 가입이 가능한지
public boolean isJoinable(User user) { // (1)
return this.isPublished() && this.isRecruiting() && !this.users.contains(user);
}
// 크루 멤버인지
public boolean isMember(User user) { // (2)
if (this.user.equals(user)){ // 크루장인 경우
return true;
}
return this.users.contains(user); // 크루원인 경우
}
// 크루 참가 신청
@GetMapping("/crew/{id}/join")
public String joinCrew(HttpSession session, @PathVariable Long id){
User loginUser = (User) session.getAttribute("loginUser");
crewService.addUser(id, loginUser);
return "redirect:/crews/"+id;
}
// 크루 탈퇴
@GetMapping("/crew/{id}/leave")
public String leaveCrew(HttpSession session, @PathVariable Long id){
User loginUser = (User) session.getAttribute("loginUser");
crewService.leaveCrew(id, loginUser);
return "redirect:/crews/"+id;
}
// 크루 참가
public void addUser(Long id, User user){
Crew crew = crewRepository.findById(id).orElseThrow(IllegalArgumentException::new);
log.info("addUser before : isMember() = {}",crew.isMember(user));
if (crew.isJoinable(user)){
crew.addUser(user);
}
log.info("addUser after : isMember() = {}",crew.isMember(user));
}
public void leaveCrew(Long id, User user){
Crew crew = crewRepository.findById(id).orElseThrow(IllegalArgumentException::new);
log.info("leaveCrew before : isMember() = {}",crew.isMember(user)); // 왜 여기서 false지?
if (crew.isMember(user)) {
crew.removeUser(user);
}
log.info("leaveCrew after : isMember() = {}",crew.isMember(user));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(getId(), user.getId()) && Objects.equals(getName(), user.getName()) && Objects.equals(getNickname(), user.getNickname()) && Objects.equals(getPassword(), user.getPassword()) && Objects.equals(getEmail(), user.getEmail());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getName(), getNickname(), getPassword(), getEmail());
}