diff --git a/docs/20260619_크리에이터_채널_오디오_탭/plan-task.md b/docs/20260619_크리에이터_채널_오디오_탭/plan-task.md index 0448b9d8..ed2c2f6b 100644 --- a/docs/20260619_크리에이터_채널_오디오_탭/plan-task.md +++ b/docs/20260619_크리에이터_채널_오디오_탭/plan-task.md @@ -184,7 +184,7 @@ ### Phase 2: API/DTO/Repository/ViewModel 계약 추가 -- [ ] **Task 2.1: 오디오 탭 DTO 추가** +- [x] **Task 2.1: 오디오 탭 DTO 추가** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/data/CreatorChannelAudioTabResponse.kt` - 작업: @@ -195,8 +195,12 @@ - `./gradlew :app:compileDebugKotlin` - 기대 결과: - 신규 DTO 추가 후 컴파일이 PASS한다. + - 검증 기록: + - 2026-06-19 `CreatorChannelAudioTabResponse`, `CreatorChannelAudioThemeResponse`를 `audio/data` 하위에 추가했다. `ContentSort`와 기존 `CreatorChannelAudioContentResponse` 타입을 재사용한다. + - 2026-06-19 `./gradlew :app:compileDebugKotlin` 실행 결과 BUILD SUCCESSFUL. + - 2026-06-19 리뷰 후속 수정으로 PRD 계약의 `themeName` 필드가 ViewModel theme title 매핑에서도 사용되도록 연결부를 점검한다. -- [ ] **Task 2.2: 오디오 탭 endpoint와 Repository method 추가** +- [x] **Task 2.2: 오디오 탭 endpoint와 Repository method 추가** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt` @@ -209,8 +213,12 @@ - `./gradlew :app:compileDebugKotlin` - 기대 결과: - API/Repository 추가 후 기존 Koin graph와 충돌 없이 컴파일된다. + - 검증 기록: + - 2026-06-19 `CreatorChannelApi.getAudio()`에 `GET /api/v2/creator-channels/{creatorId}/audio` endpoint를 추가하고, `page`, `size`, `sort`, nullable `themeId`, `Authorization` header를 전달하도록 했다. + - 2026-06-19 `CreatorChannelRepository.getAudio(creatorId, page, size, sort, themeId, token)` method를 추가했다. `themeId`는 nullable 값 그대로 Retrofit query로 전달한다. + - 2026-06-19 `./gradlew :app:compileDebugKotlin` 실행 결과 BUILD SUCCESSFUL. -- [ ] **Task 2.3: ViewModel RED 테스트 작성** +- [x] **Task 2.3: ViewModel RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModelTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioPaginationTest.kt` @@ -232,8 +240,12 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioPaginationTest"` - 기대 결과: - production 구현 전 `CreatorChannelAudioViewModel` 미구현으로 RED 실패한다. + - 검증 기록: + - 2026-06-19 `CreatorChannelAudioViewModelTest`, `CreatorChannelAudioPaginationTest`를 추가해 최초 로드, synthetic `전체` tab, 테마/정렬 변경, no-op, `duration == null` item 제외, empty, 소장률 표시 조건, pagination append/중복 방지/error consume/stale response 무시 계약을 고정했다. + - 2026-06-19 production ViewModel 구현 전 RED 확인을 위해 두 테스트 명령을 병렬 실행했으나 Kotlin daemon/incremental compile 충돌로 정상적인 단일 테스트 실패 로그 대신 compile failure가 발생했다. 이후 daemon을 정리하고 production 구현 후 동일 테스트 명령을 단일 실행해 GREEN을 확인했다. + - 2026-06-19 리뷰 후속 수정으로 `audioContentCount == 0`이면 표시 가능한 item이 있어도 Empty 상태가 되는 테스트를 추가한다. -- [ ] **Task 2.4: `CreatorChannelAudioViewModel` 구현** +- [x] **Task 2.4: `CreatorChannelAudioViewModel` 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModel.kt` - 수정: @@ -248,12 +260,19 @@ - request generation 값을 두어 오래된 응답이 최신 상태를 덮어쓰지 않도록 한다. - `duration == null` item은 상태 생성 전에 제외한다. - 첫 페이지 성공 후 표시 가능한 item이 0개이면 `Empty` 상태로 둔다. + - 첫 페이지 성공 후 `audioContentCount == 0`이면 표시 가능한 item 존재 여부와 관계없이 `Empty` 상태로 둔다. - pagination 성공 시 기존 item 뒤에 append한다. - 검증 명령: - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioViewModelTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioPaginationTest"` - 기대 결과: - ViewModel 테스트가 PASS한다. + - 검증 기록: + - 2026-06-19 `CreatorChannelAudioViewModel`을 추가해 최초 로드, sort/theme 변경, retry, pagination, request generation stale response 방지, `duration == null` item 제외, empty/content/error 상태를 구현했다. + - 2026-06-19 `AppDI.kt`에 `CreatorChannelAudioViewModel` Koin binding을 추가했다. + - 2026-06-19 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioViewModelTest"` 실행 결과 BUILD SUCCESSFUL. + - 2026-06-19 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioPaginationTest"` 실행 결과 BUILD SUCCESSFUL. + - 2026-06-19 리뷰 후속 수정으로 theme title 매핑은 `theme.themeName`을 사용하고, Empty 조건은 `audioContents.isEmpty() || audioContentCount == 0`으로 보강한다. ---