Conversation
Walkthrough보호자를 위한 리포트 필터링과 알림 화면을 지원하기 위해 새로운 GuardianAlert 라우트를 추가하고, Report 라우트에 부모 ID 파라미터를 추가하여 API 레이어부터 UI까지 propagate합니다. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Fix all issues with AI Agents 🤖
In @feature/report/src/main/java/com/moa/app/feature/report/ReportViewModel.kt:
- Around line 142-146: The monthly report flow is incomplete: enable the
ReportCycle.MONTHLY branch in ReportViewModel.fetchReport() to call
fetchMonthlyReport(), and in fetchMonthlyReport() handle the success result by
updating _uiState with a monthlyReport value (add a monthlyReport field to
ReportUiState if missing) similar to dailyReport/weeklyReport (e.g., onSuccess =
{ monthly -> _uiState.update { it.copy(monthlyReport = monthly?.toUiModel()) }
}). If the monthly feature is intentionally not implemented yet, instead add a
clear TODO comment in the ReportCycle.MONTHLY case and keep the code disabled.
🧹 Nitpick comments (1)
feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertScreen.kt (1)
25-30: 알림 콘텐츠 구현이 누락된 것으로 보입니다.현재
GuardianAlertContent는 상단 앱바만 표시하고 실제 알림 목록이나 콘텐츠가 구현되어 있지 않습니다. 이것이 의도된 초기 구현(skeleton)인지, 아니면 후속 작업이 필요한지 확인이 필요합니다.만약 이것이 완성된 구현이라면, 사용자에게 빈 화면이 표시되므로 최소한 "알림이 없습니다" 같은 empty state UI를 추가하는 것을 권장합니다.
실제 알림 목록 구현이 필요하다면 도움을 드릴 수 있습니다. 새로운 이슈를 생성할까요?
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (19)
app/src/main/kotlin/com/moa/app/main/MainActivity.ktcore/navigation/src/main/java/com/moa/app/navigation/AppRoute.ktdata/src/main/kotlin/com/moa/app/data/report/datasource/ReportDataSource.ktdata/src/main/kotlin/com/moa/app/data/report/datasourceImpl/ReportDataSourceImpl.ktdata/src/main/kotlin/com/moa/app/data/report/repositoryImpl/ReportRepositoryImpl.ktdata/src/main/kotlin/com/moa/app/data/report/service/ReportService.ktdata/src/main/kotlin/com/moa/app/data/user/model/response/UserProfileResponse.ktdomain/src/main/kotlin/com/moa/app/domain/report/repository/ReportRepository.ktdomain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchDailyReportUseCase.ktdomain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchMonthlyReportUseCase.ktdomain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchWeeklyReportUseCase.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertScreen.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertViewModel.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/GuardianHomeScreen.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/GuardianHomeViewModel.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/component/SeniorProfileGrid.ktfeature/guardian/src/main/kotlin/com/moa/app/feature/guardian/setting/GuardianSettingViewModel.ktfeature/report/src/main/java/com/moa/app/feature/report/ReportViewModel.ktfeature/senior/src/main/kotlin/com/moa/app/feature/senior/home/SeniorHomeViewModel.kt
🧰 Additional context used
🧬 Code graph analysis (2)
feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertScreen.kt (1)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/product/topbar/MaTopAppBar.kt (1)
MaTopAppBar(20-52)
app/src/main/kotlin/com/moa/app/main/MainActivity.kt (1)
feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertScreen.kt (1)
GuardianAlertScreen(11-18)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Run Unit Tests
🔇 Additional comments (25)
data/src/main/kotlin/com/moa/app/data/user/model/response/UserProfileResponse.kt (1)
16-16: 프로퍼티 이름 변경이 완벽하게 적용되었습니다.
parentUserId에서parentUserIds로의 프로퍼티 이름 변경은 일관되게 적용되었습니다. 코드베이스에서 이전 프로퍼티명에 대한 참조가 남아있지 않으며, 새로운 프로퍼티명parentUserIds는@SerialName("parentUserIds")어노테이션과 함께 올바르게 정의되어 있습니다. List 타입의 복수형 특성도 제대로 반영되었고, JSON 직렬화 호환성도 보장됩니다.feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/setting/GuardianSettingViewModel.kt (1)
118-118: 올바른 버그 수정입니다.GuardianSettingViewModel에서
SeniorSetting이 아닌GuardianSetting으로 popUpTo를 설정하는 것이 맞습니다. 이 변경으로 보호자 사용자의 백스택이 올바르게 정리됩니다.feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/alert/GuardianAlertViewModel.kt (1)
1-13: 구현이 올바릅니다.매우 간단한 ViewModel이지만 표준 패턴을 따르고 있으며 현재 요구사항에 적합합니다. 향후 알림 관련 비즈니스 로직이나 상태 관리가 추가될 수 있습니다.
app/src/main/kotlin/com/moa/app/main/MainActivity.kt (2)
22-22: LGTM!GuardianAlertScreen import가 올바르게 추가되었습니다.
100-100: LGTM!GuardianAlert 라우트가 다른 라우트들과 동일한 패턴으로 올바르게 등록되었습니다.
core/navigation/src/main/java/com/moa/app/navigation/AppRoute.kt (2)
73-74: LGTM!GuardianAlert 라우트가 올바르게 추가되었습니다.
65-65: Report 라우트 시그니처 변경이 올바르게 구현되었습니다.
parentId: Long?파라미터 추가로 보호자와 시니어 사용자 모두의 리포트 흐름을 지원합니다. 코드베이스 전체에서 모든AppRoute.Report사용처가 올바르게 업데이트되었습니다:
- SeniorHomeViewModel에서 null 전달 (시니어 사용자)
- GuardianHomeViewModel에서 profileId 전달 (보호자 사용자)
- ReportViewModel에서 parentId 파라미터 정상 수신
feature/senior/src/main/kotlin/com/moa/app/feature/senior/home/SeniorHomeViewModel.kt (1)
52-54: Report 라우트 시그니처에 올바르게 대응했습니다.시니어 사용자 흐름에서
parentId를null로 전달하는 것이 적절합니다. ReportViewModel에서savedStateHandle.toRoute<AppRoute.Report>().parentId로 올바르게 추출되며, 이후 모든 use case와 데이터 계층에서 nullableLong?타입으로 일관되게 처리됩니다.domain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchDailyReportUseCase.kt (1)
10-11: LGTM! 보호자 필터링을 위한 API 확장이 적절합니다.
parentId파라미터를 nullable로 추가하여 일일 리포트 조회 시 보호자별 필터링을 지원합니다. 파라미터가 올바르게 repository로 전달되고 있습니다.feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/GuardianHomeViewModel.kt (1)
114-126: LGTM! 네비게이션 헬퍼 메서드가 일관성 있게 구현되었습니다.
navigateToReport와navigateToAlert메서드가 기존 네비게이션 패턴(navigateToSetting,navigateToUserConnection)을 잘 따르고 있으며,launchSingleTop옵션을 적절히 사용하여 백스택 관리를 최적화하고 있습니다.domain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchWeeklyReportUseCase.kt (1)
10-11: LGTM! 주간 리포트 조회에 보호자 필터링이 일관성 있게 추가되었습니다.
FetchDailyReportUseCase와 동일한 패턴으로parentId파라미터를 추가하여 일관된 API를 제공합니다.feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/component/SeniorProfileGrid.kt (1)
42-42: LGTM! 콜백 시그니처 단순화가 적절합니다.
onProfileClick콜백이 전체SeniorProfile객체 대신Long타입의 ID만 전달하도록 변경되었습니다. 이는 네비게이션 용도로 더 적합하며, 불필요한 데이터 전달을 줄여 효율적입니다.GuardianHomeViewModel.navigateToReport(profileId: Long)와도 잘 맞습니다.Also applies to: 79-79
domain/src/main/kotlin/com/moa/app/domain/report/usecase/FetchMonthlyReportUseCase.kt (1)
10-11: LGTM!
parentId파라미터가 올바르게 추가되고 리포지토리로 전달되고 있습니다. 다른 레이어의 변경사항과 일관성 있게 구현되었습니다.feature/report/src/main/java/com/moa/app/feature/report/ReportViewModel.kt (3)
4-4: LGTM!
SavedStateHandle을 통해 내비게이션 라우트에서parentId를 추출하는 구현이 적절합니다. Hilt의 DI와 Jetpack Navigation의 type-safe routing이 올바르게 통합되었습니다.Also applies to: 7-7, 16-16, 24-24, 32-32, 39-39
108-108: LGTM!
parentId가 올바르게 전달되고 있으며, 에러 로깅도Timber.e로 적절하게 마이그레이션되었습니다.Also applies to: 113-113
126-126: LGTM!주간 리포트 조회 시
parentId가 올바르게 전달되고 있으며, 에러 로깅도 적절합니다.Also applies to: 131-131
data/src/main/kotlin/com/moa/app/data/report/datasourceImpl/ReportDataSourceImpl.kt (3)
15-16: LGTM!
parentId파라미터가 서비스 레이어로 올바르게 전달되고 있습니다.
19-25: LGTM!주간 리포트 조회 메서드도
parentId를 올바르게 전달하고 있습니다.
28-29: LGTM!월간 리포트 조회 메서드도 일관되게 구현되었습니다.
feature/guardian/src/main/kotlin/com/moa/app/feature/guardian/home/GuardianHomeScreen.kt (2)
57-59: LGTM!내비게이션 콜백이 ViewModel 메서드로 직접 연결되어 더 간결해졌고,
onProfileClick이 전체 객체 대신 ID만 전달하도록 변경되어 관심사 분리가 개선되었습니다.Also applies to: 97-97
175-196: 더블 탭 종료 로직이 올바르게 구현되었습니다.
LaunchedEffect를 이용한 2초 타임아웃과BackHandler를 통한 뒤로가기 인터셉션이 적절합니다.activity?.finish()의 안전한 호출 패턴도 적절하게 처리되어 있습니다.LocalActivity.current는 Compose Activity 컨텍스트에서 정상적으로 동작하며, null 가능성에 대한 방어도 충분합니다.data/src/main/kotlin/com/moa/app/data/report/datasource/ReportDataSource.kt (1)
8-10: LGTM!인터페이스가 일관되게 업데이트되었습니다. 세 가지 리포트 조회 메서드 모두 선택적
parentId파라미터를 받도록 수정되어 보호자별 리포트 필터링을 지원합니다.data/src/main/kotlin/com/moa/app/data/report/repositoryImpl/ReportRepositoryImpl.kt (1)
15-33: 구현이 올바르게 되어 있습니다.세 개의 리포트 메서드 모두
parentId파라미터를 데이터 소스로 일관되게 전달하고 있으며, 기존의mapCatching { it?.toDomain() }변환 로직도 잘 유지되고 있습니다.domain/src/main/kotlin/com/moa/app/domain/report/repository/ReportRepository.kt (1)
8-10: 인터페이스 변경과 레이어 간 파라미터 전달이 일관되게 적용되었습니다.ReportViewModel에서 네비게이션 경로로부터
parentId를 올바르게 추출하고(라인 39), 세 개의 리포트 UseCase 호출 시에 모두 일관되게parentId를 전달하고 있습니다. Repository 인터페이스의 변경사항이 UseCase 레이어와 UI 레이어(ViewModel)에까지 올바르게 반영되어 있으며, 레이어 간 파라미터 전달이 완벽하게 구현되어 있습니다.data/src/main/kotlin/com/moa/app/data/report/service/ReportService.kt (1)
15-15: 백엔드 API의 parentId 파라미터 지원 여부를 확인하세요.세 개의 리포트 엔드포인트에 선택적
parentId쿼리 파라미터가 추가되었습니다. Android 구현부에서는 기술적으로 올바르게 처리되고 있으며(Retrofit이 null 값을 자동으로 생략하고, ReportViewModel에서 네비게이션 경로의 parentId를 전달), 모든 레이어(Service, DataSource, Repository, UseCase, ViewModel)에서 일관되게 처리되고 있습니다.다만 백엔드 API가 이 파라미터를 실제로 지원하고 필터링이 예상대로 동작하는지 확인이 필요합니다. 백엔드 저장소나 API 문서에서 다음을 검증하세요:
/api/v1/report/daily,/api/v1/report/weekly,/api/v1/report/monthly엔드포인트에서 parentId 쿼리 파라미터 지원 여부- parentId가 전달될 때 응답이 필터링되는지 여부
Related issue 🛠
Work Description ✏️
Screenshot 📸
Uncompleted Tasks 😅
Summary by CodeRabbit
릴리스 노트
✏️ Tip: You can customize this high-level summary in your review settings.