Skip to content

Conversation

@l5x5l
Copy link
Contributor

@l5x5l l5x5l commented Nov 22, 2025

[ PR Content ]

내 제보 기록 화면을 구현합니다.

Related issue

Screenshot 📸

  • 실제 API 호출 영상
report_history_real_data.mp4
  • 스크롤 동작 확인용 더미 데이터 사용 영상
report_history_dummy_data.mp4

Work Description

  • 내 제보 기록 화면 구현

To Reviewers 📢

  • 현 단계에서는 페이징 처리를 수행하지 않아 전체 제보 데이터를 불러온 후, 필터링하는 방식으로 구현했습니다
  • 개선점이나 궁금한 점 있으시면 코멘트 부탁드립니다!

Summary by CodeRabbit

  • 새로운 기능

    • 제보 기록 화면 추가: 날짜별 제보 내역 조회 및 항목 상세 이동 지원
    • 마이페이지에서 제보 기록 바로 접근 가능
    • 제보 내역 조회용 필수 API·데이터 모델 및 목록 제공
  • UI 개선

    • 카테고리 선택용 바텀시트 및 칩(토글) 추가
    • 처리 상태 배지와 항목 카드로 가독성·탐색성 향상
  • 디자인 시스템

    • 팔레트에 새로운 색상(블루·그린 계열) 추가

✏️ Tip: You can customize this high-level summary in your review settings.

@l5x5l l5x5l self-assigned this Nov 22, 2025
@l5x5l l5x5l added ✨ Feature 새로운 기능 구현 세환 labels Nov 22, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 22, 2025

Walkthrough

내 제보 기록 화면과 관련해 네비게이션, 데이터/DTO, 리포지토리, 도메인 모델, 유스케이스, 뷰모델, UI 구성요소(컴포저블) 및 디자인 시스템 색상·칩 컴포넌트가 추가되어 전체 조회·필터 흐름이 구현되었습니다.

Changes

Cohort / File(s) Summary
라우팅 / 네비게이션
app/src/main/java/com/threegap/bitnagil/Route.kt, app/src/main/java/com/threegap/bitnagil/MainNavHost.kt, app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt
Route에 ReportHistory 추가, MainNavHost에 ReportHistoryScreenContainer 등록, HomeNavHost에 navigateToReportHistory 파라미터 추가 및 전달
마이페이지 UI
presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/MyPageScreen.kt
"내 제보 기록" 버튼 추가 및 navigateToReportHistory 콜백 전달
디자인 시스템 — 색상
core/designsystem/src/.../color/Color.kt, core/designsystem/src/.../color/BitnagilColors.kt
Blue300, Green300 색상 상수 추가 및 BitnagilColorsblue300/green300 속성 추가
디자인 시스템 — 컴포넌트
core/designsystem/src/.../component/atom/BitnagilChip.kt
선택 상태를 지원하는 BitnagilChip 컴포저블 추가 (프리뷰 포함)
데이터 계층 — 서비스 / 데이터소스 / DTO
data/.../report/service/ReportService.kt, data/.../report/datasource/ReportDataSource.kt, data/.../report/datasourceImpl/ReportDataSourceImpl.kt, data/.../report/model/response/ReportItemDto.kt, data/.../report/model/response/ReportHistoriesPerDateDto.kt
GET /api/v2/reports 엔드포인트 추가, ReportItemDto·ReportHistoriesPerDateDto DTO 추가 및 toDomain/toDomainMap 변환, datasource에 getReports() 추가 및 안전 호출 위임
데이터 계층 — 리포지토리 구현
data/src/main/java/.../report/repositoryImpl/ReportRepositoryImpl.kt
getReportHistories() 구현: DTO 결과를 도메인 맵(LocalDate -> List)으로 변환하여 반환
도메인 — 모델 / 리포지토리 / 유스케이스
domain/src/main/java/.../report/model/ReportItem.kt, domain/.../report/model/ReportStatus.kt, domain/.../report/repository/ReportRepository.kt, domain/.../report/usecase/GetReportHistoriesUseCase.kt
ReportItem 데이터 클래스 및 ReportStatus enum(문자열 변환 유틸) 추가, 리포지토리에 getReportHistories() 시그니처 추가, GetReportHistoriesUseCase 구현
프레젠테이션 — 화면 / ViewModel / 유틸
presentation/src/.../reporthistory/ReportHistoryScreen.kt, presentation/src/.../reporthistory/ReportHistoryViewModel.kt, presentation/src/.../reporthistory/util/LocalDateUtils.kt
ReportHistoryScreenContainer 및 내부 Screen 구현, ReportHistoryViewModel(Orbit MVI) 추가, LocalDate.toPresentationFormat() 확장함수 추가
프레젠테이션 — UI 모델
presentation/src/.../reporthistory/model/*
ReportHistoryUiModel, ReportHistoriesPerDayUiModel, ReportHistoryState, ReportHistorySideEffect, ReportProcess, ReportCategory, ReportProcessWithCount 등 UI 모델 및 도메인↔UI 매핑 추가
프레젠테이션 — 컴포넌트들
presentation/src/.../reporthistory/component/atom/ReportProcessBadge.kt, presentation/src/.../reporthistory/component/block/ReportHistoryItem.kt, presentation/src/.../reporthistory/component/template/ReportCategoryBottomSheet.kt
상태 배지, 제보 항목 행, 카테고리 선택 바텀시트 컴포저블 추가 및 프리뷰 포함

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant User
    participant Screen as ReportHistoryScreen
    participant VM as ReportHistoryViewModel
    participant UseCase as GetReportHistoriesUseCase
    participant Repo as ReportRepository
    participant DS as ReportDataSource
    participant Svc as ReportService

    User->>Screen: 화면 진입
    Screen->>VM: 초기화 / load
    VM->>UseCase: invoke()
    UseCase->>Repo: getReportHistories()
    Repo->>DS: getReports()
    DS->>Svc: GET /api/v2/reports
    Svc-->>DS: BaseResponse<ReportHistoriesPerDateDto>
    DS-->>Repo: Result<ReportHistoriesPerDateDto>
    Repo->>Repo: toDomainMap() -> Map<LocalDate,List<ReportItem>>
    Repo-->>UseCase: Result<Map<LocalDate,List<ReportItem>>>
    UseCase-->>VM: Result 전달
    VM->>VM: UI 모델 변환 및 상태 업데이트
    VM-->>Screen: 상태 방출
    Screen->>User: 필터/그룹화된 목록 렌더링
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • 검토 시 주의할 항목:
    • ReportHistoryViewModel.kt: 실패(onFailure) 처리 부재 및 상태 매핑(정렬/그룹화) 검증
    • ReportHistoryState.kt: 필터링·집계 로직의 경계 조건(빈 리스트, 카테고리 null 등)
    • DTO ↔ 도메인 변환: 날짜 파싱(LocalDate.parse) 예외·포맷 가정 검증
    • ReportCategory.fromDomain / ReportProcess.fromDomain 매핑 누락 여부
    • ReportCategoryBottomSheet: 시트 상태(비동기 숨김/선택 후 콜백) 동기화

Poem

🐰 기록은 당근밭에 묻어두지 않죠
날짜마다 줄지어 선 제보들, 작게 빛나는 배지와 칩들
클릭 한 번에 펼쳐보는 발자국들,
토실한 귀로 듣는 화면의 속삭임,
뽀송한 코드와 함께 껑충 뛰어요 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항을 명확하게 반영하고 있습니다. '[Feature/#146] 내 제보 기록 화면 구현'은 이 PR의 핵심 목표인 보고 이력 화면 구현을 정확하게 설명합니다.
Description check ✅ Passed PR 설명이 필수 섹션을 포함하고 있습니다. Related issue, 스크린샷, Work Description, To Reviewers 섹션이 모두 작성되어 있습니다.
Linked Issues check ✅ Passed PR 변경사항이 연결된 이슈 #146의 모든 요구사항을 충족합니다. 화면 UI 구현, 조회 로직, API 연결이 모두 포함되어 있습니다.
Out of Scope Changes check ✅ Passed 변경사항들이 내 제보 기록 화면 구현이라는 정의된 범위 내에 있습니다. 네비게이션, 도메인 모델, 저장소, 뷰모델, UI 컴포넌트 모두 이 기능 구현에 필요한 것들입니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#146-report_history

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (7)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/util/LocalDateUtils.kt (1)

7-10: 포매터를 top-level 상수로 추출하면 성능 개선 가능

toPresentationFormat() 함수가 호출될 때마다 DateTimeFormatter를 새로 생성하고 있습니다. 리스트 화면에서 여러 날짜를 포맷팅할 때 반복 생성으로 인한 오버헤드가 발생할 수 있습니다.

다음과 같이 포매터를 top-level 상수로 추출하는 것을 권장합니다:

+private val PRESENTATION_DATE_FORMATTER = DateTimeFormatter.ofPattern("yy.MM.dd E", Locale.KOREAN)
+
 fun LocalDate.toPresentationFormat(): String {
-    val formatter = DateTimeFormatter.ofPattern("yy.MM.dd E", Locale.KOREAN)
-    return this.format(formatter)
+    return this.format(PRESENTATION_DATE_FORMATTER)
 }
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt (1)

19-49: 칩 컴포넌트 구현이 잘 되었습니다

선택 상태에 따른 스타일 변경과 카운트 표시 기능이 제대로 구현되었습니다.

다만 Line 27의 "$title $count" 문자열 결합 방식은 향후 다국어 지원 시 개선이 필요할 수 있습니다. 현재는 한국어 화면이므로 문제없지만, 추후 string resource를 활용한 포맷팅을 고려해보세요.

domain/src/main/java/com/threegap/bitnagil/domain/report/model/ReportStatus.kt (1)

19-25: 메서드 이름 변경을 고려하세요.

toString 메서드명이 Kotlin Enum의 기본 toString() 메서드와 혼동될 수 있습니다. API 직렬화를 위한 용도라면 toApiString() 또는 toSerializedString() 같은 명확한 이름으로 변경하는 것을 권장합니다.

-        fun toString(value: ReportStatus): String {
+        fun toApiString(value: ReportStatus): String {
             return when (value) {
                 Pending -> "PENDING"
                 InProgress -> "IN_PROGRESS"
                 Completed -> "COMPLETED"
             }
         }
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/block/ReportHistoryItem.kt (1)

78-87: 이미지 로딩/에러 상태 처리를 추가하는 것을 고려하세요.

AsyncImage에 로딩 중이나 에러 상태를 나타내는 placeholder가 없습니다. 이미지 로딩 중이거나 실패했을 때 빈 공간이 보일 수 있습니다.

 AsyncImage(
     model = ImageRequest.Builder(LocalContext.current)
         .data(report.imageUrl)
         .build(),
     modifier = Modifier
         .size(74.dp)
         .clip(shape = RoundedCornerShape(9.dp))
         .background(color = BitnagilTheme.colors.black),
     contentDescription = null,
+    placeholder = painterResource(R.drawable.ic_placeholder),
+    error = painterResource(R.drawable.ic_error),
 )
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (1)

165-189: 선택 사항: 카테고리 버튼의 UX 개선을 고려해보세요.

현재 카테고리 선택 버튼이 컨텐츠 영역 위에 오버레이되어 있어, 스크롤 시 상단 항목을 가릴 수 있습니다. 다음 옵션들을 고려해볼 수 있습니다:

  1. 버튼에 배경색과 그림자를 추가하여 시각적으로 구분
  2. 칩 영역 옆에 배치하여 고정 위치로 변경
  3. 현재 구현이 의도된 디자인이라면 그대로 유지
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryViewModel.kt (1)

27-52: 운영 관련 조언: 향후 페이지네이션 도입을 고려하세요.

현재는 모든 제보 데이터를 한 번에 불러와 클라이언트에서 필터링하고 있습니다. 사용자의 제보 기록이 많아질 경우 다음 문제가 발생할 수 있습니다:

  1. 초기 로딩 시간 증가
  2. 메모리 사용량 증가
  3. 불필요한 네트워크 트래픽

향후 다음 개선사항을 고려해보세요:

  • 서버 사이드 페이지네이션 구현
  • 무한 스크롤 또는 페이지 단위 로딩
  • 필터링을 서버에서 처리하여 필요한 데이터만 전송

초기 구현으로는 적절하지만, 사용자 증가에 따라 개선이 필요할 것입니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoryState.kt (1)

13-28: 선택 사항: 필터링 로직을 간소화할 수 있습니다.

현재 when 표현식이 다소 장황합니다. 다음과 같이 단순화할 수 있습니다:

val processMatched = selectedReportProcess == ReportProcess.Total || 
                     it.process == selectedReportProcess

val categoryMatched = selectedReportCategory == null || 
                      it.category == selectedReportCategory

이렇게 하면 코드가 더 간결해지고 유지보수가 쉬워집니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ae7206f and 59d500d.

📒 Files selected for processing (30)
  • app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (3 hunks)
  • app/src/main/java/com/threegap/bitnagil/Route.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt (2 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/color/BitnagilColors.kt (1 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/color/Color.kt (1 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt (1 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/datasource/ReportDataSource.kt (1 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/datasourceImpl/ReportDataSourceImpl.kt (2 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/model/response/ReportHistoriesPerDateDto.kt (1 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/model/response/ReportItemDto.kt (1 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/repositoryImpl/ReportRepositoryImpl.kt (2 hunks)
  • data/src/main/java/com/threegap/bitnagil/data/report/service/ReportService.kt (1 hunks)
  • domain/src/main/java/com/threegap/bitnagil/domain/report/model/ReportItem.kt (1 hunks)
  • domain/src/main/java/com/threegap/bitnagil/domain/report/model/ReportStatus.kt (1 hunks)
  • domain/src/main/java/com/threegap/bitnagil/domain/report/repository/ReportRepository.kt (1 hunks)
  • domain/src/main/java/com/threegap/bitnagil/domain/report/usecase/GetReportHistoriesUseCase.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/MyPageScreen.kt (5 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryViewModel.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/atom/ReportProcessBadge.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/block/ReportHistoryItem.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/template/ReportCategoryBottomSheet.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportCategory.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoriesPerDayUiModel.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistorySideEffect.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoryState.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoryUiModel.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcess.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcessWithCount.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/util/LocalDateUtils.kt (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-08-13T09:06:19.028Z
Learnt from: wjdrjs00
Repo: YAPP-Github/Bitnagil-Android PR: 101
File: presentation/src/main/java/com/threegap/bitnagil/presentation/setting/SettingViewModel.kt:61-67
Timestamp: 2025-08-13T09:06:19.028Z
Learning: In Android ViewModels, when logout success triggers navigation to a different screen (like NavigateToLogin), the current ViewModel's lifecycle ends, so loading states don't need to be explicitly reset in the success case since the ViewModel will be destroyed.

Applied to files:

  • presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/MyPageScreen.kt
📚 Learning: 2025-07-21T10:38:49.104Z
Learnt from: l5x5l
Repo: YAPP-Github/Bitnagil-Android PR: 38
File: presentation/src/main/java/com/threegap/bitnagil/presentation/writeroutine/component/atom/textbutton/TextButton.kt:30-35
Timestamp: 2025-07-21T10:38:49.104Z
Learning: presentation/src/main/java/com/threegap/bitnagil/presentation/writeroutine/component/atom/textbutton/TextButton.kt의 TextButton 컴포넌트는 임시로 구현된 컴포넌트로, 디자인 시스템 구현시 대체 예정입니다.

Applied to files:

  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt
🧬 Code graph analysis (7)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (1)
  • ReportHistoryScreenContainer (45-68)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/atom/ReportProcessBadge.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)
  • BitnagilTheme (26-41)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (5)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/template/ReportCategoryBottomSheet.kt (1)
  • ReportCategoryBottomSheet (30-75)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/block/BitnagilTopBar.kt (1)
  • BitnagilTopBar (22-63)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt (1)
  • BitnagilChip (19-49)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/block/ReportHistoryItem.kt (1)
  • ReportHistoryItem (32-89)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilIcon.kt (1)
  • BitnagilIcon (21-33)
presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/MyPageScreen.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/block/BitnagilOptionButton.kt (1)
  • BitnagilOptionButton (18-45)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/template/ReportCategoryBottomSheet.kt (2)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilIcon.kt (1)
  • BitnagilIcon (21-33)
presentation/src/main/java/com/threegap/bitnagil/presentation/report/component/ReportCategoryBottomSheet.kt (2)
  • ReportCategoryBottomSheet (128-134)
  • ReportCategoryBottomSheet (32-78)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/block/ReportHistoryItem.kt (2)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/atom/ReportProcessBadge.kt (1)
  • ReportProcessBadge (17-30)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)
  • BitnagilTheme (26-41)
data/src/main/java/com/threegap/bitnagil/data/report/datasourceImpl/ReportDataSourceImpl.kt (1)
data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt (1)
  • safeApiCall (10-25)
⏰ 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: build
🔇 Additional comments (27)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/color/Color.kt (1)

11-14: LGTM!

새로운 색상 상수 추가가 기존 네이밍 컨벤션과 일관되게 잘 구현되었습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/atom/ReportProcessBadge.kt (1)

17-60: LGTM!

뱃지 컴포넌트가 상태별로 적절한 색상을 적용하도록 잘 구현되었습니다. when 표현식에 else 분기를 포함하여 안전성도 확보되어 있고, Preview를 통해 모든 상태를 확인할 수 있어 좋습니다.

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/color/BitnagilColors.kt (1)

15-18: LGTM!

Color.kt에서 정의한 새로운 색상을 BitnagilColors 데이터 클래스에 일관되게 추가했습니다. 기본값이 제공되어 기존 코드에 영향이 없습니다.

app/src/main/java/com/threegap/bitnagil/Route.kt (1)

55-56: LGTM!

새로운 ReportHistory 라우트가 기존 패턴과 일관되게 추가되었습니다.

data/src/main/java/com/threegap/bitnagil/data/report/repositoryImpl/ReportRepositoryImpl.kt (1)

19-21: LGTM!

제보 이력 조회 기능이 Result 타입을 사용하여 에러 처리를 적절히 하고 있으며, DTO에서 도메인 모델로의 변환도 올바르게 구현되었습니다.

app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt (2)

47-47: LGTM!

ReportHistory 화면으로의 네비게이션 파라미터가 기존 패턴과 일관되게 추가되었습니다.


93-93: LGTM!

MyPageScreenContainer에 네비게이션 콜백이 적절히 전달되었습니다.

data/src/main/java/com/threegap/bitnagil/data/report/datasourceImpl/ReportDataSourceImpl.kt (1)

17-19: LGTM!

기존 패턴과 일관성 있게 구현되었으며, safeApiCall을 통한 에러 처리가 적절합니다.

app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)

144-148: LGTM!

launchSingleTop = true 플래그를 사용하여 중복 화면 생성을 방지하는 것이 적절합니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistorySideEffect.kt (1)

1-3: LGTM!

현재는 비어있지만, 향후 사이드 이펙트 추가를 위한 확장 가능한 구조입니다.

data/src/main/java/com/threegap/bitnagil/data/report/service/ReportService.kt (1)

16-17: LGTM!

동일한 경로에 대해 HTTP 메서드(GET)로 구분되어 있어 기존 POST 엔드포인트와 충돌이 없습니다.

domain/src/main/java/com/threegap/bitnagil/domain/report/repository/ReportRepository.kt (1)

9-9: LGTM!

날짜별로 그룹화된 제보 이력을 반환하는 명확한 메서드 시그니처입니다.

domain/src/main/java/com/threegap/bitnagil/domain/report/model/ReportItem.kt (1)

3-10: 선택적 필드에 대한 nullable 타입 고려가 필요합니다.

imageUrladdress 필드가 non-nullable String으로 정의되어 있습니다. API 응답에서 이 값들이 항상 존재한다면 문제없지만, 선택적 필드라면 String?으로 정의하는 것이 더 명시적입니다. 현재는 빈 문자열("")로 처리하는 것으로 보이는데, null과 빈 문자열의 의미를 구분할 필요가 있는지 확인해주세요.

data/src/main/java/com/threegap/bitnagil/data/report/datasource/ReportDataSource.kt (1)

8-8: LGTM!

인터페이스 정의가 명확하며 기존 패턴과 일관성이 있습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcessWithCount.kt (1)

3-12: LGTM!

초기 상태를 위한 Init 상수를 제공하는 것이 좋은 패턴입니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/MyPageScreen.kt (1)

41-41: LGTM!

내 제보 기록 화면으로의 네비게이션 콜백이 올바르게 추가되었습니다. 기존 패턴과 일관성 있게 구현되어 있습니다.

Also applies to: 51-51, 62-62, 106-109, 138-138

domain/src/main/java/com/threegap/bitnagil/domain/report/usecase/GetReportHistoriesUseCase.kt (1)

8-14: LGTM!

Use case가 깔끔하게 구현되었습니다. Repository로의 단순 위임이 적절합니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoriesPerDayUiModel.kt (1)

5-8: LGTM!

날짜별로 제보 기록을 그룹화하는 UI 모델이 간결하게 구현되었습니다.

domain/src/main/java/com/threegap/bitnagil/domain/report/model/ReportStatus.kt (1)

10-17: LGTM!

문자열에서 enum으로의 변환 로직이 적절하게 구현되었습니다. 잘못된 값에 대한 예외 처리도 포함되어 있습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/block/ReportHistoryItem.kt (1)

91-135: LGTM!

다양한 상태의 프리뷰가 잘 구성되어 있어 UI 검증에 도움이 됩니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/component/template/ReportCategoryBottomSheet.kt (1)

77-121: LGTM!

카테고리 아이템 컴포넌트가 잘 구현되었습니다. 아이콘, 텍스트, 선택 표시가 적절하게 배치되어 있습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportHistoryUiModel.kt (1)

14-23: 검증 완료: 코드가 정확합니다.

reportItem.id는 도메인 모델에서 Int 타입이며, ReportHistoryUiModelid 필드는 String 타입이므로 문자열 템플릿을 통한 변환은 필요하고 적절합니다. 불필요한 변환이 아닙니다.

data/src/main/java/com/threegap/bitnagil/data/report/model/response/ReportItemDto.kt (1)

9-33: LGTM! DTO 구조가 깔끔합니다.

데이터 클래스와 도메인 매핑이 적절하게 구현되어 있습니다. kotlinx.serialization을 올바르게 사용하고 있으며, 도메인 모델로의 변환 로직도 명확합니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (1)

45-68: LGTM! 컨테이너 구조가 적절합니다.

Orbit MVI 패턴을 올바르게 사용하고 있으며, 상태 관리와 네비게이션 콜백이 깔끔하게 구성되어 있습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryViewModel.kt (1)

54-86: LGTM! 사용자 액션 핸들러가 잘 구현되어 있습니다.

카테고리 토글 로직과 프로세스 선택 로직이 명확하고 직관적입니다. 바텀시트 상태 관리도 적절합니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcess.kt (1)

5-22: LGTM! Enum 정의와 도메인 매핑이 깔끔합니다.

모든 도메인 상태가 프레젠테이션 레이어의 상태로 적절히 매핑되어 있습니다.

presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportCategory.kt (1)

6-42: LGTM! 카테고리 정의와 매핑이 잘 구현되어 있습니다.

도메인 레이어와의 분리가 명확하고, 타입 별칭(type alias)을 사용하여 가독성을 높였습니다. 모든 카테고리가 UI 리소스와 함께 적절히 정의되어 있습니다.

@l5x5l l5x5l requested a review from wjdrjs00 November 22, 2025 08:38
Copy link
Member

@wjdrjs00 wjdrjs00 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻 고생하셨슴다.. 리뷰 확인해주세요~!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcessWithCount.kt (1)

3-14: 데이터 모델·파생 프로퍼티는 적절하며, 네이밍만 소소한 스타일 제안 드립니다.

  • titleWithCount에서 count == 0일 때 카운트를 숨기고, 그 외엔 "${process.title} $count"로 출력하는 로직은 요구사항에 잘 맞아 보입니다.
  • 다만 도메인 상 음수 카운트가 절대 나오지 않는다면 지금도 충분하지만, 혹시 모를 방어 코드를 선호하신다면 count <= 0으로 조건을 완화하는 것도 고려해볼 수 있습니다. (선택 사항)
  • companion objectval Init은 값 프로퍼티인데 PascalCase를 쓰고 있어서, 코틀린 코딩 스타일 관점에서는 DEFAULT, INITIAL 같은 상수 네이밍 혹은 default/initial 같은 lowerCamelCase 네이밍으로 정리하면 가독성이 조금 더 좋아질 수 있습니다. (init은 키워드라 피하신 것 같아서 이해됩니다.)

전체적으로 기능·구조에는 문제 없는 상태이고, 위 내용은 전부 선택적인 스타일/가독성 개선 제안입니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40b9d87 and 18d6f61.

📒 Files selected for processing (4)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryViewModel.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/model/ReportProcessWithCount.kt (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryScreen.kt
  • presentation/src/main/java/com/threegap/bitnagil/presentation/reporthistory/ReportHistoryViewModel.kt
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilChip.kt
⏰ 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: build

@wjdrjs00 wjdrjs00 self-requested a review November 22, 2025 23:44
Copy link
Member

@wjdrjs00 wjdrjs00 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀🚀

@l5x5l l5x5l merged commit 62f0976 into develop Nov 23, 2025
2 checks passed
@l5x5l l5x5l deleted the feature/#146-report_history branch November 23, 2025 03:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현 세환

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 내 제보 기록 화면을 구현합니다.

3 participants