feat(member): 팬심M 및 X URL 필드를 프로필 응답에 연동한다
This commit is contained in:
4
docs/20260220_member_fancimm_x_url_ddl.sql
Normal file
4
docs/20260220_member_fancimm_x_url_ddl.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
ALTER TABLE member
|
||||||
|
ADD fancimm_url VARCHAR(255) DEFAULT NULL COMMENT '팬심M url' AFTER instagram_url,
|
||||||
|
ADD x_url VARCHAR(255) DEFAULT NULL COMMENT 'X url' AFTER fancimm_url
|
||||||
|
;
|
||||||
14
docs/20260220_팬심M와XURL추가.md
Normal file
14
docs/20260220_팬심M와XURL추가.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# 팬심M/X URL 추가 작업 계획
|
||||||
|
|
||||||
|
- [x] `Member` 엔티티 SNS 필드에 팬심M URL, X URL 속성 추가
|
||||||
|
- [x] 인스타그램 URL 수정 흐름 분석 후 동일한 수정 요청 DTO 반영
|
||||||
|
- [x] 서비스의 프로필 수정 로직에 팬심M URL, X URL 수정 처리 추가
|
||||||
|
- [x] 관련 응답 DTO에 신규 URL 필드 반영 및 매핑 연결
|
||||||
|
- [x] 후속 요청 반영: `fansimMUrl` 필드명을 `fancimmUrl`로 일괄 변경
|
||||||
|
- [x] `ddl-auto: validate` 대응을 위한 DB 컬럼 추가 SQL 파일 생성
|
||||||
|
- [x] 진단/테스트/빌드 검증 실행 후 결과 기록
|
||||||
|
|
||||||
|
## 검증 기록
|
||||||
|
- 무엇을: 팬심M/X URL 필드 추가, 인스타그램 URL 수정 흐름과 동일한 수정/응답 매핑 반영, `fansimMUrl` -> `fancimmUrl` 명칭 변경을 검증했다.
|
||||||
|
- 왜: 프로필 수정 API에서 두 URL이 저장되고, 주요 응답 DTO에서 값이 일관되게 내려가야 하기 때문이다.
|
||||||
|
- 어떻게: `./gradlew ktlintCheck test build`를 팬심M/X URL 추가 시점과 `fancimmUrl` 명칭 변경 시점에 각각 실행해 정적 검사, 테스트, 빌드 성공(Exit code 0)을 확인했다. 또한 `docs/20260220_member_fancimm_x_url_ddl.sql`에 운영 DB 반영용 DDL을 추가했다. Kotlin LSP 미구성으로 `lsp_diagnostics`는 수행할 수 없었다.
|
||||||
@@ -7,6 +7,8 @@ data class CreatorResponse(
|
|||||||
val tags: List<String>,
|
val tags: List<String>,
|
||||||
val introduce: String = "",
|
val introduce: String = "",
|
||||||
val instagramUrl: String? = null,
|
val instagramUrl: String? = null,
|
||||||
|
val fancimmUrl: String? = null,
|
||||||
|
val xUrl: String? = null,
|
||||||
val youtubeUrl: String? = null,
|
val youtubeUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val websiteUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
val blogUrl: String? = null,
|
||||||
|
|||||||
@@ -372,6 +372,8 @@ class ExplorerService(
|
|||||||
tags = creatorAccount.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(),
|
tags = creatorAccount.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(),
|
||||||
introduce = creatorAccount.introduce,
|
introduce = creatorAccount.introduce,
|
||||||
instagramUrl = creatorAccount.instagramUrl,
|
instagramUrl = creatorAccount.instagramUrl,
|
||||||
|
fancimmUrl = creatorAccount.fancimmUrl,
|
||||||
|
xUrl = creatorAccount.xUrl,
|
||||||
youtubeUrl = creatorAccount.youtubeUrl,
|
youtubeUrl = creatorAccount.youtubeUrl,
|
||||||
websiteUrl = creatorAccount.websiteUrl,
|
websiteUrl = creatorAccount.websiteUrl,
|
||||||
blogUrl = creatorAccount.blogUrl,
|
blogUrl = creatorAccount.blogUrl,
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ data class GetLiveRoomUserProfileResponse(
|
|||||||
val profileUrl: String,
|
val profileUrl: String,
|
||||||
val gender: String,
|
val gender: String,
|
||||||
val instagramUrl: String,
|
val instagramUrl: String,
|
||||||
|
val fancimmUrl: String,
|
||||||
|
val xUrl: String,
|
||||||
val youtubeUrl: String,
|
val youtubeUrl: String,
|
||||||
val websiteUrl: String,
|
val websiteUrl: String,
|
||||||
val blogUrl: String,
|
val blogUrl: String,
|
||||||
|
|||||||
@@ -1098,6 +1098,8 @@ class LiveRoomService(
|
|||||||
else -> messageSource.getMessage("member.gender.unknown", langContext.lang)
|
else -> messageSource.getMessage("member.gender.unknown", langContext.lang)
|
||||||
}.orEmpty(),
|
}.orEmpty(),
|
||||||
instagramUrl = user.instagramUrl,
|
instagramUrl = user.instagramUrl,
|
||||||
|
fancimmUrl = user.fancimmUrl,
|
||||||
|
xUrl = user.xUrl,
|
||||||
youtubeUrl = user.youtubeUrl,
|
youtubeUrl = user.youtubeUrl,
|
||||||
websiteUrl = user.websiteUrl,
|
websiteUrl = user.websiteUrl,
|
||||||
blogUrl = user.blogUrl,
|
blogUrl = user.blogUrl,
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ data class GetRoomDetailManager(
|
|||||||
val introduce: String,
|
val introduce: String,
|
||||||
val youtubeUrl: String?,
|
val youtubeUrl: String?,
|
||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
|
val fancimmUrl: String?,
|
||||||
|
val xUrl: String?,
|
||||||
val websiteUrl: String?,
|
val websiteUrl: String?,
|
||||||
val blogUrl: String?,
|
val blogUrl: String?,
|
||||||
val profileImageUrl: String,
|
val profileImageUrl: String,
|
||||||
@@ -42,6 +44,8 @@ data class GetRoomDetailManager(
|
|||||||
introduce = member.introduce,
|
introduce = member.introduce,
|
||||||
youtubeUrl = member.youtubeUrl,
|
youtubeUrl = member.youtubeUrl,
|
||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
|
fancimmUrl = member.fancimmUrl,
|
||||||
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
websiteUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
blogUrl = member.blogUrl,
|
||||||
profileImageUrl = if (member.profileImage != null) {
|
profileImageUrl = if (member.profileImage != null) {
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ data class Member(
|
|||||||
|
|
||||||
// SNS
|
// SNS
|
||||||
var instagramUrl = ""
|
var instagramUrl = ""
|
||||||
|
var fancimmUrl = ""
|
||||||
|
var xUrl = ""
|
||||||
var youtubeUrl = ""
|
var youtubeUrl = ""
|
||||||
var websiteUrl = ""
|
var websiteUrl = ""
|
||||||
var blogUrl = ""
|
var blogUrl = ""
|
||||||
|
|||||||
@@ -301,6 +301,8 @@ class MemberService(
|
|||||||
point = totalPoint,
|
point = totalPoint,
|
||||||
youtubeUrl = member.youtubeUrl,
|
youtubeUrl = member.youtubeUrl,
|
||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
|
fancimmUrl = member.fancimmUrl,
|
||||||
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
websiteUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
blogUrl = member.blogUrl,
|
||||||
liveReservationCount = liveReservationCount,
|
liveReservationCount = liveReservationCount,
|
||||||
@@ -714,6 +716,14 @@ class MemberService(
|
|||||||
member.instagramUrl = profileUpdateRequest.instagramUrl
|
member.instagramUrl = profileUpdateRequest.instagramUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (profileUpdateRequest.fancimmUrl != null) {
|
||||||
|
member.fancimmUrl = profileUpdateRequest.fancimmUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profileUpdateRequest.xUrl != null) {
|
||||||
|
member.xUrl = profileUpdateRequest.xUrl
|
||||||
|
}
|
||||||
|
|
||||||
if (profileUpdateRequest.websiteUrl != null) {
|
if (profileUpdateRequest.websiteUrl != null) {
|
||||||
member.websiteUrl = profileUpdateRequest.websiteUrl
|
member.websiteUrl = profileUpdateRequest.websiteUrl
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ data class ProfileResponse(
|
|||||||
val rewardCan: Int,
|
val rewardCan: Int,
|
||||||
val youtubeUrl: String?,
|
val youtubeUrl: String?,
|
||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
|
val fancimmUrl: String?,
|
||||||
|
val xUrl: String?,
|
||||||
val blogUrl: String?,
|
val blogUrl: String?,
|
||||||
val websiteUrl: String?,
|
val websiteUrl: String?,
|
||||||
val introduce: String,
|
val introduce: String,
|
||||||
@@ -29,6 +31,8 @@ data class ProfileResponse(
|
|||||||
rewardCan = member.getRewardCan(container),
|
rewardCan = member.getRewardCan(container),
|
||||||
youtubeUrl = member.youtubeUrl,
|
youtubeUrl = member.youtubeUrl,
|
||||||
instagramUrl = member.instagramUrl,
|
instagramUrl = member.instagramUrl,
|
||||||
|
fancimmUrl = member.fancimmUrl,
|
||||||
|
xUrl = member.xUrl,
|
||||||
websiteUrl = member.websiteUrl,
|
websiteUrl = member.websiteUrl,
|
||||||
blogUrl = member.blogUrl,
|
blogUrl = member.blogUrl,
|
||||||
introduce = member.introduce,
|
introduce = member.introduce,
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ data class ProfileUpdateRequest(
|
|||||||
val introduce: String? = null,
|
val introduce: String? = null,
|
||||||
val youtubeUrl: String? = null,
|
val youtubeUrl: String? = null,
|
||||||
val instagramUrl: String? = null,
|
val instagramUrl: String? = null,
|
||||||
|
val fancimmUrl: String? = null,
|
||||||
|
val xUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val websiteUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
val blogUrl: String? = null,
|
||||||
val isVisibleDonationRank: Boolean? = null,
|
val isVisibleDonationRank: Boolean? = null,
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ data class MyPageResponse(
|
|||||||
val point: Int,
|
val point: Int,
|
||||||
val youtubeUrl: String?,
|
val youtubeUrl: String?,
|
||||||
val instagramUrl: String?,
|
val instagramUrl: String?,
|
||||||
|
val fancimmUrl: String? = null,
|
||||||
|
val xUrl: String? = null,
|
||||||
val websiteUrl: String? = null,
|
val websiteUrl: String? = null,
|
||||||
val blogUrl: String? = null,
|
val blogUrl: String? = null,
|
||||||
val liveReservationCount: Int,
|
val liveReservationCount: Int,
|
||||||
|
|||||||
Reference in New Issue
Block a user