fix(live-room-create): 유료 라이브 30캔 미만 생성을 차단한다

This commit is contained in:
2026-02-24 16:21:20 +09:00
parent 80959abe16
commit 63a52629a9
5 changed files with 53 additions and 1 deletions

View File

@@ -28,6 +28,10 @@ class LiveRoomCreateViewModel(
private val repository: LiveRepository private val repository: LiveRepository
) : BaseViewModel() { ) : BaseViewModel() {
companion object {
private const val MINIMUM_PAID_PRICE = 30
}
enum class SelectedMenu { enum class SelectedMenu {
MENU_1, MENU_2, MENU_3 MENU_1, MENU_2, MENU_3
} }
@@ -264,11 +268,17 @@ class LiveRoomCreateViewModel(
return false return false
} }
val price = _priceLiveData.value ?: 0
if (price in 1 until MINIMUM_PAID_PRICE) {
_toastLiveData.postValue(StringResource(R.string.msg_live_room_create_minimum_paid_price))
return false
}
return true return true
} }
fun setPrice(price: Int) { fun setPrice(price: Int) {
_priceLiveData.value = price _priceLiveData.value = price.coerceAtLeast(0)
} }
fun setAdult(isAdult: Boolean) { fun setAdult(isAdult: Boolean) {

View File

@@ -639,6 +639,7 @@
<string name="msg_live_room_create_cover_required">Select a cover image.</string> <string name="msg_live_room_create_cover_required">Select a cover image.</string>
<string name="msg_live_room_create_schedule_required">Select the reservation date and time.</string> <string name="msg_live_room_create_schedule_required">Select the reservation date and time.</string>
<string name="msg_live_room_create_menu_required">Menu cannot be empty.</string> <string name="msg_live_room_create_menu_required">Menu cannot be empty.</string>
<string name="msg_live_room_create_minimum_paid_price">The minimum paid live price is 30 cans.</string>
<string name="msg_live_room_create_recent_loaded">Recent data loaded.</string> <string name="msg_live_room_create_recent_loaded">Recent data loaded.</string>
<string name="msg_live_room_create_recent_load_failed">Failed to load recent data.\ntry again.</string> <string name="msg_live_room_create_recent_load_failed">Failed to load recent data.\ntry again.</string>
<string name="screen_my_notice_more">Details</string> <string name="screen_my_notice_more">Details</string>

View File

@@ -639,6 +639,7 @@
<string name="msg_live_room_create_cover_required">カバー画像を選択してください。</string> <string name="msg_live_room_create_cover_required">カバー画像を選択してください。</string>
<string name="msg_live_room_create_schedule_required">予約日時を選択してください。</string> <string name="msg_live_room_create_schedule_required">予約日時を選択してください。</string>
<string name="msg_live_room_create_menu_required">メニュー表は空欄にできません。</string> <string name="msg_live_room_create_menu_required">メニュー表は空欄にできません。</string>
<string name="msg_live_room_create_minimum_paid_price">有料ライブの最低金額は30缶です。</string>
<string name="msg_live_room_create_recent_loaded">最近のデータを読み込みました。</string> <string name="msg_live_room_create_recent_loaded">最近のデータを読み込みました。</string>
<string name="msg_live_room_create_recent_load_failed">最近のデータを読み込めませんでした。\n恐れ入りますが、もう一度お試しください。</string> <string name="msg_live_room_create_recent_load_failed">最近のデータを読み込めませんでした。\n恐れ入りますが、もう一度お試しください。</string>
<string name="screen_my_notice_more">詳細</string> <string name="screen_my_notice_more">詳細</string>

View File

@@ -638,6 +638,7 @@
<string name="msg_live_room_create_cover_required">커버이미지를 선택해주세요.</string> <string name="msg_live_room_create_cover_required">커버이미지를 선택해주세요.</string>
<string name="msg_live_room_create_schedule_required">예약날짜와 시간을 선택해주세요.</string> <string name="msg_live_room_create_schedule_required">예약날짜와 시간을 선택해주세요.</string>
<string name="msg_live_room_create_menu_required">메뉴판은 빈칸일 수 없습니다.</string> <string name="msg_live_room_create_menu_required">메뉴판은 빈칸일 수 없습니다.</string>
<string name="msg_live_room_create_minimum_paid_price">유료 라이브의 최소금액은 30캔 입니다.</string>
<string name="msg_live_room_create_recent_loaded">최근데이터를 불러왔습니다.</string> <string name="msg_live_room_create_recent_loaded">최근데이터를 불러왔습니다.</string>
<string name="msg_live_room_create_recent_load_failed">최근데이터를 불러오지 못했습니다.\n다시 시도해 주세요.</string> <string name="msg_live_room_create_recent_load_failed">최근데이터를 불러오지 못했습니다.\n다시 시도해 주세요.</string>
<string name="screen_my_notice_more">자세히</string> <string name="screen_my_notice_more">자세히</string>

View File

@@ -0,0 +1,39 @@
- [x] 라이브 생성 정합성 검사 로직 위치를 확인한다.
- [x] 유료 라이브 최소 금액 30캔 조건을 생성 전 검사에 추가한다.
- [x] 금액이 0 미만인 경우 0으로 보정하도록 반영한다.
- [x] 최소금액 메시지의 영어/일본어 리소스를 추가한다.
- [x] 관련 파일 진단/테스트/빌드를 실행해 결과를 확인한다.
## 검증 기록
### 1) 유료 라이브 최소 금액 30캔 정합성 추가
- 무엇: 유료 라이브 생성 전 정합성 검사에 최소 금액(30캔) 조건 추가 반영 여부를 검증.
- 왜: 유료 라이브를 30캔 미만(1~29캔)으로 생성하지 못하도록 클라이언트에서 사전 차단하기 위함.
- 어떻게:
- `lsp_diagnostics` (`LiveRoomCreateViewModel.kt`, `strings.xml`) 실행 시 현재 환경에 Kotlin/XML LSP 서버가 없어 진단 도구 사용 불가를 확인.
- `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행.
- 결과:
- Gradle: `BUILD SUCCESSFUL` (단위 테스트/디버그 빌드 통과).
- 문자열 리소스 `msg_live_room_create_minimum_paid_price` 추가 및 ViewModel 검증 조건 반영 확인.
### 2) 금액 음수 입력 0 보정
- 무엇: 라이브 생성 금액 설정 시 음수 값 입력을 0으로 보정하는 로직 반영 여부 검증.
- 왜: 비정상 입력(0 미만)이 들어와도 가격 상태를 안전하게 유지하기 위함.
- 어떻게:
- `LiveRoomCreateViewModel.setPrice``price.coerceAtLeast(0)`로 변경.
- `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행.
- 결과:
- Gradle: `BUILD SUCCESSFUL`.
- 음수 입력 시 `priceLiveData`는 최소 0으로 보정됨.
### 3) 최소 금액 메시지 다국어(en/ja) 추가
- 무엇: `msg_live_room_create_minimum_paid_price` 키의 영어/일본어 리소스 추가 반영 여부를 검증.
- 왜: 기본(한국어)만 존재하던 최소금액 안내 메시지를 다국어 환경에서도 동일하게 노출하기 위함.
- 어떻게:
- `values-en/strings.xml`, `values-ja/strings.xml`에 동일 키를 생성.
- `lsp_diagnostics`로 XML 진단을 시도했으나 현재 환경에서 XML LSP 서버 미설정으로 실행 불가 확인.
- `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행.
- 결과:
- 영어: `The minimum paid live price is 30 cans.`
- 일본어: `有料ライブの最低金額は30缶です。`
- Gradle: `BUILD SUCCESSFUL`.