diff --git a/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/plan-task.md b/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/plan-task.md new file mode 100644 index 00000000..4cf93916 --- /dev/null +++ b/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/plan-task.md @@ -0,0 +1,39 @@ +# 크리에이터 채널 채팅/DM 로그인 가드 계획 + +## 목표 +`CreatorChannelActivity` 화면 자체를 로그인 필수로 만들고, `대화하기` 버튼은 기존 국가별 인증/성인 콘텐츠 guard 흐름을 재사용한다. + +## 범위 +- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` +- 문서: `docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/prd.md`, `plan-task.md` +- 제외: Repository/ViewModel/API 변경, UI 레이아웃 변경, 다른 화면 guard 변경 + +### Phase 1: 로그인 가드 적용 + +- [x] **Task 1.0: `CreatorChannelActivity.kt` 화면 진입 로그인 guard 추가** + - 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - 작업: `setupView()`에서 유효한 `creatorId` 확인 후 토큰이 비어 있으면 `showLoginActivity()`, `finish()`, `return`으로 화면 초기화를 중단한다. + - 검증 기준: 비로그인 상태에서는 탭/페이저/클릭 리스너 설정 전에 로그인 화면으로 이동하고 현재 화면은 종료된다. + +- [x] **Task 1.1: `CreatorChannelActivity.kt` 대화하기 클릭 guard 추가** + - 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - 작업: `tvChatButton` 클릭 시 기존 `ensureLoginAndAdultAuth`로 국가별 인증/성인 콘텐츠 접근 조건을 확인하고, 통과 후 `homeActionDelegate?.createChatRoom(characterId)`를 실행한다. + - 검증 기준: 한국 사용자 본인인증 미완료 상태 또는 성인 콘텐츠 표시 설정 비활성 상태에서는 채팅방 생성 API가 호출되지 않는다. + +- [x] **Task 1.2: `CreatorChannelActivity.kt` DM 클릭 로그인 guard 추가** + - 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - 작업: 화면 레벨 로그인 보장을 전제로 기존 owner/non-owner DM 이동 분기를 유지한다. + - 검증 기준: 로그인 상태에서 기존 owner/non-owner DM 이동 분기가 유지된다. + +- [x] **Task 1.3: 변경 검증 실행** + - 파일: `docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/plan-task.md` + - 작업: 소스 확인 및 가능한 Gradle 검증을 실행하고 결과를 기록한다. + - 검증 기준: 관련 테스트 또는 컴파일 검증 결과를 기록한다. + +## Verification Log +- 2026-07-13: `CreatorChannelActivity.kt` 소스 확인 결과 `tvChatButton`은 `ensureLoginAndAdultAuth(isAdult = false)` 통과 후 `homeActionDelegate?.createChatRoom(characterId)`를 호출하고, `tvDmButton`은 `SharedPreferenceManager.token.isBlank()`일 때 `showLoginActivity()` 후 반환하며 기존 owner/non-owner 이동 경로를 유지한다. +- 2026-07-13: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행 결과 Kotlin 컴파일은 통과했으나 기존 `CreatorChannelActivitySourceTest > 팬Talk 섹션은 Figma ListComment layout과 bind로 렌더링한다`가 `CreatorChannelActivitySourceTest.kt:1894`에서 실패했다. 실패 assertion은 `item_creator_channel_home_fantalk.xml`의 `@drawable/ic_chevron_down_white` 포함 여부로, 이번 변경 파일인 `CreatorChannelActivity.kt`의 클릭 guard 수정과 직접 관련 없는 기존 테스트 상태로 확인했다. +- 2026-07-13: 사용자 추가 확인에 따라 `대화하기` guard를 로그인-only에서 로그인+본인인증으로 변경했다. `tvChatButton`은 `ensureLoginAndAuth`를 호출하고, 해당 함수는 비로그인 시 로그인 화면, 한국 사용자 본인인증 미완료 시 `auth_desc` 본인인증 안내, 통과 시 채팅방 생성 콜백을 실행한다. `isAdultContentVisible`은 확인하지 않는다. +- 2026-07-13: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`를 재실행했다. `CreatorChannelActivity.kt` Kotlin 컴파일은 통과했으며, 테스트 결과는 동일하게 기존 FanTalk 레이아웃 assertion(`CreatorChannelActivitySourceTest.kt:1894`, `@drawable/ic_chevron_down_white`) 1건 실패로 종료되었다. +- 2026-07-13: 사용자 추가 확인에 따라 크리에이터 채널 화면 자체를 로그인 필수로 변경했다. `setupView()`는 유효한 `creatorId` 확인 후 `SharedPreferenceManager.token.isBlank()`이면 `showLoginActivity()`, `finish()`, `return`으로 초기화를 중단한다. `대화하기`는 기존 `ensureLoginAndAdultAuth`를 재사용해 국가별 인증/성인 콘텐츠 접근 조건을 확인한다. +- 2026-07-13: `대화하기` 호출부를 `ensureLoginAndAdultAuth(isAdult = true)`로 명시하고 `ensureLoginAndAdultAuth` 함수 시그니처는 기존 `isAdult: Boolean` 필수 파라미터 형태로 유지했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 재실행 결과 `CreatorChannelActivity.kt` Kotlin 컴파일은 통과했고, 기존 FanTalk 레이아웃 assertion(`CreatorChannelActivitySourceTest.kt:1894`, `@drawable/ic_chevron_down_white`) 1건 실패만 남았다. diff --git a/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/prd.md b/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/prd.md new file mode 100644 index 00000000..2320d5a8 --- /dev/null +++ b/docs/20260713_크리에이터_채널_채팅_DM_로그인_가드/prd.md @@ -0,0 +1,80 @@ +# PRD: 크리에이터 채널 채팅/DM 로그인 가드 + +## 1. Overview +크리에이터 채널 화면 진입과 상단의 `대화하기` 버튼 진입 전에 필요한 로그인/인증 가드를 적용한다. + +## 2. Problem +- 현재 크리에이터 채널 화면은 비로그인 상태에서도 진입을 시도할 수 있다. +- 현재 `대화하기` 버튼은 인증 조건을 통과하지 않은 상태에서도 채팅방 생성 API를 호출할 수 있다. +- 현재 `DM` 버튼은 화면이 로그인 상태를 보장하지 않으면 비로그인 상태에서도 DM 화면으로 진입할 수 있다. +- 사용자는 보호된 기능 접근 시 API 오류 대신 로그인 화면 또는 인증 안내를 기대한다. + +## 3. Goals +- 크리에이터 채널 화면은 비로그인 상태에서 로그인 화면으로 이동하고 종료한다. +- `대화하기` 버튼은 국가별 인증/성인 콘텐츠 접근 조건을 통과한 뒤 채팅방 생성 API를 호출한다. +- `DM` 버튼은 화면 레벨 로그인 보장을 전제로 기존 이동 경로를 유지한다. +- 기존 owner/non-owner 분기와 채팅방 생성 성공 후 이동 로직은 변경하지 않는다. + +## 4. Non-Goals +- 채팅방 생성 API, Repository, ViewModel 구조는 변경하지 않는다. +- 로그인 필수 정책은 이 화면에만 적용하고 다른 크리에이터 채널 관련 화면으로 확장하지 않는다. +- UI 레이아웃, 문구, 디자인은 변경하지 않는다. +- 레거시 코드나 다른 화면의 로그인 가드는 수정하지 않는다. + +## 5. Target Users +- 크리에이터 채널에서 AI 캐릭터 채팅을 시작하려는 사용자 +- 크리에이터 채널에서 DM을 보내거나 확인하려는 사용자 + +## 6. User Stories +- 비로그인 사용자는 크리에이터 채널 화면 진입 시 로그인 화면으로 이동한다. +- 한국 로그인 사용자 중 본인인증 미완료 사용자는 `대화하기`를 누르면 본인인증 안내를 본다. +- 비한국 로그인 사용자 중 성인 콘텐츠 표시 설정이 꺼진 사용자는 `대화하기`를 누르면 콘텐츠 설정 화면으로 이동한다. +- 로그인 및 인증 조건을 통과한 사용자는 `대화하기`를 누르면 기존처럼 채팅방 생성 후 채팅방으로 이동한다. +- 로그인 사용자는 `DM`을 누르면 기존 owner/non-owner 분기에 따라 동일하게 이동한다. + +## 7. Core Features + +### Feature A: 화면 진입 로그인 guard + +#### Requirements +- `CreatorChannelActivity` 진입 시 로그인 여부를 확인한다. +- 비로그인 상태라면 `showLoginActivity()`를 호출하고 현재 화면을 종료한다. + +#### Edge Cases +- `creatorId`가 유효하지 않으면 기존처럼 로그인 화면 이동 없이 종료한다. + +### Feature B: 대화하기 국가별 인증/성인 콘텐츠 guard + +#### Requirements +- `CreatorChannelActivity`의 `tvChatButton` 클릭 시 기존 `ensureLoginAndAdultAuth`를 사용한다. +- 한국 사용자이고 본인인증이 완료되지 않은 경우 본인인증 다이얼로그를 표시한다. +- 성인 콘텐츠 표시 설정(`isAdultContentVisible`)이 꺼진 경우 콘텐츠 설정 화면으로 이동한다. +- guard 통과 후에만 `homeActionDelegate?.createChatRoom(characterId)`를 호출한다. + +#### Edge Cases +- `currentHeader` 또는 `characterId`가 없으면 기존처럼 아무 동작도 하지 않는다. +- 인증/성인 콘텐츠 접근 조건을 통과하지 못하면 API를 호출하지 않는다. + +### Feature C: DM 이동 유지 + +#### Requirements +- `CreatorChannelActivity`의 `tvDmButton`은 화면 레벨 로그인 보장을 전제로 기존 owner/non-owner 이동 경로를 유지한다. + +#### Edge Cases +- owner인 경우 기존처럼 `MainV2Activity.newChatDmIntent(this)`로 이동한다. +- owner가 아닌 경우 기존처럼 `DmChatRoomActivity.newIntentByCreatorId(this, creatorId)`로 이동한다. + +## 8. UX / UI Expectations +- 버튼 노출, 텍스트, 레이아웃은 변경하지 않는다. +- 비로그인 사용자는 오류 토스트 대신 로그인 화면으로 이동한다. + +## 9. Technical Constraints +- 변경 파일은 `CreatorChannelActivity.kt`와 이번 작업 문서로 제한한다. +- 기존 `showLoginActivity()`와 `startAuthFlow()`를 재사용한다. +- 기존 `ensureLoginAndAdultAuth()`를 `대화하기` 인증 guard에도 재사용한다. + +## 10. Metrics +- 별도 지표 추가 없음. + +## 11. Open Questions +- 없음. 사용자 확인으로 화면 자체를 로그인 필수로 만들고, `대화하기`는 국가별 인증/성인 콘텐츠 guard를 적용하기로 확정했다.