From 10323026aec828716deb47224243c7df4567efd5 Mon Sep 17 00:00:00 2001 From: oosedus Date: Wed, 31 Jul 2024 16:19:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EB=82=98=EC=9D=98=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=20=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=95=B4=EB=8B=B9=20=EB=A9=A4=EB=B2=84=20id?= =?UTF-8?q?=EB=8F=84=20=EC=A0=84=EB=8B=AC=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MZConnent/dto/club/response/MyClubDetailResponse.java | 4 +++- .../java/likelion/MZConnent/service/club/MyClubService.java | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java index e421164..b37f49b 100644 --- a/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java +++ b/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java @@ -14,6 +14,7 @@ @Getter @NoArgsConstructor public class MyClubDetailResponse { + private Long memberId; private Long clubId; private String title; private LocalDate meetingDate; @@ -23,7 +24,8 @@ public class MyClubDetailResponse { private List members; @Builder - public MyClubDetailResponse(Long clubId, String title, LocalDate meetingDate, String content, int currentParticipant, MyClubCultureDto culture, List members) { + public MyClubDetailResponse(Long memberId, Long clubId, String title, LocalDate meetingDate, String content, int currentParticipant, MyClubCultureDto culture, List members) { + this.memberId = memberId; this.clubId = clubId; this.title = title; this.meetingDate = meetingDate; diff --git a/src/main/java/likelion/MZConnent/service/club/MyClubService.java b/src/main/java/likelion/MZConnent/service/club/MyClubService.java index 62e18c0..975cfbe 100644 --- a/src/main/java/likelion/MZConnent/service/club/MyClubService.java +++ b/src/main/java/likelion/MZConnent/service/club/MyClubService.java @@ -51,6 +51,7 @@ public MyClubDetailResponse getMyClubDetail(String email, Long clubId) { List memberDtos = convertToMemberDtos(club); return MyClubDetailResponse.builder() + .memberId(member.getId()) .clubId(club.getClubId()) .title(club.getTitle()) .meetingDate(club.getMeetingDate()) From 443e08a3654de7debee4e21de7bf34a94ca23442 Mon Sep 17 00:00:00 2001 From: oosedus Date: Wed, 31 Jul 2024 23:31:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=AA=A8=EC=9E=84=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MZConnent/api/club/MyClubController.java | 12 ++- .../club/request/UpdateClubInfoRequest.java | 20 +++++ .../club/response/UpdateClubInfoResponse.java | 34 ++++++++ .../MZConnent/service/club/MyClubService.java | 87 ++++++++++++++++++- 4 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/main/java/likelion/MZConnent/dto/club/request/UpdateClubInfoRequest.java create mode 100644 src/main/java/likelion/MZConnent/dto/club/response/UpdateClubInfoResponse.java diff --git a/src/main/java/likelion/MZConnent/api/club/MyClubController.java b/src/main/java/likelion/MZConnent/api/club/MyClubController.java index e711a49..760fefb 100644 --- a/src/main/java/likelion/MZConnent/api/club/MyClubController.java +++ b/src/main/java/likelion/MZConnent/api/club/MyClubController.java @@ -1,10 +1,8 @@ package likelion.MZConnent.api.club; import likelion.MZConnent.dto.club.request.EvaluateMemberRequest; -import likelion.MZConnent.dto.club.response.EvaluateMemberResponse; -import likelion.MZConnent.dto.club.response.MemberRateResponse; -import likelion.MZConnent.dto.club.response.MyClubDetailResponse; -import likelion.MZConnent.dto.club.response.MyClubSimpleResponse; +import likelion.MZConnent.dto.club.request.UpdateClubInfoRequest; +import likelion.MZConnent.dto.club.response.*; import likelion.MZConnent.jwt.principle.UserPrinciple; import likelion.MZConnent.service.club.MyClubService; import likelion.MZConnent.service.club.RateService; @@ -65,4 +63,10 @@ public ResponseEntity leaveClub(@AuthenticationPrincipal UserPrinciple userPrinc myClubService.leaveClub(userPrinciple.getEmail(), clubId); return ResponseEntity.ok(Map.of("messege","모임 탈퇴 성공")); } + + @PutMapping("/api/clubs/{clubId}") + public ResponseEntity updateClubInfo(@AuthenticationPrincipal UserPrinciple userPrinciple, @PathVariable Long clubId, @RequestBody UpdateClubInfoRequest request){ + UpdateClubInfoResponse response = myClubService.updateClubInfo(userPrinciple.getEmail(), clubId, request); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/likelion/MZConnent/dto/club/request/UpdateClubInfoRequest.java b/src/main/java/likelion/MZConnent/dto/club/request/UpdateClubInfoRequest.java new file mode 100644 index 0000000..d992787 --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/request/UpdateClubInfoRequest.java @@ -0,0 +1,20 @@ +package likelion.MZConnent.dto.club.request; + +import likelion.MZConnent.domain.club.AgeRestriction; +import likelion.MZConnent.domain.club.GenderRestriction; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor +public class UpdateClubInfoRequest { + private String title; + private LocalDate meetingDate; + private String content; + private GenderRestriction genderRestriction; + private AgeRestriction ageRestriction; + private Integer maxParticipant; + +} diff --git a/src/main/java/likelion/MZConnent/dto/club/response/UpdateClubInfoResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/UpdateClubInfoResponse.java new file mode 100644 index 0000000..532513c --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/response/UpdateClubInfoResponse.java @@ -0,0 +1,34 @@ +package likelion.MZConnent.dto.club.response; + +import likelion.MZConnent.domain.club.AgeRestriction; +import likelion.MZConnent.domain.club.GenderRestriction; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor +public class UpdateClubInfoResponse { + private Long clubId; + private String title; + private LocalDate meetingDate; + private String content; + private GenderRestriction genderRestriction; + private AgeRestriction ageRestriction; + private int maxParticipant; + private String cultureName; + + @Builder + public UpdateClubInfoResponse(Long clubId, String title, LocalDate meetingDate, String content, GenderRestriction genderRestriction, AgeRestriction ageRestriction, int maxParticipant, String cultureName){ + this.clubId = clubId; + this.title = title; + this.meetingDate = meetingDate; + this.content = content; + this.genderRestriction = genderRestriction; + this.ageRestriction = ageRestriction; + this.maxParticipant = maxParticipant; + this.cultureName = cultureName; + } +} diff --git a/src/main/java/likelion/MZConnent/service/club/MyClubService.java b/src/main/java/likelion/MZConnent/service/club/MyClubService.java index 975cfbe..59100f1 100644 --- a/src/main/java/likelion/MZConnent/service/club/MyClubService.java +++ b/src/main/java/likelion/MZConnent/service/club/MyClubService.java @@ -1,14 +1,14 @@ 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.club.ClubRole; +import likelion.MZConnent.domain.club.*; import likelion.MZConnent.domain.manner.Manner; import likelion.MZConnent.domain.member.Member; import likelion.MZConnent.dto.club.SelfIntroductionDto; +import likelion.MZConnent.dto.club.request.UpdateClubInfoRequest; import likelion.MZConnent.dto.club.response.MyClubDetailResponse; import likelion.MZConnent.dto.club.response.MyClubSimpleResponse; +import likelion.MZConnent.dto.club.response.UpdateClubInfoResponse; import likelion.MZConnent.repository.club.ClubMemberRepository; import likelion.MZConnent.repository.club.ClubRepository; import likelion.MZConnent.repository.manner.MannerRepository; @@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @@ -121,6 +122,86 @@ public void leaveClub(String email, Long clubId) { clubRepository.save(club); } + public UpdateClubInfoResponse updateClubInfo(String email, Long clubId, UpdateClubInfoRequest request) { + Member member = getMemberByEmail(email); + Club club = getClubById(clubId); + getClubMemberByMemberAndId(member, clubId); + + validateRequest(request, club); + + updateClubFields(club, request); + + clubRepository.save(club); + + return buildUpdateClubInfoResponse(club); + } + + // request 값들 중에 예외처리가 필요한 것들이 있는지 확인 + private void validateRequest(UpdateClubInfoRequest request, Club club) { + if (request.getTitle() == null || request.getTitle().isEmpty()) { + throw new IllegalArgumentException("제목 값이 비어있습니다."); + } + if (request.getMeetingDate() == null || request.getMeetingDate().isBefore(LocalDate.now())) { + throw new IllegalArgumentException("모임 날짜 값이 현재 날짜보다 과거로 설정되어 있습니다."); + } + if (request.getContent() == null || request.getContent().isEmpty()) { + throw new IllegalArgumentException("내용 값이 비어있습니다."); + } + if (request.getAgeRestriction() == null) { + throw new IllegalArgumentException("나이 제한 값이 비어있습니다."); + } + if ((request.getAgeRestriction() != AgeRestriction.ALL) && isAgeRestrictionConflict(request.getAgeRestriction(), club)) { + throw new IllegalArgumentException("현재 멤버들 중에 수정한 나이 제한인 값이 존재합니다."); + } + if (request.getGenderRestriction() == null) { + throw new IllegalArgumentException("성별 제한 값이 비어있습니다."); + } + if ((request.getGenderRestriction() != GenderRestriction.ALL) && isGenderRestrictionConflict(request.getGenderRestriction(), club)) { + throw new IllegalArgumentException("현재 멤버들 중에 수정한 성별 제한인 값이 존재합니다."); + } + if (request.getMaxParticipant() != null && request.getMaxParticipant() < 2) { + throw new IllegalArgumentException("최대 인원 값이 2 미만으로 설정되어 있습니다."); + } + if (request.getMaxParticipant() != null && request.getMaxParticipant() < club.getClubMembers().size()) { + throw new IllegalArgumentException("현재 인원보다 적게 설정되어 있습니다."); + } + } + + private boolean isGenderRestrictionConflict(GenderRestriction genderRestriction, Club club) { + return club.getClubMembers().stream() + .anyMatch(cm -> !cm.getMember().getGender().toString().equals(genderRestriction.toString())); + } + + private boolean isAgeRestrictionConflict(AgeRestriction ageRestriction, Club club) { + return club.getClubMembers().stream() + .anyMatch(cm -> !cm.getMember().getAge().toString().equals(ageRestriction.toString())); + } + + // 클럽 필드 업데이트 + private void updateClubFields(Club club, UpdateClubInfoRequest request) { + club.setTitle(request.getTitle()); + club.setMeetingDate(request.getMeetingDate()); + club.setContent(request.getContent()); + club.setGenderRestriction(request.getGenderRestriction()); + if (request.getMaxParticipant() != null) { + club.setMaxParticipant(request.getMaxParticipant()); + } + } + + // UpdateClubInfoResponse 빌드 + private UpdateClubInfoResponse buildUpdateClubInfoResponse(Club club) { + return UpdateClubInfoResponse.builder() + .clubId(club.getClubId()) + .title(club.getTitle()) + .meetingDate(club.getMeetingDate()) + .content(club.getContent()) + .ageRestriction(club.getAgeRestriction()) + .genderRestriction(club.getGenderRestriction()) + .maxParticipant(club.getMaxParticipant()) + .cultureName(club.getCulture().getName()) + .build(); + } + private List getClubsByMember(Member member) { return member.getClubMembers().stream() .map(ClubMember::getClub) From 51f4075535333d5b935e1ed02bc69a66add5fd5c Mon Sep 17 00:00:00 2001 From: oosedus Date: Thu, 1 Aug 2024 01:59:19 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=EB=AA=A8=EC=9E=84=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EC=9E=91=EC=84=B1=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MZConnent/api/club/ChatController.java | 32 +++++ .../dto/club/request/SendChatRequest.java | 10 ++ .../dto/club/response/MyClubChatResponse.java | 58 +++++++++ .../dto/club/response/SendChatResponse.java | 26 ++++ .../repository/chat/ChatRepository.java | 4 + .../MZConnent/service/club/ChatService.java | 121 ++++++++++++++++++ 6 files changed, 251 insertions(+) create mode 100644 src/main/java/likelion/MZConnent/api/club/ChatController.java create mode 100644 src/main/java/likelion/MZConnent/dto/club/request/SendChatRequest.java create mode 100644 src/main/java/likelion/MZConnent/dto/club/response/MyClubChatResponse.java create mode 100644 src/main/java/likelion/MZConnent/dto/club/response/SendChatResponse.java create mode 100644 src/main/java/likelion/MZConnent/service/club/ChatService.java diff --git a/src/main/java/likelion/MZConnent/api/club/ChatController.java b/src/main/java/likelion/MZConnent/api/club/ChatController.java new file mode 100644 index 0000000..449c729 --- /dev/null +++ b/src/main/java/likelion/MZConnent/api/club/ChatController.java @@ -0,0 +1,32 @@ +package likelion.MZConnent.api.club; + +import likelion.MZConnent.dto.club.request.SendChatRequest; +import likelion.MZConnent.dto.club.response.MyClubChatResponse; +import likelion.MZConnent.dto.club.response.SendChatResponse; +import likelion.MZConnent.jwt.principle.UserPrinciple; +import likelion.MZConnent.service.club.ChatService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ChatController { + private final ChatService chatService; + + @GetMapping("/api/club/{clubId}/chats") + public ResponseEntity getClubChats(@AuthenticationPrincipal UserPrinciple userPrinciple, @PathVariable Long clubId) { + MyClubChatResponse response = chatService.getClubChats(userPrinciple.getEmail(), clubId); + return ResponseEntity.ok(response); + } + + @PostMapping("/api/club/{clubId}/chats") + public ResponseEntity sendChat(@AuthenticationPrincipal UserPrinciple userPrinciple, @PathVariable Long clubId, @RequestBody SendChatRequest request) { + SendChatResponse response = chatService.sendChat(userPrinciple.getEmail(), clubId, request); + return ResponseEntity.ok(response); + } + +} diff --git a/src/main/java/likelion/MZConnent/dto/club/request/SendChatRequest.java b/src/main/java/likelion/MZConnent/dto/club/request/SendChatRequest.java new file mode 100644 index 0000000..1f7a41e --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/request/SendChatRequest.java @@ -0,0 +1,10 @@ +package likelion.MZConnent.dto.club.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class SendChatRequest { + private String content; +} diff --git a/src/main/java/likelion/MZConnent/dto/club/response/MyClubChatResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/MyClubChatResponse.java new file mode 100644 index 0000000..bc039c2 --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/response/MyClubChatResponse.java @@ -0,0 +1,58 @@ +package likelion.MZConnent.dto.club.response; + +import likelion.MZConnent.domain.club.ClubRole; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@NoArgsConstructor +public class MyClubChatResponse { + private Long clubId; + private Long memberId; + private String title; + private LocalDate meetingDate; + private String content; + private String cultureName; + private Long leaderId; + private List chats; + + @Builder + public MyClubChatResponse(Long clubId, Long memberId, String title, LocalDate meetingDate, String content, String cultureName, Long leaderId, List chats) { + this.clubId = clubId; + this.memberId = memberId; + this.title = title; + this.meetingDate = meetingDate; + this.content = content; + this.cultureName = cultureName; + this.leaderId = leaderId; + this.chats = chats; + } + + @Getter + @NoArgsConstructor + public static class ChatDto { + private Long chatId; + private LocalDateTime createdDate; + private String content; + private Long memberId; + private String userName; + private String memberProfileUrl; + private ClubRole role; + + @Builder + public ChatDto(Long chatId, LocalDateTime createdDate, String content, Long memberId, String userName, String memberProfileUrl, ClubRole role) { + this.chatId = chatId; + this.createdDate = createdDate; + this.content = content; + this.memberId = memberId; + this.userName = userName; + this.memberProfileUrl = memberProfileUrl; + this.role = role; + } + } +} diff --git a/src/main/java/likelion/MZConnent/dto/club/response/SendChatResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/SendChatResponse.java new file mode 100644 index 0000000..cfc6c4f --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/response/SendChatResponse.java @@ -0,0 +1,26 @@ +package likelion.MZConnent.dto.club.response; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +public class SendChatResponse { + private Long chatId; + private LocalDateTime createdDate; + private String content; + private Long memberId; + private Long clubId; + + @Builder + public SendChatResponse(Long chatId, LocalDateTime createdDate, String content, Long memberId, Long clubId) { + this.chatId = chatId; + this.createdDate = createdDate; + this.content = content; + this.memberId = memberId; + this.clubId = clubId; + } +} diff --git a/src/main/java/likelion/MZConnent/repository/chat/ChatRepository.java b/src/main/java/likelion/MZConnent/repository/chat/ChatRepository.java index 410d7a0..d36fa64 100644 --- a/src/main/java/likelion/MZConnent/repository/chat/ChatRepository.java +++ b/src/main/java/likelion/MZConnent/repository/chat/ChatRepository.java @@ -1,9 +1,13 @@ package likelion.MZConnent.repository.chat; import likelion.MZConnent.domain.chat.Chat; +import likelion.MZConnent.domain.club.Club; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ChatRepository extends JpaRepository { + List findByClubOrderByCreatedDateDesc(Club club); } diff --git a/src/main/java/likelion/MZConnent/service/club/ChatService.java b/src/main/java/likelion/MZConnent/service/club/ChatService.java new file mode 100644 index 0000000..a73e0db --- /dev/null +++ b/src/main/java/likelion/MZConnent/service/club/ChatService.java @@ -0,0 +1,121 @@ +package likelion.MZConnent.service.club; + +import jakarta.transaction.Transactional; +import likelion.MZConnent.domain.chat.Chat; +import likelion.MZConnent.domain.club.Club; +import likelion.MZConnent.domain.club.ClubMember; +import likelion.MZConnent.domain.club.ClubRole; +import likelion.MZConnent.domain.member.Member; +import likelion.MZConnent.dto.club.request.SendChatRequest; +import likelion.MZConnent.dto.club.response.MyClubChatResponse; +import likelion.MZConnent.dto.club.response.SendChatResponse; +import likelion.MZConnent.repository.chat.ChatRepository; +import likelion.MZConnent.repository.club.ClubRepository; +import likelion.MZConnent.repository.member.MemberRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +@Slf4j +public class ChatService { + private final ChatRepository chatRepository; + private final ClubRepository clubRepository; + private final MemberRepository memberRepository; + + public MyClubChatResponse getClubChats(String email, Long clubId) { + Member member = getMemberByEmail(email); + Club club = getClubById(clubId); + validateClubMember(club, member); + + List chats = chatRepository.findByClubOrderByCreatedDateDesc(club); + ClubMember clubLeader = getClubLeader(club); + + return MyClubChatResponse.builder() + .clubId(clubId) + .memberId(member.getId()) + .title(club.getTitle()) + .meetingDate(club.getMeetingDate()) + .content(club.getContent()) + .cultureName(club.getCulture().getName()) + .leaderId(clubLeader.getMember().getId()) + .chats(chats.stream().map(this::convertToChatDto).collect(Collectors.toList())) + .build(); + } + + public SendChatResponse sendChat(String email, Long clubId, SendChatRequest request) { + Member member = getMemberByEmail(email); + Club club = getClubById(clubId); + validateClubMember(club, member); + + Chat chat = Chat.builder() + .createdDate(LocalDateTime.now()) + .content(request.getContent()) + .club(club) + .member(member) + .build(); + + chatRepository.save(chat); + + return SendChatResponse.builder() + .chatId(chat.getChatId()) + .createdDate(chat.getCreatedDate()) + .content(chat.getContent()) + .memberId(chat.getMember().getId()) + .clubId(chat.getClub().getClubId()) + .build(); + } + + private Member getMemberByEmail(String email) { + return memberRepository.findByEmail(email) + .orElseThrow(() -> new IllegalArgumentException("해당 사용자가 존재하지 않습니다.")); + } + + private Club getClubById(Long clubId) { + return clubRepository.findById(clubId) + .orElseThrow(() -> new IllegalArgumentException("해당 동아리가 존재하지 않습니다.")); + } + + private void validateClubMember(Club club, Member member) { + boolean isMemberOfClub = club.getClubMembers().stream() + .anyMatch(cm -> cm.getMember().getId().equals(member.getId())); + if (!isMemberOfClub) { + throw new IllegalArgumentException("해당 멤버는 해당 클럽의 멤버가 아닙니다."); + } + } + + private ClubMember getClubLeader(Club club) { + return club.getClubMembers().stream() + .filter(m -> m.getClubRole().equals(ClubRole.LEADER)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("동아리장이 존재하지 않습니다.")); + } + + private MyClubChatResponse.ChatDto convertToChatDto(Chat chat) { + ClubMember chatMember = getChatMember(chat); + return MyClubChatResponse.ChatDto.builder() + .chatId(chat.getChatId()) + .createdDate(chat.getCreatedDate()) + .content(chat.getContent()) + .memberId(chat.getMember().getId()) + .userName(chat.getMember().getUsername()) + .memberProfileUrl(chat.getMember().getProfileImageUrl()) + .role(chatMember.getClubRole()) + .build(); + } + + private ClubMember getChatMember(Chat chat) { + ClubMember chatMember = chat.getClub().getClubMembers().stream() + .filter(cm -> cm.getMember().getId().equals(chat.getMember().getId())) + .findFirst() + .orElse(null); + + return chatMember; + } +}