fix(main): 최근 활동 이동을 보정한다
This commit is contained in:
@@ -537,8 +537,151 @@
|
||||
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
||||
- 기대 결과: `BUILD SUCCEEDED`
|
||||
|
||||
### Phase 21: 최근 활동 LIVE 이동 fallback 보정
|
||||
|
||||
**Phase 결과:** 최근 활동 크리에이터의 서버 원본 `activityType == LIVE` 아이템은 `targetId` 유무에 따라 라이브룸 또는 크리에이터 채널로 이동한다. `LIVE_REPLAY`는 표시 문구를 기존 `라이브`로 유지하되, `AUDIO`와 동일하게 콘텐츠 상세 페이지로 이동한다.
|
||||
|
||||
**선행조건:** 서버가 `HomeActiveCreatorItem.creatorId`를 항상 유효한 양수의 non-null `Long` 값으로 제공한다.
|
||||
|
||||
- [x] **Task 21.1: PRD/계획 문서에 LIVE 이동 fallback 요구사항 추가**
|
||||
- Goal: 인터뷰에서 확정한 응답 필드, 이동 분기, 양수 검사, 회귀 제외 범위를 구현 기준으로 고정한다.
|
||||
- 대상 파일:
|
||||
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/prd.md`
|
||||
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md`
|
||||
- 작업 내용:
|
||||
- `HomeActiveCreatorItem` 응답에 non-null `creatorId`가 추가됨을 명시한다.
|
||||
- 서버 원본 `activityType == LIVE`에서 `targetId != null`이면 라이브룸, `targetId == null`이면 `creatorId` 기반 크리에이터 채널로 이동하도록 명시한다.
|
||||
- 서버가 `creatorId`를 유효한 양수로 보장하더라도 앱에서 `creatorId > 0`을 검사하도록 명시한다.
|
||||
- `LIVE_REPLAY`에는 `LIVE`의 새 fallback을 적용하지 않고, `AUDIO`와 동일하게 `targetId` 기반 콘텐츠 상세 페이지로 이동하도록 명시한다.
|
||||
- `AUDIO`, `COMMUNITY`, 알 수 없는 타입의 기존 동작은 변경하지 않도록 명시한다.
|
||||
- 완료 증거:
|
||||
- PRD 응답 스키마, 상세 진입 규칙, 성공 기준, 검증 계획과 이 Phase의 구현 Task가 같은 요구사항을 사용한다.
|
||||
- TDD 예외 사유:
|
||||
- production 동작을 변경하지 않는 문서 갱신 Task다.
|
||||
- 검증 기준:
|
||||
- 실행 명령: `rg "creatorId: Long|activityType == LIVE|targetId == null|creatorId > 0|LIVE_REPLAY" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md`
|
||||
- 기대 결과: 응답 필드, 분기 조건, 양수 검사, `LIVE_REPLAY` 제외 규칙이 두 문서에서 검색된다.
|
||||
|
||||
- [x] **Task 21.2: 최근 활동 응답 모델과 활동 타입 구분 보정**
|
||||
- Goal: `creatorId`를 필수 값으로 디코딩하고 `LIVE`와 `LIVE_REPLAY`를 이동 분기에서 구분할 수 있게 한다.
|
||||
- 대상 파일:
|
||||
- 수정: `SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift`
|
||||
- 작업 내용:
|
||||
- `HomeActiveCreatorItem`에 non-optional `creatorId: Int`를 추가한다.
|
||||
- `RecommendedActivityType`에서 `LIVE`와 `LIVE_REPLAY`를 별도 case로 디코딩하되 두 case의 표시 문구는 기존 라이브 문구를 유지한다.
|
||||
- Preview의 `HomeActiveCreatorItem` 생성부에 `creatorId`를 추가한다.
|
||||
- 완료 증거:
|
||||
- 모델과 Preview가 신규 필드를 사용하고, `LIVE`와 `LIVE_REPLAY`의 표시 문구는 같지만 enum case는 구분된다.
|
||||
- 검증 기준:
|
||||
- 실행 명령: `rg "creatorId|case liveReplay|LIVE_REPLAY|HomeActiveCreatorItem\\(" SodaLive/Sources/V2/Main/Home/Recommendation`
|
||||
- 기대 결과: 신규 필드와 구분된 활동 타입, 갱신된 Preview 생성부가 검색된다.
|
||||
|
||||
- [x] **Task 21.3: LIVE 분기와 LIVE_REPLAY 콘텐츠 이동 연결 및 회귀 검증**
|
||||
- Goal: 최근 활동 `LIVE` 아이템의 두 이동 경로와 `LIVE_REPLAY`의 콘텐츠 상세 이동을 기존 추천 상세 진입 callback에 연결한다.
|
||||
- 대상 파일:
|
||||
- 수정: `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift`
|
||||
- 확인: `SodaLive/Sources/V2/Main/Home/MainHomeView.swift`
|
||||
- 확인: `SodaLive/Sources/V2/Main/MainView.swift`
|
||||
- 확인: `SodaLive.xcodeproj/project.pbxproj`
|
||||
- 작업 내용:
|
||||
- `MainHomeActiveCreatorSection`에 기존 `onTapCreator` callback을 전달한다.
|
||||
- 서버 원본 `LIVE`에서 `targetId`가 있으면 `onTapLive(targetId)`, 없으면 `creatorId > 0` 검사 후 `onTapCreator(creatorId)`를 실행한다.
|
||||
- `LIVE_REPLAY`는 `AUDIO`와 동일하게 `targetId`가 있을 때 `onTapContent(targetId)`를 실행하고, 없으면 아무 동작도 하지 않는다.
|
||||
- `AUDIO`, `COMMUNITY`, 알 수 없는 타입의 기존 동작을 유지한다.
|
||||
- 라이브룸과 크리에이터 채널 이동은 `MainView`의 기존 추천 상세 진입 guard를 재사용한다.
|
||||
- 완료 증거:
|
||||
- `LIVE`의 두 분기, `creatorId` 양수 검사, `LIVE_REPLAY`의 콘텐츠 상세 이동이 코드에 존재하고, 정적 검증과 `SodaLive-dev` 빌드가 성공한다.
|
||||
- 검증 기준:
|
||||
- 실행 명령: `rg "onTapCreator|creatorId > 0|targetId|liveReplay|onTapLive|onTapContent|onTapCommunityPost" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift`
|
||||
- 기대 결과: `LIVE`의 두 이동 경로, `LIVE_REPLAY`의 `onTapContent` 연결, 다른 활동 타입의 기존 callback이 검색된다.
|
||||
- 실행 명령: `git diff --check`
|
||||
- 기대 결과: 출력 없이 성공한다.
|
||||
- 실행 명령: `plutil -lint SodaLive.xcodeproj/project.pbxproj`
|
||||
- 기대 결과: `OK`
|
||||
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
||||
- 기대 결과: `BUILD SUCCEEDED`
|
||||
- 수동 확인:
|
||||
- `LIVE + targetId != nil` 아이템을 터치하면 라이브룸으로 이동한다.
|
||||
- `LIVE + targetId == nil + creatorId > 0` 아이템을 터치하면 크리에이터 채널로 이동한다.
|
||||
- `LIVE_REPLAY + targetId != nil` 아이템을 터치하면 콘텐츠 상세 페이지로 이동한다.
|
||||
- `LIVE_REPLAY + targetId == nil` 아이템은 이동하지 않는다.
|
||||
- `AUDIO`, `COMMUNITY`, 알 수 없는 타입은 기존 동작을 유지한다.
|
||||
|
||||
- [x] **Task 21.4: LIVE_REPLAY 이동 요구사항 문서 정정**
|
||||
- Goal: 잘못 기록된 `LIVE_REPLAY` 라이브룸 이동 기준을 `AUDIO`와 동일한 콘텐츠 상세 이동 기준으로 정정한다.
|
||||
- 대상 파일:
|
||||
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/prd.md`
|
||||
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md`
|
||||
- 작업 내용:
|
||||
- PRD의 상세 진입 규칙, 성공 기준, Open Questions, 검증 계획을 정정한다.
|
||||
- Phase 21 결과와 미완료 구현 Task에서 `LIVE_REPLAY`를 `onTapContent(targetId)`에 연결하도록 정정한다.
|
||||
- `LIVE_REPLAY`의 표시 문구는 기존과 같이 `I18n.HomeRecommendation.activityLive`를 유지하도록 명시한다.
|
||||
- 기존 검증 기록은 삭제하지 않고 후속 정정 기록을 추가한다.
|
||||
- 완료 증거:
|
||||
- 활성 요구사항과 미완료 구현 Task에서 `LIVE_REPLAY`의 라이브룸 이동 표현이 없고 콘텐츠 상세 이동 규칙이 일치한다.
|
||||
- TDD 예외 사유:
|
||||
- production 동작을 변경하지 않는 문서 정정 Task다.
|
||||
- 검증 기준:
|
||||
- 실행 명령: `rg "LIVE_REPLAY.*(라이브룸|콘텐츠 상세)|onTapContent\\(targetId\\)" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md`
|
||||
- 기대 결과: 활성 요구사항과 미완료 구현 Task에는 `LIVE_REPLAY`의 콘텐츠 상세 이동만 명시되고, 과거 오류는 정정 기록에서만 설명된다.
|
||||
|
||||
## 검증 기록
|
||||
|
||||
### 2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 구현 완료
|
||||
|
||||
- 목적: 최근 활동 크리에이터의 `LIVE` fallback과 `LIVE_REPLAY` 콘텐츠 상세 이동을 코드에 반영
|
||||
- 수행 내용:
|
||||
- `HomeActiveCreatorItem.creatorId`를 필수 `Int`로 추가
|
||||
- `RecommendedActivityType.liveReplay`를 추가하고 `LIVE_REPLAY` 디코딩을 `.live`와 분리
|
||||
- `LIVE`와 `LIVE_REPLAY`의 표시 문구는 모두 `I18n.HomeRecommendation.activityLive`를 유지
|
||||
- `HomeActiveCreatorTapDestination`과 `activeCreatorTapDestination`으로 최근 활동 탭 목적지를 한 곳에서 결정
|
||||
- `LIVE + targetId`는 라이브룸, `LIVE + targetId == nil + creatorId > 0`은 크리에이터 채널로 연결
|
||||
- `LIVE_REPLAY + targetId`는 콘텐츠 상세로 연결하고, `targetId == nil`이면 이동하지 않도록 처리
|
||||
- `AUDIO`, `COMMUNITY`, 알 수 없는 타입의 기존 분기는 유지
|
||||
- 검증:
|
||||
- 임시 `swiftc` RED 체크 실행, 기존 코드에서 `HomeActiveCreatorItem.creatorId`, `RecommendedActivityType.liveReplay`, `activeCreatorTapDestination` 부재로 실패 확인
|
||||
- 임시 `swiftc` GREEN 체크 실행, `creatorId` 디코딩, `LIVE_REPLAY` case 분리, `LIVE`/`LIVE_REPLAY`/`AUDIO`/`COMMUNITY`/unknown 라우팅 precondition 통과 확인
|
||||
- `rg -n "creatorId|case liveReplay|LIVE_REPLAY|HomeActiveCreatorItem\(|activeCreatorTapDestination|onTapCreator|creatorId > 0|onTapLive|onTapContent|onTapCommunityPost" "SodaLive/Sources/V2/Main/Home/Recommendation" "SodaLive/Sources/V2/Main/MainView.swift"` 실행, Phase 21 구현 근거 확인
|
||||
- `git diff --check` 실행, 출력 없이 성공 확인
|
||||
- `plutil -lint "SodaLive.xcodeproj/project.pbxproj"` 실행, `OK` 확인
|
||||
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 실행, `BUILD SUCCEEDED` 확인
|
||||
- `lsp_diagnostics`는 개별 Swift 파일 단독 분석에서 기존 프로젝트 타입(`I18n`, `EventItem`, `DateParser`)을 찾지 못해 false positive를 반환했으므로, 실제 컴파일 검증은 `xcodebuild` 결과를 기준으로 판단
|
||||
|
||||
### 2026-07-30 Phase 21 LIVE_REPLAY 이동 요구사항 정정
|
||||
|
||||
- 정정 대상:
|
||||
- Task 21.1과 Task 21.3에 기록했던 `LIVE_REPLAY`의 기존 라이브룸 이동 기준
|
||||
- 이전 `2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 요구사항 문서화` 기록의 `LIVE_REPLAY` 기존 동작 유지 표현
|
||||
- 정정 내용:
|
||||
- `LIVE_REPLAY`는 라이브룸으로 이동하지 않는다.
|
||||
- `AUDIO`와 동일하게 `targetId`를 콘텐츠 ID로 사용해 콘텐츠 상세 페이지로 이동한다.
|
||||
- `targetId == nil`이면 이동하지 않으며 `creatorId` fallback은 적용하지 않는다.
|
||||
- 표시 문구는 기존과 같이 `I18n.HomeRecommendation.activityLive`를 사용해 `라이브`로 표시한다.
|
||||
- 반영 범위:
|
||||
- PRD 상세 진입 규칙, 성공 기준, Open Questions, 검증 계획
|
||||
- Phase 21 결과와 Task 21.1, Task 21.3
|
||||
- 문서 정정 추적용 Task 21.4
|
||||
- 검증:
|
||||
- `rg "LIVE_REPLAY.*(라이브룸|콘텐츠 상세|activityLive|라이브)|onTapContent\\(targetId\\)" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, 활성 요구사항과 미완료 구현 Task에서 `LIVE_REPLAY`의 콘텐츠 상세 이동 및 기존 `라이브` 표시 유지 기준 확인
|
||||
- `git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, 출력 없이 성공 확인
|
||||
|
||||
### 2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 요구사항 문서화
|
||||
|
||||
- 목적: `HomeActiveCreatorItem.creatorId` 추가와 최근 활동 `LIVE`의 `targetId` 유무별 이동 규칙을 구현 전에 확정
|
||||
- 수행 내용:
|
||||
- PRD 응답 스키마에 non-null `creatorId: Long` 추가
|
||||
- 서버 원본 `LIVE`에서 `targetId`가 있으면 라이브룸, 없으면 `creatorId` 기반 크리에이터 채널로 이동하도록 명시
|
||||
- 서버가 유효한 양수를 보장하더라도 앱에서 `creatorId > 0`을 검사하도록 명시
|
||||
- `LIVE`와 `LIVE_REPLAY`를 앱 enum case에서 구분하고 `LIVE_REPLAY`에는 새 fallback을 적용하지 않도록 명시
|
||||
- `AUDIO`, `COMMUNITY`, 알 수 없는 활동 타입의 기존 동작 유지 기준 추가
|
||||
- Phase 21에 문서, 모델/enum, 이동 연결/검증 Task를 추가하고 구현 Task는 미완료로 유지
|
||||
- 검증:
|
||||
- `rg "creatorId: Long|activityType == LIVE|targetId == null|creatorId > 0|LIVE_REPLAY" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, 응답 필드, `LIVE` 분기, 양수 검사, `LIVE_REPLAY` 제외 규칙이 두 문서에 반영됨 확인
|
||||
- `git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, 출력 없이 성공 확인
|
||||
|
||||
### 2026-07-10 Phase 20 추천 커뮤니티 게시물 상세 진입 보정 완료
|
||||
|
||||
- 목적: 메인 홈 추천 탭의 최근 활동 `COMMUNITY`와 인기 커뮤니티 게시물 탭 액션을 커뮤니티 게시물 상세 페이지로 연결
|
||||
|
||||
Reference in New Issue
Block a user