diff --git a/src/main/java/com/example/aboutme/app/controller/MyPageController.java b/src/main/java/com/example/aboutme/app/controller/MyPageController.java new file mode 100644 index 0000000..2d8fa0d --- /dev/null +++ b/src/main/java/com/example/aboutme/app/controller/MyPageController.java @@ -0,0 +1,35 @@ +package com.example.aboutme.app.controller; + +import com.example.aboutme.apiPayload.ApiResponse; +import com.example.aboutme.app.dto.MyPageResponse; +import com.example.aboutme.service.MemberService.MemberService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/mypages") +@RequiredArgsConstructor +@Slf4j +public class MyPageController { + + private final MemberService memberService; + + /** + * [GET] /mypages + * @param memberId 멤버 식별자 + * @return + */ + @GetMapping("") + public ApiResponse getMyPage(@RequestHeader("member-id") Long memberId){ + + MyPageResponse.GetMyPageDTO getMyPageDTO = memberService.getMyPage(memberId); + + log.info("마이페이지 조회: {}", memberId); + + return ApiResponse.onSuccess(getMyPageDTO); + } +} diff --git a/src/main/java/com/example/aboutme/app/dto/MyPageResponse.java b/src/main/java/com/example/aboutme/app/dto/MyPageResponse.java new file mode 100644 index 0000000..99310b8 --- /dev/null +++ b/src/main/java/com/example/aboutme/app/dto/MyPageResponse.java @@ -0,0 +1,46 @@ +package com.example.aboutme.app.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class MyPageResponse { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class GetMyPageDTO { + @JsonProperty("my_info") + private MyPageInfo myPageInfo; + + @JsonProperty("insight") + private MyPageInsight myPageInsight; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class MyPageInfo{ + @JsonProperty("profile_name") + private String profileName; + + @JsonProperty("space_name") + private String spaceName; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class MyPageInsight{ + @JsonProperty("profile_shared_num") + private int profileSharedNum; + + @JsonProperty("space_shared_num") + private int spaceSharedNum; + } +} diff --git a/src/main/java/com/example/aboutme/converter/MemberConverter.java b/src/main/java/com/example/aboutme/converter/MemberConverter.java index 9f5ecbc..cf1a54b 100644 --- a/src/main/java/com/example/aboutme/converter/MemberConverter.java +++ b/src/main/java/com/example/aboutme/converter/MemberConverter.java @@ -1,5 +1,6 @@ package com.example.aboutme.converter; +import com.example.aboutme.app.dto.MyPageResponse; import com.example.aboutme.app.dto.SocialInfoRequest; import com.example.aboutme.domain.Member; import com.example.aboutme.domain.constant.Social; @@ -16,4 +17,20 @@ public static Member toMember(SocialInfoRequest.GoogleDTO googleDTO, Social soci .jwtAccessToken(token).build(); } + public static MyPageResponse.GetMyPageDTO toGetMyPageDTO (String profileName, String spaceName, int profileSharedNum, int spaceSharedNum){ + MyPageResponse.MyPageInfo myPageInfo = MyPageResponse.MyPageInfo.builder() + .profileName(profileName) + .spaceName(spaceName) + .build(); + + MyPageResponse.MyPageInsight myPageInsight = MyPageResponse.MyPageInsight.builder() + .profileSharedNum(profileSharedNum) + .spaceSharedNum(spaceSharedNum) + .build(); + + return MyPageResponse.GetMyPageDTO.builder() + .myPageInfo(myPageInfo) + .myPageInsight(myPageInsight) + .build(); + } } diff --git a/src/main/java/com/example/aboutme/repository/MemberProfileRepository.java b/src/main/java/com/example/aboutme/repository/MemberProfileRepository.java index ecf9d41..c94ae4c 100644 --- a/src/main/java/com/example/aboutme/repository/MemberProfileRepository.java +++ b/src/main/java/com/example/aboutme/repository/MemberProfileRepository.java @@ -4,6 +4,8 @@ import com.example.aboutme.domain.Profile; import com.example.aboutme.domain.mapping.MemberProfile; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; @@ -17,5 +19,17 @@ public interface MemberProfileRepository extends JpaRepository findByMemberAndProfileInAndApprovedIsTrue(Member member, List profileList); + } diff --git a/src/main/java/com/example/aboutme/repository/MemberRepository.java b/src/main/java/com/example/aboutme/repository/MemberRepository.java index dda6f2c..cc288c9 100644 --- a/src/main/java/com/example/aboutme/repository/MemberRepository.java +++ b/src/main/java/com/example/aboutme/repository/MemberRepository.java @@ -1,8 +1,10 @@ package com.example.aboutme.repository; +import com.example.aboutme.app.dto.MyPageResponse; import com.example.aboutme.domain.Member; import com.example.aboutme.domain.constant.Social; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface MemberRepository extends JpaRepository { Member findByEmailAndSocial(String email, Social social); diff --git a/src/main/java/com/example/aboutme/repository/MemberSpaceRepository.java b/src/main/java/com/example/aboutme/repository/MemberSpaceRepository.java index 3e2fa0c..7794119 100644 --- a/src/main/java/com/example/aboutme/repository/MemberSpaceRepository.java +++ b/src/main/java/com/example/aboutme/repository/MemberSpaceRepository.java @@ -5,6 +5,8 @@ import com.example.aboutme.domain.Space; import com.example.aboutme.domain.mapping.MemberSpace; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; @@ -13,4 +15,13 @@ public interface MemberSpaceRepository extends JpaRepository List findByMemberAndSpace_NicknameContaining(Member member, String keyword); + /** + * 내 마이스페이스 공유 현황 (내 마이스페이스가 상대방의 보관함에 얼마나 저장되었는지) + * @param member 조회하려는 멤버 + * @return 공유된 마이스페이스 개수 + */ + @Query("select count(*)" + + "from MemberSpace ms join Space s on ms.space = s " + + "where s.member = :member") + Integer countSharedSpaceByMember(@Param("member") Member member); } diff --git a/src/main/java/com/example/aboutme/repository/ProfileFeatureRepository.java b/src/main/java/com/example/aboutme/repository/ProfileFeatureRepository.java index 88ffc6f..e47546b 100644 --- a/src/main/java/com/example/aboutme/repository/ProfileFeatureRepository.java +++ b/src/main/java/com/example/aboutme/repository/ProfileFeatureRepository.java @@ -1,10 +1,21 @@ package com.example.aboutme.repository; +import com.example.aboutme.domain.Member; import com.example.aboutme.domain.ProfileFeature; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface ProfileFeatureRepository extends JpaRepository { List findByProfileKeyAndProfileValueContaining(String profileKey, String profileValue); + + @Query("select pf.profileValue " + + "from Profile p " + + "join ProfileFeature pf on p = pf.profile " + + "where pf.profileKey = 'name' and p.member = :member " + + "order by p.isDefault desc, p.createdAt asc ") + List findProfileFeature(@Param("member") Member member, Pageable pageable); } diff --git a/src/main/java/com/example/aboutme/repository/ProfileRepository.java b/src/main/java/com/example/aboutme/repository/ProfileRepository.java index 184d27f..572bb36 100644 --- a/src/main/java/com/example/aboutme/repository/ProfileRepository.java +++ b/src/main/java/com/example/aboutme/repository/ProfileRepository.java @@ -2,7 +2,10 @@ import com.example.aboutme.domain.Member; import com.example.aboutme.domain.Profile; +import com.example.aboutme.domain.ProfileFeature; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import javax.persistence.criteria.CriteriaBuilder; import java.util.List; diff --git a/src/main/java/com/example/aboutme/service/MemberService/MemberService.java b/src/main/java/com/example/aboutme/service/MemberService/MemberService.java index eafe269..3edb310 100644 --- a/src/main/java/com/example/aboutme/service/MemberService/MemberService.java +++ b/src/main/java/com/example/aboutme/service/MemberService/MemberService.java @@ -1,5 +1,6 @@ package com.example.aboutme.service.MemberService; +import com.example.aboutme.app.dto.MyPageResponse; import com.example.aboutme.domain.Member; import org.springframework.stereotype.Service; @@ -9,4 +10,10 @@ public interface MemberService { Member findMember(Long memberId); void deleteMember(Long memberId); + /** + * 마이페이지 조회 + * @param memberId 멤버 식별자 + * @return 마이프로필 정보 + */ + MyPageResponse.GetMyPageDTO getMyPage(Long memberId); } diff --git a/src/main/java/com/example/aboutme/service/MemberService/MemberServiceImpl.java b/src/main/java/com/example/aboutme/service/MemberService/MemberServiceImpl.java index 520429c..ab2b348 100644 --- a/src/main/java/com/example/aboutme/service/MemberService/MemberServiceImpl.java +++ b/src/main/java/com/example/aboutme/service/MemberService/MemberServiceImpl.java @@ -2,9 +2,12 @@ import com.example.aboutme.apiPayload.code.status.ErrorStatus; import com.example.aboutme.apiPayload.exception.GeneralException; +import com.example.aboutme.app.dto.MyPageResponse; +import com.example.aboutme.converter.MemberConverter; import com.example.aboutme.domain.Member; -import com.example.aboutme.repository.MemberRepository; +import com.example.aboutme.repository.*; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +17,9 @@ public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; + private final ProfileFeatureRepository profileFeatureRepository; + private final MemberProfileRepository memberProfileRepository; + private final MemberSpaceRepository memberSpaceRepository; public Member findMember(Long memberId){ return memberRepository.findById(memberId).orElseThrow( @@ -26,4 +32,21 @@ public void deleteMember(Long memberId){ findMember(memberId); memberRepository.deleteById(memberId); } + + /** + * 마이페이지 조회 + * @param memberId 멤버 식별자 + * @return 마이프로필 정보 + */ + public MyPageResponse.GetMyPageDTO getMyPage(Long memberId){ + Member member = findMember(memberId); + + String profileName = profileFeatureRepository.findProfileFeature(member, PageRequest.of(0,1)).get(0); + String spaceName = member.getSpace() != null ? member.getSpace().getNickname() : null; + + int profileSharedNum = memberProfileRepository.countSharedProfileByMember(member); + int spaceSharedNum = memberSpaceRepository.countSharedSpaceByMember(member); + + return MemberConverter.toGetMyPageDTO(profileName, spaceName, profileSharedNum, spaceSharedNum); + } }