From e8cb4c6ea22b25b9b58e4ea85586e2f77ca9043b Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 6 Sep 2024 23:39:09 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/GetMemberProfileResponse.kt | 9 ++++++ .../sodalive/member/MemberController.kt | 10 +++++++ .../sodalive/member/MemberRepository.kt | 28 ++++++++++++++++++- .../sodalive/member/MemberService.kt | 4 +++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/GetMemberProfileResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/GetMemberProfileResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/GetMemberProfileResponse.kt new file mode 100644 index 0000000..dc4bbe8 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/GetMemberProfileResponse.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.member + +import com.querydsl.core.annotations.QueryProjection + +data class GetMemberProfileResponse @QueryProjection constructor( + val memberId: Long, + val profileImageUrl: String, + val isBlocked: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt index 91da556..e3312d7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt @@ -10,6 +10,7 @@ import org.springframework.data.domain.Pageable import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.security.core.userdetails.User import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody @@ -240,4 +241,13 @@ class MemberController(private val service: MemberService) { fun forgotPassword( @RequestBody request: ForgotPasswordRequest ) = ApiResponse.ok(service.forgotPassword(request)) + + @GetMapping("/profile/{id}") + fun getMemberProfile( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + ApiResponse.ok(service.getMemberProfile(memberId = id, myMemberId = member.id!!)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt index 177b2d2..239f5ef 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -8,10 +8,12 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.auth.QAuth.auth import kr.co.vividnext.sodalive.member.block.BlockMemberRepository +import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember import kr.co.vividnext.sodalive.member.following.QCreatorFollowing.creatorFollowing import kr.co.vividnext.sodalive.member.nickname.QNicknameChangeLog.nicknameChangeLog import kr.co.vividnext.sodalive.member.notification.QMemberNotification.memberNotification import kr.co.vividnext.sodalive.message.QMessage.message +import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository @@ -54,12 +56,17 @@ interface MemberQueryRepository { fun getChangeNoticeRecipientPushTokens(creatorId: Long): Map>> fun getPushTokenFromReservationList(roomId: Long): Map>> + + fun getMemberProfile(memberId: Long, myMemberId: Long): GetMemberProfileResponse } @Repository class MemberQueryRepositoryImpl( private val queryFactory: JPAQueryFactory, - private val blockMemberRepository: BlockMemberRepository + private val blockMemberRepository: BlockMemberRepository, + + @Value("\${cloud.aws.cloud-front.host}") + private val cloudFrontHost: String ) : MemberQueryRepository { override fun findByPushToken(pushToken: String): List { return queryFactory @@ -415,4 +422,23 @@ class MemberQueryRepositoryImpl( return mapOf("aos" to aosPushTokens, "ios" to iosPushTokens) } + + override fun getMemberProfile(memberId: Long, myMemberId: Long): GetMemberProfileResponse { + return queryFactory + .select( + QGetMemberProfileResponse( + member.id, + member.profileImage.prepend("/").prepend(cloudFrontHost), + blockMember.id.isNotNull + ) + ) + .from(member) + .leftJoin(blockMember) + .on( + member.id.eq(blockMember.blockedMember.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.member.id.eq(memberId)) + ) + .fetchFirst() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index e658ba2..e1a96fc 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -622,6 +622,10 @@ class MemberService( ) } + fun getMemberProfile(memberId: Long, myMemberId: Long): GetMemberProfileResponse { + return repository.getMemberProfile(memberId, myMemberId) + } + private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock { return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() } }