Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
67a60e8
#267 [move]: quest 작성, 완료 패키지 분리
znayeonzn Feb 22, 2026
3818121
#267 [move]: quest 작성, 완료 패키지 분리
znayeonzn Feb 22, 2026
6f81ee3
#267 [feat]: 퀘스트 작성 UI 수정 및 텍스트 스크롤 추가
znayeonzn Feb 22, 2026
70e256e
#267 [feat]: 퀘스트 완료 모달 띄우기
znayeonzn Feb 22, 2026
6a705c1
#267 [chore]: ktlint format
znayeonzn Feb 22, 2026
d6c40a3
#267 [merge] : develop 브랜치 반영
znayeonzn Feb 22, 2026
216434a
#267 [move] : behavior quest package 분리
znayeonzn Feb 22, 2026
cf71910
#267 [fix] : 텍스트 필드가 포커스된 상태일 때만 스크롤 동작하도록 수정
znayeonzn Feb 22, 2026
3713b4e
#267 [chore] : 함수 네이밍 수정
znayeonzn Feb 23, 2026
6359e7a
#267 [feat] : 행동형 퀘스트 작성 UI 및 스크롤 기능 추가
znayeonzn Feb 23, 2026
18244dd
#267 [merge]: conflict 해결
znayeonzn Feb 23, 2026
300a3ca
#267 [fix]: imepadding, scroll 문제 해결
znayeonzn Feb 24, 2026
2952ad7
#267 [feat]: 공통 퀘스트 UI
znayeonzn Feb 24, 2026
df06ebf
#267 [feat]: 공통 퀘스트 네비 연결
znayeonzn Feb 24, 2026
3d354b8
#267 [merge] : develop 브랜치 반영
znayeonzn Feb 26, 2026
33b4296
#267 [feat] : response 필드 추가
znayeonzn Feb 27, 2026
7f14a5c
#267 [feat] : 행동형 퀘스트 완료 화면 UI 구현
znayeonzn Feb 27, 2026
84bfc02
#267 [mod] : 코드 리뷰 반영
znayeonzn Feb 27, 2026
0285cf2
#267 [chore] : 코드리뷰 반영
sohee6989 Feb 28, 2026
20cdad8
#267 [chore] : ktlinnt 체크
sohee6989 Feb 28, 2026
23d91e0
#267 [feat] : 다시보기 화면 - ai 답장 버튼 구현
sohee6989 Feb 28, 2026
687f842
#267 [chore] : 행동형 완료 화면 버튼 간격 변경
sohee6989 Feb 28, 2026
be2b7cb
#267 [chore] : 안쓰는 주석 삭제
sohee6989 Feb 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ data class QuestRecordedDetailResponseDto(
val questEmotionState: String,
@SerialName("emotionDescription")
val emotionDescription: String,
@SerialName("aiAnswerExists")
val aiAnswerExists: Boolean
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# 대상 파일 확인 및 전체 구조 파악
find . -path ./app/src/main/java/com/byeboo/app/data/dto/response/quest/QuestRecordedDetailResponseDto.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 167


🏁 Script executed:

# 파일 내용 확인 (사이즈 먼저)
wc -l app/src/main/java/com/byeboo/app/data/dto/response/quest/QuestRecordedDetailResponseDto.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 168


🏁 Script executed:

# 해당 파일의 26-27 라인 및 주변 컨텍스트 확인
cat -n app/src/main/java/com/byeboo/app/data/dto/response/quest/QuestRecordedDetailResponseDto.kt | head -40

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 1070


🏁 Script executed:

# aiAnswerExists 필드 관련된 모든 코드 검색
rg -n "aiAnswerExists" --type=kt -B2 -A2

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 101


🏁 Script executed:

# QuestRecordedDetailResponseDto 사용 패턴 확인
rg -n "QuestRecordedDetailResponseDto" --type=kt -B1 -A3

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 101


🏁 Script executed:

# 응답 샘플 또는 테스트 데이터 확인
rg -n '"aiAnswerExists"' --type=json --type=kt -B2 -A2

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 101


🏁 Script executed:

# 비슷한 DTO의 기본값 패턴 확인
fd "ResponseDto.kt$" -x rg -l "val.*Boolean" {} | head -5

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 427


🏁 Script executed:

# 다른 DTO 파일들의 Boolean 필드 패턴 확인
cat app/src/main/java/com/byeboo/app/data/dto/response/quest/QuestCountResponseDto.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 439


🏁 Script executed:

# 모든 ResponseDto에서 Boolean 필드 찾기
find . -name "*ResponseDto.kt" -exec cat {} \; | grep -n "Boolean"

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 215


🏁 Script executed:

# API 응답 관련 테스트 또는 샘플 데이터 검색
find . -type f \( -name "*.json" -o -name "*test*" -o -name "*Test.kt" \) | xargs grep -l "aiAnswerExists" 2>/dev/null | head -5

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 57


🏁 Script executed:

# Retrofit 또는 API 호출 부분에서 QuestRecordedDetailResponseDto 사용 패턴
find . -name "*.kt" -exec grep -l "QuestRecordedDetailResponseDto" {} \; | head -5

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 535


🏁 Script executed:

# 응답 페이로드 및 API 문서 확인
find . -type f \( -name "*.md" -o -name "*.txt" \) | xargs grep -l "aiAnswerExists" 2>/dev/null

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 59


🏁 Script executed:

# QuestRecordedDetailService 구현 확인
cat app/src/main/java/com/byeboo/app/data/service/quest/QuestRecordedDetailService.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 514


🏁 Script executed:

# QuestRecordedDetailDataSourceImpl 구현 확인
cat app/src/main/java/com/byeboo/app/data/datasourceimpl/remote/quest/QuestRecordedDetailDataSourceImpl.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 811


🏁 Script executed:

# 테스트 코드에서 QuestRecordedDetailResponseDto 사용 확인
find . -name "*Test*.kt" -o -name "*test*.kt" | xargs grep -l "QuestRecordedDetailResponseDto" 2>/dev/null | head -3

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 57


🏁 Script executed:

# isRegistered와 alarmEnabled 필드 정의 확인 (기본값 여부)
find . -name "*ResponseDto.kt" -exec grep -l "isRegistered\|alarmEnabled" {} \;

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 250


🏁 Script executed:

# 다른 non-null Boolean 필드들의 정의 확인
cat app/src/main/java/com/byeboo/app/data/dto/response/auth/KakaoLoginResponseDto.kt

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 652


🏁 Script executed:

# 서버 문서나 API 스펙 확인
find . -type f \( -name "*.md" -o -name "*API*" -o -name "*api*" \) | xargs grep -l "aiAnswer\|questRecorded" 2>/dev/null | head -3

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 57


🏁 Script executed:

# 테스트 또는 mock 데이터에서 aiAnswerExists 필드 존재 여부
find . -type f -name "*.kt" | xargs grep -B5 -A5 '"aiAnswerExists"\|aiAnswerExists.*=' 2>/dev/null | head -20

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 1896


🏁 Script executed:

# 다른 non-null Boolean 필드들의 기본값 패턴 최종 확인
grep -rn "Boolean[^?]" app/src/main/java/com/byeboo/app/data/dto/response/ --include="*.kt" | head -10

Repository: 36-APPJAM-HEARTZ/ByeBoo-ANDROID

Length of output: 313


필수 Boolean 필드 추가로 역직렬화 실패 가능성이 있습니다.

Line 26~27의 aiAnswerExists는 기본값 없는 non-null 필드로, 서버 응답에서 이 필드가 누락되면 MissingFieldException이 발생할 수 있습니다. 특히 서버와 앱 배포 타이밍이 어긋나는 상황에서 앱 크래시 위험이 있습니다.

다만, 현재 코드베이스에서 isRegistered(KakaoLoginResponseDto), alarmEnabled(NotificationResponseDto) 등 다른 non-null Boolean 필드들도 동일한 구조로 정의되어 있으므로, 이 이슈는 aiAnswerExists만의 문제가 아니라 전체 DTO 설계 패턴의 일관성 문제입니다.

아래와 같이 기본값을 추가하거나, 서버에서 이 필드가 항상 포함됨을 보장하도록 API 계약을 명확히 해야 합니다:

방어적 수정안
     `@SerialName`("aiAnswerExists")
-    val aiAnswerExists: Boolean
+    val aiAnswerExists: Boolean = false
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@SerialName("aiAnswerExists")
val aiAnswerExists: Boolean
`@SerialName`("aiAnswerExists")
val aiAnswerExists: Boolean = false
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/byeboo/app/data/dto/response/quest/QuestRecordedDetailResponseDto.kt`
around lines 26 - 27, QuestRecordedDetailResponseDto currently defines
aiAnswerExists as a non-null Boolean which will throw MissingFieldException if
the server omits the field; update the DTO to provide a safe default (e.g.,
aiAnswerExists = false) or make it nullable (Boolean?) so deserialization won't
crash, and apply the same defensive pattern to other DTOs with non-null Booleans
(e.g., KakaoLoginResponseDto.isRegistered, NotificationResponseDto.alarmEnabled)
to keep behavior consistent.

)
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ fun QuestRecordedDetailResponseDto.toDomain(): QuestRecordedDetailModel =
imageKey = this.imageKey,
imageUrl = this.imageUrl,
emotionDescription = this.emotionDescription,
aiAnswerExists = this.aiAnswerExists
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ data class QuestRecordedDetailModel(
val imageKey: String? = null,
val imageUrl: String? = null,
val emotionDescription: String,
val aiAnswerExists: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ fun MainNavHost(
navigateToHome = { navigator.navigateToHome(questNavOptions) },
navigateToQuestRecording = { questId -> navigator.navigateToQuestRecording(questId) },
navigateToQuestBehavior = { questId -> navigator.navigateToQuestBehavior(questId) },
navigateToQuestCommon = { questId -> navigator.navigateToQuestCommon(questId)},
navigateToQuestReview = { questId -> navigator.navigateToQuestReview(questId) },
navigateToOffboardingCompletedGuide = {
navigator.navigateToOffboardingCompletedGuide(
Expand Down Expand Up @@ -133,6 +134,12 @@ fun MainNavHost(
navOptions = clearStackNavOptions,
)
},
navigateToQuestCommonComplete = { questId ->
navigator.navigateToQuestCommonComplete(
questId = questId,
navOptions = clearStackNavOptions
)
},
navigateUp = navigator::navigateUp,
paddingValues = paddingValues,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import com.byeboo.app.presentation.offboarding.navigation.navigateToOffboardingQ
import com.byeboo.app.presentation.offboarding.navigation.navigateToOffboardingQuestReview
import com.byeboo.app.presentation.quest.behavior.navigation.navigateToQuestBehavior
import com.byeboo.app.presentation.quest.behavior.navigation.navigateToQuestBehaviorComplete
import com.byeboo.app.presentation.quest.common.navigation.navigateToQuestCommon
import com.byeboo.app.presentation.quest.common.navigation.navigateToQuestCommonComplete
import com.byeboo.app.presentation.quest.navigation.Quest
import com.byeboo.app.presentation.quest.navigation.navigateToQuest
import com.byeboo.app.presentation.quest.navigation.navigateToQuestReview
Expand Down Expand Up @@ -184,6 +186,14 @@ class MainNavigator(
)
}

fun navigateToQuestCommon(
questId: Long
) {
navController.navigateToQuestCommon(
questId = questId
)
}

fun navigateToQuestRecordingComplete(
questId: Long,
navOptions: NavOptions? = null,
Expand All @@ -198,6 +208,13 @@ class MainNavigator(
navController.navigateToQuestBehaviorComplete(questId = questId, navOptions = navOptions)
}

fun navigateToQuestCommonComplete(
questId: Long,
navOptions: NavOptions? = null,
) {
navController.navigateToQuestCommonComplete(questId = questId, navOptions = navOptions)
}

fun navigateToQuestReview(
questId: Long,
navOptions: NavOptions? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ fun QuestRoute(
navigateToQuestTip: (Long, QuestType) -> Unit,
navigateToQuestRecording: (Long) -> Unit,
navigateToQuestBehavior: (Long) -> Unit,
navigateToQuestCommon: (Long) -> Unit,
navigateToQuestReview: (Long) -> Unit,
paddingValues: PaddingValues,
viewModel: QuestViewModel = hiltViewModel(),
Expand Down Expand Up @@ -66,6 +67,8 @@ fun QuestRoute(
navigateToQuestRecording(effect.questId)
is QuestSideEffect.NavigateToQuestBehavior ->
navigateToQuestBehavior(effect.questId)
is QuestSideEffect.NavigateToQuestCommon ->
navigateToQuestCommon(effect.questId)
is QuestSideEffect.NavigateToQuestReview ->
navigateToQuestReview(effect.questId)
is QuestSideEffect.ShowSnackBar ->
Expand All @@ -79,6 +82,7 @@ fun QuestRoute(
listState = listState,
paddingValues = paddingValues,
onQuestClick = viewModel::onQuestClick,
onCommonQuestClick = navigateToQuestCommon ,
onDismissModal = viewModel::onQuitDismissModal,
onTipClick = viewModel::onTipClick,
onQuestStart = viewModel::onQuestStart,
Expand All @@ -93,6 +97,7 @@ private fun QuestScreen(
listState: LazyListState,
paddingValues: PaddingValues,
onQuestClick: (Long) -> Unit,
onCommonQuestClick: (Long) -> Unit,
onDismissModal: () -> Unit,
onTipClick: () -> Unit,
onQuestStart: () -> Unit,
Expand Down Expand Up @@ -146,6 +151,7 @@ private fun QuestScreen(
CommonJourneyScreen(
state = uiState.commonJourneyState,
onDateChange = onDateChange,
onCommonQuestClick = onCommonQuestClick
)
}
}
Expand Down
Loading