diff --git a/src/main/java/likelion/MZConnent/api/club/ClubController.java b/src/main/java/likelion/MZConnent/api/club/ClubController.java index 6157065..4900a97 100644 --- a/src/main/java/likelion/MZConnent/api/club/ClubController.java +++ b/src/main/java/likelion/MZConnent/api/club/ClubController.java @@ -12,14 +12,11 @@ import likelion.MZConnent.service.club.RegionCategoryService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/likelion/MZConnent/api/club/MyClubController.java b/src/main/java/likelion/MZConnent/api/club/MyClubController.java new file mode 100644 index 0000000..d93d926 --- /dev/null +++ b/src/main/java/likelion/MZConnent/api/club/MyClubController.java @@ -0,0 +1,35 @@ +package likelion.MZConnent.api.club; + +import likelion.MZConnent.dto.club.response.MyClubDetailResponse; +import likelion.MZConnent.dto.club.response.MyClubSimpleResponse; +import likelion.MZConnent.jwt.principle.UserPrinciple; +import likelion.MZConnent.service.club.MyClubService; +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.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RequiredArgsConstructor +@RestController +public class MyClubController { + private final MyClubService myClubService; + + @GetMapping("/api/users/clubs") + public ResponseEntity getMyClubs(@AuthenticationPrincipal UserPrinciple userPrinciple) { + MyClubSimpleResponse response = myClubService.getMyClubs(userPrinciple.getEmail()); + return ResponseEntity.ok(response); + } + + @GetMapping("/api/users/clubs/{clubId}") + public ResponseEntity getMyClubDetail(@AuthenticationPrincipal UserPrinciple userPrinciple, @PathVariable Long clubId) { + MyClubDetailResponse response = myClubService.getMyClubDetail(userPrinciple.getEmail(), clubId); + return ResponseEntity.ok(response); + } + + +} diff --git a/src/main/java/likelion/MZConnent/api/review/ReviewController.java b/src/main/java/likelion/MZConnent/api/review/ReviewController.java index 7832ef3..d1d488d 100644 --- a/src/main/java/likelion/MZConnent/api/review/ReviewController.java +++ b/src/main/java/likelion/MZConnent/api/review/ReviewController.java @@ -8,10 +8,8 @@ import likelion.MZConnent.dto.review.response.SaveReviewResponse; import likelion.MZConnent.jwt.principle.UserPrinciple; import likelion.MZConnent.service.review.ReviewService; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.PageRequest; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java new file mode 100644 index 0000000..e421164 --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/response/MyClubDetailResponse.java @@ -0,0 +1,71 @@ +package likelion.MZConnent.dto.club.response; + +import likelion.MZConnent.domain.club.ClubRole; +import likelion.MZConnent.domain.member.Age; +import likelion.MZConnent.domain.member.Gender; +import likelion.MZConnent.dto.club.SelfIntroductionDto; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@NoArgsConstructor +public class MyClubDetailResponse { + private Long clubId; + private String title; + private LocalDate meetingDate; + private String content; + private int currentParticipant; + private MyClubCultureDto culture; + private List members; + + @Builder + public MyClubDetailResponse(Long clubId, String title, LocalDate meetingDate, String content, int currentParticipant, MyClubCultureDto culture, List members) { + this.clubId = clubId; + this.title = title; + this.meetingDate = meetingDate; + this.content = content; + this.currentParticipant = currentParticipant; + this.culture = culture; + this.members = members; + } + + @Getter + @NoArgsConstructor + public static class MyClubCultureDto { + private Long cultureId; + private String name; + + @Builder + public MyClubCultureDto(Long cultureId, String name) { + this.cultureId = cultureId; + this.name = name; + } + } + + @Getter + @NoArgsConstructor + public static class MyClubMemberDto { + private Long userId; + private String username; + private String profileImageUrl; + private Age age; + private Gender gender; + private ClubRole role; + private List selfIntroductions; + + @Builder + public MyClubMemberDto(Long userId, String username, String profileImageUrl, Age age, Gender gender, ClubRole role, List selfIntroductions) { + this.userId = userId; + this.username = username; + this.profileImageUrl = profileImageUrl; + this.age = age; + this.gender = gender; + this.role = role; + this.selfIntroductions = selfIntroductions; + } + } +} diff --git a/src/main/java/likelion/MZConnent/dto/club/response/MyClubSimpleResponse.java b/src/main/java/likelion/MZConnent/dto/club/response/MyClubSimpleResponse.java new file mode 100644 index 0000000..fd7f8ce --- /dev/null +++ b/src/main/java/likelion/MZConnent/dto/club/response/MyClubSimpleResponse.java @@ -0,0 +1,43 @@ +package likelion.MZConnent.dto.club.response; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDate; +import java.util.List; + +@Slf4j +@Getter +@NoArgsConstructor +public class MyClubSimpleResponse { + private List myClubs; + + @Builder + public MyClubSimpleResponse(List myClubs) { + this.myClubs = myClubs; + } + + @Getter + @NoArgsConstructor + public static class MyClubSimpleDto { + private Long clubId; + private String title; + private String cultureName; + private LocalDate meetingDate; + private int currentParticipant; + private int maxParticipant; + + @Builder + public MyClubSimpleDto(Long clubId, String title, String cultureName, LocalDate meetingDate, int currentParticipant, int maxParticipant) { + this.clubId = clubId; + this.title = title; + this.cultureName = cultureName; + this.meetingDate = meetingDate; + this.currentParticipant = currentParticipant; + this.maxParticipant = maxParticipant; + } + + } +} diff --git a/src/main/java/likelion/MZConnent/dto/review/response/SaveReviewResponse.java b/src/main/java/likelion/MZConnent/dto/review/response/SaveReviewResponse.java index b857d79..f181259 100644 --- a/src/main/java/likelion/MZConnent/dto/review/response/SaveReviewResponse.java +++ b/src/main/java/likelion/MZConnent/dto/review/response/SaveReviewResponse.java @@ -14,7 +14,7 @@ public class SaveReviewResponse { private Long reviewId; private ReviewerDto reviewer; - private CultureDto culture; + private ReviewCultureDto culture; private String title; private String reviewImageUrl1; private String reviewImageUrl2; @@ -24,7 +24,7 @@ public class SaveReviewResponse { private int likeCount; @Builder - public SaveReviewResponse(Long reviewId, ReviewerDto reviewer, CultureDto culture, String title, String reviewImageUrl1, String reviewImageUrl2, String reviewImageUrl3, String reviewImageUrl4, LocalDateTime createdDate, int likeCount) { + public SaveReviewResponse(Long reviewId, ReviewerDto reviewer, ReviewCultureDto culture, String title, String reviewImageUrl1, String reviewImageUrl2, String reviewImageUrl3, String reviewImageUrl4, LocalDateTime createdDate, int likeCount) { this.reviewId = reviewId; this.reviewer = reviewer; this.culture = culture; @@ -54,12 +54,12 @@ public ReviewerDto(Long userId, String username, String profileImage) { @Getter @NoArgsConstructor - public static class CultureDto { + public static class ReviewCultureDto { private Long cultureId; private String cultureName; @Builder - public CultureDto(Long cultureId, String cultureName) { + public ReviewCultureDto(Long cultureId, String cultureName) { this.cultureId = cultureId; 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 new file mode 100644 index 0000000..6299c06 --- /dev/null +++ b/src/main/java/likelion/MZConnent/service/club/MyClubService.java @@ -0,0 +1,108 @@ +package likelion.MZConnent.service.club; + +import likelion.MZConnent.domain.club.Club; +import likelion.MZConnent.domain.member.Member; +import likelion.MZConnent.dto.club.SelfIntroductionDto; +import likelion.MZConnent.dto.club.response.MyClubDetailResponse; +import likelion.MZConnent.dto.club.response.MyClubSimpleResponse; +import likelion.MZConnent.repository.member.MemberRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class MyClubService { + private final MemberRepository memberRepository; + + public MyClubSimpleResponse getMyClubs(String email) { + Member member = getMemberByEmail(email); + List clubList = getClubsByMember(member); + + List myClubs = clubList.stream() + .map(this::convertToSimpleDto) + .collect(Collectors.toList()); + + return MyClubSimpleResponse.builder() + .myClubs(myClubs) + .build(); + } + + private List getClubsByMember(Member member) { + return member.getClubMembers().stream() + .map(cm -> cm.getClub()) + .collect(Collectors.toList()); + } + + private MyClubSimpleResponse.MyClubSimpleDto convertToSimpleDto(Club club) { + return MyClubSimpleResponse.MyClubSimpleDto.builder() + .clubId(club.getClubId()) + .title(club.getTitle()) + .cultureName(club.getCulture().getName()) + .meetingDate(club.getMeetingDate()) + .currentParticipant(club.getClubMembers().size()) + .maxParticipant(club.getMaxParticipant()) + .build(); + } + + public MyClubDetailResponse getMyClubDetail(String email, Long clubId) { + Member member = getMemberByEmail(email); + Club club = getClubByMemberAndId(member, clubId); + + MyClubDetailResponse.MyClubCultureDto cultureDto = convertToCultureDto(club); + List memberDtos = convertToMemberDtos(club); + + return MyClubDetailResponse.builder() + .clubId(club.getClubId()) + .title(club.getTitle()) + .meetingDate(club.getMeetingDate()) + .content(club.getContent()) + .currentParticipant(club.getClubMembers().size()) + .culture(cultureDto) + .members(memberDtos) + .build(); + } + + private Member getMemberByEmail(String email) { + return memberRepository.findByEmail(email) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 사용자입니다.")); + } + + private Club getClubByMemberAndId(Member member, Long clubId) { + return member.getClubMembers().stream() + .map(cm -> cm.getClub()) + .filter(c -> c.getClubId().equals(clubId)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당 클럽을 찾을 수 없습니다.")); + } + + private MyClubDetailResponse.MyClubCultureDto convertToCultureDto(Club club) { + return MyClubDetailResponse.MyClubCultureDto.builder() + .cultureId(club.getCulture().getCultureId()) + .name(club.getCulture().getName()) + .build(); + } + + private List convertToMemberDtos(Club club) { + return club.getClubMembers().stream() + .map(cm -> MyClubDetailResponse.MyClubMemberDto.builder() + .userId(cm.getMember().getId()) + .username(cm.getMember().getUsername()) + .profileImageUrl(cm.getMember().getProfileImageUrl()) + .age(cm.getMember().getAge()) + .gender(cm.getMember().getGender()) + .role(cm.getClubRole()) + .selfIntroductions(cm.getMember().getSelfIntroductions().stream() + .map(si -> SelfIntroductionDto.builder() + .cultureCategoryId(si.getCultureCategory().getId()) + .name(si.getCultureCategory().getName()) + .build()) + .collect(Collectors.toList())) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/likelion/MZConnent/service/review/ReviewService.java b/src/main/java/likelion/MZConnent/service/review/ReviewService.java index a9b597b..072fecc 100644 --- a/src/main/java/likelion/MZConnent/service/review/ReviewService.java +++ b/src/main/java/likelion/MZConnent/service/review/ReviewService.java @@ -101,7 +101,7 @@ private SaveReviewResponse buildSaveReviewResponse(Review review, Member member, .username(member.getUsername()) .profileImage(member.getProfileImageUrl()) .build()) - .culture(SaveReviewResponse.CultureDto.builder() + .culture(SaveReviewResponse.ReviewCultureDto.builder() .cultureId(culture.getCultureId()) .cultureName(culture.getName()) .build())