Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 14 additions & 0 deletions app/src/main/java/com/egobook/app/data/api/CalenderApiService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.egobook.app.data.api

import com.egobook.app.data.model.ApiResponse
import com.egobook.app.data.model.diary.response.CalenderData
import retrofit2.http.GET
import retrofit2.http.Query

interface CalenderApiService {
//선택한 연도/월의 날짜별로 가장 많이 기록된 대표 감정 단계를 확인
@GET("/diaries/calendar")
suspend fun getCalender(
@Query("month") month: String,
): ApiResponse<CalenderData>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.egobook.app.data.model.diary.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class DiaryExportRequest (
@SerialName("format")
val format: String,

)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.egobook.app.data.model.diary.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class CalenderResponse(
@SerialName("code")
val code: String,
@SerialName("message")
val message: String,
@SerialName("status")
val status: Int,
@SerialName("data")
val data: CalenderData? // nullable로 변경
)

@Serializable
data class CalenderData(
@SerialName("month")
val month: String,
@SerialName("days")
val days: List<CalenderDay>? = null // nullable + 기본값
)

@Serializable
data class CalenderDay(
@SerialName("date")
val date: String,
@SerialName("emotionLevel")
val emotionLevel: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.egobook.app.data.repository.diary

import android.util.Log
import com.egobook.app.data.api.CalenderApiService
import com.egobook.app.data.model.diary.response.CalenderData
import com.egobook.app.data.util.safeApiCall
import com.egobook.app.domain.model.calender.CalenderDate
import com.egobook.app.domain.model.diary.mapper.CalenderMapper
import com.egobook.app.domain.repository.diary.CalenderRepository
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import javax.inject.Inject

class CalenderRepositoryImpl @Inject constructor(
private val apiService: CalenderApiService
) : CalenderRepository {

override suspend fun getCalender(yearMonth: LocalDate): Result<List<CalenderDate>> {
val monthString = yearMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"))
Log.d("Repository", "Calling API with monthString: $monthString")

val result = safeApiCall(
apiCall = {
val response = apiService.getCalender(monthString)
Log.d("Repository", "Raw API Response - code: ${response.code}, data: ${response.data}")
response
},
transform = { calenderData: CalenderData ->
Log.d("Repository", "Transforming data: month=${calenderData.month}, days=${calenderData.days}")
CalenderMapper.dataToDomainList(calenderData)
}
)

Log.d("Repository", "Result: $result")
return result
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.egobook.app.data.api.DiaryApiService
import com.egobook.app.data.model.diary.request.DiaryCreateRequest
import com.egobook.app.data.repository.diary.paging.DiariesPagingSource
import com.egobook.app.data.util.safeApiCall
import com.egobook.app.domain.model.diary.entity.Diary
import com.egobook.app.domain.model.diary.entity.DiaryFilter
import com.egobook.app.domain.model.diary.entity.DiarySummary
import com.egobook.app.domain.model.diary.entity.DiaryType
import com.egobook.app.domain.model.diary.mapper.DiaryMapper.toDiaryCreateRequest
import com.egobook.app.domain.model.diary.mapper.DiaryMapper.toDiaryEntity
import com.egobook.app.domain.model.diary.mapper.DiaryMapper.toDiaryUpdateRequest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.egobook.app.domain.repository.CounselingRepository
import com.egobook.app.data.repository.auth.AuthRepositoryImpl
import com.egobook.app.data.repository.QuestionRepositoryImpl
import com.egobook.app.data.repository.account.AccountRepositoryImpl
import com.egobook.app.data.repository.diary.CalenderRepositoryImpl
import com.egobook.app.data.repository.diary.DiaryRepositoryImpl
import com.egobook.app.domain.repository.FriendsRepository
import com.egobook.app.domain.repository.LetterRepository
Expand All @@ -18,6 +19,7 @@ import com.egobook.app.ui.shop.StoreRepository
import dagger.Binds
import com.egobook.app.domain.repository.QuestionRepository
import com.egobook.app.domain.repository.account.AccountRepository
import com.egobook.app.domain.repository.diary.CalenderRepository
import com.egobook.app.domain.repository.diary.DiaryRepository
import com.egobook.app.ui.home.repository.NetworkPsychologyService
import com.egobook.app.ui.home.repository.HomeNotificationRepository
Expand Down Expand Up @@ -91,4 +93,8 @@ abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindHomeNotificationRepository(impl: NetworkHomeNotificationRepository): HomeNotificationRepository

@Binds
@Singleton
abstract fun bindCalenderRepository(impl: CalenderRepositoryImpl): CalenderRepository
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/egobook/app/di/module/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.egobook.app.di.module
import com.egobook.app.data.api.AIApiService
import com.egobook.app.data.api.AccountApiService
import com.egobook.app.data.api.AuthApiService
import com.egobook.app.data.api.CalenderApiService
import com.egobook.app.data.api.CounselingApiService
import com.egobook.app.data.api.DiaryApiService
import com.egobook.app.data.api.FriendsApiService
Expand Down Expand Up @@ -73,4 +74,9 @@ object ServiceModule {
@Singleton
fun provideDiaryService(@BackendApi retrofit: Retrofit): DiaryApiService =
retrofit.create(DiaryApiService::class.java)

@Provides
@Singleton
fun provideCalenderService(@BackendApi retrofit: Retrofit): CalenderApiService =
retrofit.create(CalenderApiService::class.java)
}
11 changes: 11 additions & 0 deletions app/src/main/java/com/egobook/app/di/module/UseCaseModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package com.egobook.app.di.module

import com.egobook.app.domain.repository.diary.FakeDiaryRepository
import com.egobook.app.domain.repository.auth.AuthRepository
import com.egobook.app.domain.repository.diary.CalenderRepository
import com.egobook.app.domain.repository.diary.DiaryRepository
import com.egobook.app.domain.usecase.CalenderUseCases
import com.egobook.app.domain.usecase.GetCalender
import com.egobook.app.domain.usecase.authusecase.AuthUseCases
import com.egobook.app.domain.usecase.authusecase.GoogleAutoLogin
import com.egobook.app.domain.usecase.authusecase.GoogleLogin
Expand Down Expand Up @@ -54,4 +57,12 @@ object UseCaseModule {
)
}

@Provides
@Singleton
fun provideCalenderUseCases(repository: CalenderRepository): CalenderUseCases {
return CalenderUseCases(
getCalender = GetCalender(repository)
)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.egobook.app.domain.model.calender

import java.time.LocalDate

/**
* 캘린더의 각 날짜 정보
* @param date 날짜 (ISO-8601)
* @param emotionLevel 감정 단계 (1~4, null이면 기록 없음)
* UI에서 1~4 값에 해당하는 이미지로 매핑
* 1: 매우 나쁨, 2: 나쁨, 3: 보통, 4: 좋음
*/
data class CalenderDate(
val date: LocalDate, //2026-02 형식
val emotionLevel: Int?
) {
/** 해당 월의 몇 일인지 (1~31) */
val dayOfMonth: Int
get() = date.dayOfMonth

/** 주말 여부 (토요일=6, 일요일=7) */
val isWeekend: Boolean
get() = date.dayOfWeek.value >= 6

/** 일요일 여부 (텍스트 색상용) */
val isSunday: Boolean
get() = date.dayOfWeek.value == 7

/** 토요일 여부 */
val isSaturday: Boolean
get() = date.dayOfWeek.value == 6

/** 오늘 날짜인지 */
val isToday: Boolean
get() = date == LocalDate.now()

/** 감정 기록이 있는지 (null이 아닌지) */
val hasEmotion: Boolean
get() = emotionLevel != null

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.egobook.app.domain.model.diary.mapper

import android.util.Log
import com.egobook.app.data.model.diary.response.CalenderData
import com.egobook.app.data.model.diary.response.CalenderDay
import com.egobook.app.domain.model.calender.CalenderDate
import java.time.LocalDate

/**
* Data Layer ↔ Domain Layer 변환 Mapper
*/
object CalenderMapper {

/**
* CalenderData를 도메인 객체 리스트로 변환
*/
fun dataToDomainList(calenderData: CalenderData): List<CalenderDate> {
return calenderData.days?.map { day ->
Log.d("CalenderMapper", "Mapping day: date=${day.date}, emotionLevel=${day.emotionLevel}")
dayToDomain(day)
} ?: emptyList()
}

/**
* 개별 날짜 데이터를 도메인 객체로 변환
*/
private fun dayToDomain(day: CalenderDay): CalenderDate {
return CalenderDate(
date = LocalDate.parse(day.date),
emotionLevel = day.emotionLevel
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.egobook.app.domain.repository.diary

import com.egobook.app.domain.model.calender.CalenderDate
import java.time.LocalDate

interface CalenderRepository {

suspend fun getCalender(yearMonth: LocalDate): Result<List<CalenderDate>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.egobook.app.domain.usecase

import com.egobook.app.domain.model.calender.CalenderDate
import com.egobook.app.domain.repository.diary.CalenderRepository
import java.time.LocalDate
import javax.inject.Inject

/**
* 캘린더 관련 유스케이스 래퍼 클래스
* 의존성 주입을 쉽게 하기 위한 래퍼
*/
data class CalenderUseCases @Inject constructor(
val getCalender: GetCalender
)

/**
* 특정 월의 캘린더 데이터를 가져오는 유스케이스
*/
class GetCalender @Inject constructor(
private val repository: CalenderRepository
) {
suspend operator fun invoke(yearMonth: LocalDate): Result<List<CalenderDate>> {
return repository.getCalender(yearMonth)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.egobook.app.ui.account.view

import android.content.DialogInterface
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
Expand Down Expand Up @@ -76,6 +77,11 @@ class AccountDeleteDialog1Fragment : DialogFragment() {
dismiss()
}

override fun onCancel(dialog: DialogInterface) {
super.onCancel(dialog)
removeScreenBlur()
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ class AccountFragment : Fragment() {
applyScreenBlur(BlurLevel.BASE)

val accountDeleteDialog1Fragment = AccountDeleteDialog1Fragment()
accountDeleteDialog1Fragment.isCancelable = false
accountDeleteDialog1Fragment.isCancelable = true
accountDeleteDialog1Fragment.show(childFragmentManager, "AccountDeleteDialog1Fragment")
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.egobook.app.ui.diary.mapper

import com.egobook.app.domain.model.calender.CalenderDate
import java.time.LocalDate
import java.time.YearMonth
import java.time.format.DateTimeFormatter

/**
* 캘린더 도메인 모델 ↔ UI 모델 변환 매퍼
*/
object CalenderEntityMapper {

private val YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM")

/**
* YearMonth를 API 요청용 문자열로 변환
* @return "2026-02" 형식의 문자열
*/
fun yearMonthToString(yearMonth: YearMonth): String {
return yearMonth.format(YEAR_MONTH_FORMATTER)
}

/**
* 문자열을 YearMonth로 변환
* @param yearMonthString "2026-02" 형식의 문자열
*/
fun stringToYearMonth(yearMonthString: String): YearMonth {
return YearMonth.parse(yearMonthString, YEAR_MONTH_FORMATTER)
}

/**
* CalenderDate 리스트를 Map으로 변환 (UI에서 O(1) 조회용)
* Key: LocalDate, Value: emotionLevel
*/
fun toDateEmotionMap(calenderDates: List<CalenderDate>): Map<LocalDate, Int?> {
return calenderDates.associate { it.date to it.emotionLevel }
}

/**
* 특정 날짜의 감정 레벨 조회 (매핑된 Map에서)
*/
fun getEmotionLevel(
dateMap: Map<LocalDate, Int?>,
date: LocalDate
): Int? {
return dateMap[date]
}
}
Loading