feat(profile): 카카오 오픈채팅 URL 필드로 프로필 응답과 수정을 통일한다
This commit is contained in:
19
docs/20260224_SNS카카오오픈채팅전환.md
Normal file
19
docs/20260224_SNS카카오오픈채팅전환.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
## 구현 항목
|
||||||
|
|
||||||
|
- [x] SNS 응답/요청 DTO 전수 점검 후 `blogUrl` 제거
|
||||||
|
- [x] SNS 응답/요청 DTO에 `kakaoOpenChatUrl` 추가
|
||||||
|
- [x] 기존 `websiteUrl` 입력/반환 값을 `kakaoOpenChatUrl`로 동일 매핑
|
||||||
|
- [x] 회원 정보 수정 API(`ProfileUpdateRequest`, `MemberService.profileUpdate`) 반영
|
||||||
|
- [x] SNS 정보를 반환하는 API 응답(`ProfileResponse`, `MyPageResponse`, `CreatorResponse`, `GetCreatorDetailResponse`, `GetLiveRoomUserProfileResponse`, `GetRoomDetailManager`) 반영
|
||||||
|
- [x] LSP 진단/테스트/빌드 검증 및 결과 기록
|
||||||
|
|
||||||
|
## 검증 기록
|
||||||
|
|
||||||
|
- 1차 구현
|
||||||
|
- 무엇을: SNS 필드를 `instagramUrl`, `fancimmUrl`, `xUrl`, `youtubeUrl`, `kakaoOpenChatUrl` 구조로 통일하고 `blogUrl`을 API 요청/응답 계층에서 제거했다. `kakaoOpenChatUrl`은 기존 `member.websiteUrl` 컬럼 값을 그대로 사용하도록 매핑했다.
|
||||||
|
- 왜: DB/Entity 변경 없이 기존 `websiteUrl` 저장 데이터를 카카오 오픈채팅 링크로 재해석해 노출하고, 더 이상 사용하지 않는 `blogUrl`을 API 스펙에서 제거하기 위해서다.
|
||||||
|
- 어떻게:
|
||||||
|
- 코드 반영: `ProfileUpdateRequest`, `ProfileResponse`, `MyPageResponse`, `CreatorResponse`, `GetCreatorDetailResponse`, `GetLiveRoomUserProfileResponse`, `GetRoomDetailResponse`, `MemberService`, `ExplorerService`, `LiveRoomService`
|
||||||
|
- 정적 진단: `lsp_diagnostics` 실행 시 `.kt` LSP 미구성으로 불가(환경 제약 확인)
|
||||||
|
- 동작 검증: `./gradlew test && ./gradlew build` 실행
|
||||||
|
- 결과: `BUILD SUCCESSFUL` (test 성공 후 build 성공)
|
||||||
@@ -10,8 +10,7 @@ data class CreatorResponse(
|
|||||||
val fancimmUrl: String? = null,
|
val fancimmUrl: String? = null,
|
||||||
val xUrl: String? = null,
|
val xUrl: String? = null,
|
||||||
val youtubeUrl: String? = null,
|
val youtubeUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val kakaoOpenChatUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
|
||||||
val isFollow: Boolean,
|
val isFollow: Boolean,
|
||||||
val isNotify: Boolean,
|
val isNotify: Boolean,
|
||||||
val isNotification: Boolean,
|
val isNotification: Boolean,
|
||||||
|
|||||||
@@ -248,8 +248,7 @@ class ExplorerService(
|
|||||||
fancimmUrl = creatorAccount.fancimmUrl,
|
fancimmUrl = creatorAccount.fancimmUrl,
|
||||||
xUrl = creatorAccount.xUrl,
|
xUrl = creatorAccount.xUrl,
|
||||||
youtubeUrl = creatorAccount.youtubeUrl,
|
youtubeUrl = creatorAccount.youtubeUrl,
|
||||||
websiteUrl = creatorAccount.websiteUrl,
|
kakaoOpenChatUrl = creatorAccount.websiteUrl
|
||||||
blogUrl = creatorAccount.blogUrl
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,8 +450,7 @@ class ExplorerService(
|
|||||||
fancimmUrl = creatorAccount.fancimmUrl,
|
fancimmUrl = creatorAccount.fancimmUrl,
|
||||||
xUrl = creatorAccount.xUrl,
|
xUrl = creatorAccount.xUrl,
|
||||||
youtubeUrl = creatorAccount.youtubeUrl,
|
youtubeUrl = creatorAccount.youtubeUrl,
|
||||||
websiteUrl = creatorAccount.websiteUrl,
|
kakaoOpenChatUrl = creatorAccount.websiteUrl,
|
||||||
blogUrl = creatorAccount.blogUrl,
|
|
||||||
isFollow = creatorFollowing?.isFollow ?: false,
|
isFollow = creatorFollowing?.isFollow ?: false,
|
||||||
isNotify = creatorFollowing?.isNotify ?: false,
|
isNotify = creatorFollowing?.isNotify ?: false,
|
||||||
isNotification = creatorFollowing?.isFollow ?: false,
|
isNotification = creatorFollowing?.isFollow ?: false,
|
||||||
|
|||||||
@@ -10,6 +10,5 @@ data class GetCreatorDetailResponse(
|
|||||||
val fancimmUrl: String,
|
val fancimmUrl: String,
|
||||||
val xUrl: String,
|
val xUrl: String,
|
||||||
val youtubeUrl: String,
|
val youtubeUrl: String,
|
||||||
val websiteUrl: String,
|
val kakaoOpenChatUrl: String
|
||||||
val blogUrl: String
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ data class GetLiveRoomUserProfileResponse(
|
|||||||
val fancimmUrl: String,
|
val fancimmUrl: String,
|
||||||
val xUrl: String,
|
val xUrl: String,
|
||||||
val youtubeUrl: String,
|
val youtubeUrl: String,
|
||||||
val websiteUrl: String,
|
val kakaoOpenChatUrl: String,
|
||||||
val blogUrl: String,
|
|
||||||
val introduce: String,
|
val introduce: String,
|
||||||
val tags: String,
|
val tags: String,
|
||||||
val isSpeaker: Boolean?,
|
val isSpeaker: Boolean?,
|
||||||
|
|||||||
@@ -1123,8 +1123,7 @@ class LiveRoomService(
|
|||||||
fancimmUrl = user.fancimmUrl,
|
fancimmUrl = user.fancimmUrl,
|
||||||
xUrl = user.xUrl,
|
xUrl = user.xUrl,
|
||||||
youtubeUrl = user.youtubeUrl,
|
youtubeUrl = user.youtubeUrl,
|
||||||
websiteUrl = user.websiteUrl,
|
kakaoOpenChatUrl = user.websiteUrl,
|
||||||
blogUrl = user.blogUrl,
|
|
||||||
introduce = user.introduce,
|
introduce = user.introduce,
|
||||||
tags = user.tags
|
tags = user.tags
|
||||||
.asSequence()
|
.asSequence()
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ data class GetRoomDetailManager(
|
|||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
val fancimmUrl: String?,
|
val fancimmUrl: String?,
|
||||||
val xUrl: String?,
|
val xUrl: String?,
|
||||||
val websiteUrl: String?,
|
val kakaoOpenChatUrl: String?,
|
||||||
val blogUrl: String?,
|
|
||||||
val profileImageUrl: String,
|
val profileImageUrl: String,
|
||||||
val isCreator: Boolean
|
val isCreator: Boolean
|
||||||
) {
|
) {
|
||||||
@@ -46,8 +45,7 @@ data class GetRoomDetailManager(
|
|||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
fancimmUrl = member.fancimmUrl,
|
fancimmUrl = member.fancimmUrl,
|
||||||
xUrl = member.xUrl,
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
kakaoOpenChatUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
|
||||||
profileImageUrl = if (member.profileImage != null) {
|
profileImageUrl = if (member.profileImage != null) {
|
||||||
"$cloudFrontHost/${member.profileImage}"
|
"$cloudFrontHost/${member.profileImage}"
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -305,8 +305,7 @@ class MemberService(
|
|||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
fancimmUrl = member.fancimmUrl,
|
fancimmUrl = member.fancimmUrl,
|
||||||
xUrl = member.xUrl,
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
kakaoOpenChatUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
|
||||||
liveReservationCount = liveReservationCount,
|
liveReservationCount = liveReservationCount,
|
||||||
isAuth = member.auth != null,
|
isAuth = member.auth != null,
|
||||||
orderList = orderList
|
orderList = orderList
|
||||||
@@ -737,12 +736,8 @@ class MemberService(
|
|||||||
member.xUrl = profileUpdateRequest.xUrl
|
member.xUrl = profileUpdateRequest.xUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
if (profileUpdateRequest.websiteUrl != null) {
|
if (profileUpdateRequest.kakaoOpenChatUrl != null) {
|
||||||
member.websiteUrl = profileUpdateRequest.websiteUrl
|
member.websiteUrl = profileUpdateRequest.kakaoOpenChatUrl
|
||||||
}
|
|
||||||
|
|
||||||
if (profileUpdateRequest.blogUrl != null) {
|
|
||||||
member.blogUrl = profileUpdateRequest.blogUrl
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (profileUpdateRequest.isVisibleDonationRank != null) {
|
if (profileUpdateRequest.isVisibleDonationRank != null) {
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ data class ProfileResponse(
|
|||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
val fancimmUrl: String?,
|
val fancimmUrl: String?,
|
||||||
val xUrl: String?,
|
val xUrl: String?,
|
||||||
val blogUrl: String?,
|
val kakaoOpenChatUrl: String?,
|
||||||
val websiteUrl: String?,
|
|
||||||
val introduce: String,
|
val introduce: String,
|
||||||
val tags: List<String>
|
val tags: List<String>
|
||||||
) {
|
) {
|
||||||
@@ -33,8 +32,7 @@ data class ProfileResponse(
|
|||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
fancimmUrl = member.fancimmUrl,
|
fancimmUrl = member.fancimmUrl,
|
||||||
xUrl = member.xUrl,
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
kakaoOpenChatUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
|
||||||
introduce = member.introduce,
|
introduce = member.introduce,
|
||||||
tags = member.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList()
|
tags = member.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ data class ProfileUpdateRequest(
|
|||||||
val instagramUrl: String? = null,
|
val instagramUrl: String? = null,
|
||||||
val fancimmUrl: String? = null,
|
val fancimmUrl: String? = null,
|
||||||
val xUrl: String? = null,
|
val xUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val kakaoOpenChatUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
|
||||||
val isVisibleDonationRank: Boolean? = null,
|
val isVisibleDonationRank: Boolean? = null,
|
||||||
val donationRankingPeriod: DonationRankingPeriod? = null,
|
val donationRankingPeriod: DonationRankingPeriod? = null,
|
||||||
val container: String
|
val container: String
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ data class MyPageResponse(
|
|||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
val fancimmUrl: String? = null,
|
val fancimmUrl: String? = null,
|
||||||
val xUrl: String? = null,
|
val xUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val kakaoOpenChatUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
|
||||||
val liveReservationCount: Int,
|
val liveReservationCount: Int,
|
||||||
val isAuth: Boolean,
|
val isAuth: Boolean,
|
||||||
val orderList: GetAudioContentOrderListResponse
|
val orderList: GetAudioContentOrderListResponse
|
||||||
|
|||||||
Reference in New Issue
Block a user