Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
58f6030
add - editplace
dongykung Jul 26, 2025
9c4027f
rename - place -> SchedulePlace
dongykung Jul 26, 2025
399803e
chore - 버튼 이름 수정
dongykung Jul 26, 2025
2851ab6
feat - SearchPlace모델 targetDate 전달
dongykung Jul 26, 2025
b65ba69
rename - Place -> SchedulePlace
dongykung Jul 26, 2025
0f1ee91
rename - Place -> SchedulePlace
dongykung Jul 26, 2025
fd996d6
feat - 버튼 영역 수정
dongykung Jul 26, 2025
8ac6cee
feat - api - update일정상세
dongykung Jul 26, 2025
6cfaa7b
feat - UpdateScheduleDetailUseCase
dongykung Jul 26, 2025
55f8ddf
feat - SearchPlace에 targetDate 전달
dongykung Jul 26, 2025
9411933
feat - updateScheduleDetail
dongykung Jul 26, 2025
101b604
rename - SchedulePlace
dongykung Jul 26, 2025
0ec7925
feat - 바텀시트 시크롤 이벤트 수정
dongykung Jul 26, 2025
bdacbb5
feat - updateSchedulePlaceTime
dongykung Jul 26, 2025
d32757f
rename - place -> SearchPlace
dongykung Jul 26, 2025
5e7c346
refactor - 장소상세 -> 검색 네비게이터 이동 간 Route 모델 전달
dongykung Jul 26, 2025
4a6c22c
feat - targetDate 받아와서 값 전달
dongykung Jul 26, 2025
f0eec7a
feat - 스와이프 시 텍스트 사라지는 기능, 다시 스와이프 돌아왔을 때 텍스트 원상복귀
dongykung Jul 26, 2025
73aab69
feat - UpdateScheduleDetailUseCaseImpl
dongykung Jul 26, 2025
7e9af2d
rename - Place -> SchedulePlace
dongykung Jul 26, 2025
5bf1b6d
refatcot - 일정 상세 -> 장소 검색간 Route 모델 전달
dongykung Jul 26, 2025
07beff7
feat PlaceInfo -> toDomain
dongykung Jul 26, 2025
c261b2d
feat - navigateToUpsertPlace
dongykung Jul 26, 2025
6b04951
feat - deleteScheduleDetail
dongykung Jul 26, 2025
476f34e
di - DeleteScheduleDetailUseCase
dongykung Jul 26, 2025
df2f85e
feat - navigateToEditPlace
dongykung Jul 26, 2025
6ffb53b
refactor - UpsertPlace 데이터 전달하기 위한 NavType
dongykung Jul 26, 2025
608fba6
feat - deleteScheduleDetail
dongykung Jul 26, 2025
e6fb770
feat - deleteScheduleDetail
dongykung Jul 26, 2025
c93892e
feat - deleteScheduleDetail
dongykung Jul 26, 2025
4b756b9
feat - eventFlow 이벤트 받기 기능
dongykung Jul 26, 2025
5dd8457
feat - eventFlow 이벤트 방출 기능
dongykung Jul 26, 2025
af2e234
feat - eventFlow 이벤트 방출 기능
dongykung Jul 26, 2025
07cef1c
feat - SchedulePlaceNavType
dongykung Jul 26, 2025
69df22a
feat - onDelete, onEdit
dongykung Jul 26, 2025
7902cf5
feat - navigateToEditPlace
dongykung Jul 26, 2025
d1cb079
feat - SchedulePlace.toEditRequest()
dongykung Jul 26, 2025
dbc5dd5
feat - DeleteScheduleDetailUseCase
dongykung Jul 26, 2025
cf9a3d7
feat - Composable -> BitMap 미완
dongykung Jul 26, 2025
bba5d3a
feat - 시간 순서 정렬 기능
dongykung Jul 26, 2025
6d80a97
feat - DateRange 바텀시트 애니메이션 300 -> 100
dongykung Aug 11, 2025
8873ce9
fix - 일정 복사, 생성모드 버그 수정
dongykung Aug 11, 2025
d1a037d
feat - 일정상세 토스트 Effect
dongykung Aug 11, 2025
181059a
feat - 일정상세 토스트 Effect
dongykung Aug 11, 2025
97123b9
fix - 달력 색상 애니메이션 제거
dongykung Aug 11, 2025
771244f
fix - 달력 색상 애니메이션 제거
dongykung Aug 11, 2025
e3141cd
feat - 스낵바
dongykung Aug 11, 2025
6a2531b
fix 시간 안나오던 버그 수정
dongykung Aug 16, 2025
d613f8c
refactor - 마커 bitMap 생성 후 마커 표시
dongykung Aug 16, 2025
18d348a
feat - 일정 상세 스낵바 수정 중
dongykung Aug 19, 2025
5cd831f
add 스낵바 리팩토링
dongykung Aug 19, 2025
517fc50
merge develop
dongykung Aug 24, 2025
1952c97
feature 로그아웃 네비게이터 연결
dongykung Aug 24, 2025
2c0c567
fix - 로그아웃 시 최근 로그인 날라가던 버그 수정
dongykung Aug 25, 2025
ff0da87
reflact 해결
dongykung Aug 25, 2025
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
9 changes: 5 additions & 4 deletions app/src/main/kotlin/com/ddd/oi/navigation/OiNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ fun OiNavHost(
navigateToHome = {
val navOptions = navOptions {
popUpTo(Route.Login) {
inclusive = true // 로그인 화면도 스택에서 제거
saveState = false // 로그인 화면 상태 저장하지 않음
inclusive = true
saveState = false
}
launchSingleTop = true
}
Expand Down Expand Up @@ -95,7 +95,8 @@ fun OiNavHost(
)
scheduleDetailNavGraph(
onBackClick = { navigator.popBackStack() },
navigateToSearchPlace = { navigator.navigateToSearchPlace(it) }
navigateToSearchPlace = { navigator.navigateToSearchPlace(it) },
navigateToEditPlace = { navigator.navigateToUpsertPlace(it) }
)

searchPlaceNavGraph(
Expand Down Expand Up @@ -133,7 +134,7 @@ fun OiNavHost(

profileNavGraph(
navigatePopBack = { navigator.popBackStack() },
onLogout = { /* TODO: 로그아웃 처리 */ },
onLogout = { navigator.navigateToLogin() },
navigateToWithdraw = { navigator.navigateToWithdraw() }
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ddd.oi.data.core.datastore

import android.content.Context
import android.util.Log
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
Expand Down Expand Up @@ -66,10 +67,14 @@ class AuthDataStore @Inject constructor(
return context.dataStore.data.first()[Keys.REFRESH_TOKEN]
}

/**
* logout, 탈퇴시 모든 정보 제거
*/
suspend fun clear() {
context.dataStore.edit { it.clear() }
context.dataStore.edit { preferences ->
val currentSocialType = preferences[Keys.CURRENT_SOCIAL]
preferences.clear()
currentSocialType?.let {
Log.d("currentSocialType 저장", it)
preferences[Keys.CURRENT_SOCIAL] = it
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.ddd.oi.data.core.retrofit.api
import com.ddd.oi.data.core.model.BaseResponse
import com.ddd.oi.data.schedule.model.ScheduleDto
import com.ddd.oi.data.schedule.model.ScheduleRequest
import com.ddd.oi.data.scheduledetail.model.EditPlaceDto
import com.ddd.oi.data.scheduledetail.model.EditPlaceRequest
import com.ddd.oi.data.scheduledetail.model.PlaceDto
import retrofit2.http.Body
import retrofit2.http.DELETE
Expand Down Expand Up @@ -53,7 +55,14 @@ interface ScheduleApiService {

@PUT("api/v1/schedules/{scheduleId}/details/{detailId}")
suspend fun updateScheduleDetail(
@Path("scheduleId") scheduleId: Long,
@Path("detailId") detailId: Long,
@Body request: EditPlaceRequest
): BaseResponse<EditPlaceDto>

@DELETE("api/v1/schedules/{scheduleId}/details/{detailId}")
suspend fun deleteScheduleDetail(
@Path("scheduleId") scheduleId: Long,
@Path("detailId") detailId: Long
)
): BaseResponse<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import com.ddd.oi.data.core.retrofit.api.UserApiService
import com.ddd.oi.data.place.remote.PlaceApi
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailApi
import com.ddd.oi.data.spot.remote.SpotApi
import com.ddd.oi.data.core.retrofit.interceptor.TokenInterceptor
import com.ddd.oi.data.core.retrofit.interceptor.TokenAuthenticator
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -46,22 +48,24 @@ object NetworkModule {
@Singleton
fun provideOkHttpClient(
loggingInterceptor: HttpLoggingInterceptor,
tokenInterceptor: TokenInterceptor,
tokenAuthenticator: TokenAuthenticator
): OkHttpClient =
OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.addInterceptor(tokenInterceptor)
.authenticator(tokenAuthenticator)
.build()

@Provides
@Singleton
@NonAuthRetrofit
fun provideNonAuthRetrofit(
json: Json,
okHttpClient: OkHttpClient
): Retrofit {
return Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.client(okHttpClient)
.build()
}

Expand Down Expand Up @@ -123,7 +127,7 @@ object NetworkModule {
): ContentApi {
return retrofit.create(ContentApi::class.java)
}

@Provides
@Singleton
fun provideUserApiService(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSource
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteSource
import com.ddd.oi.data.scheduledetail.remote.SpotRequest
import com.ddd.oi.domain.model.Place
import com.ddd.oi.domain.model.schedule.SchedulePlace
import com.ddd.oi.domain.repository.ScheduleDetailRepository
import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
Expand Down Expand Up @@ -45,11 +46,7 @@ class ScheduleDetailRepositoryImpl @Inject constructor(
)
}

override suspend fun postScheduleDetail(scheduleId: Int, body: List<Place>): Boolean {
val targetDate = Clock.System.now()
.toLocalDateTime(TimeZone.currentSystemDefault())
.toJavaLocalDateTime()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
override suspend fun postScheduleDetail(scheduleId: Int, body: List<Place>, targetDate: String): Boolean {
return remoteDataSource.postScheduleDetail(
scheduleId,
body.map { place ->
Expand All @@ -65,7 +62,7 @@ class ScheduleDetailRepositoryImpl @Inject constructor(
)
}

override suspend fun getScheduleDetail(scheduleId: Long): Result<Map<String, List<com.ddd.oi.domain.model.schedule.Place>>> {
override suspend fun getScheduleDetail(scheduleId: Long): Result<Map<String, List<SchedulePlace>>> {
return scheduleDetailRemoteSource.getScheduleDetails(scheduleId).map { dtoList ->
dtoList.associateBy(
keySelector = { it.targetDate },
Expand All @@ -76,6 +73,19 @@ class ScheduleDetailRepositoryImpl @Inject constructor(
}
}

override suspend fun updateScheduleDetail(scheduleId: Long, scheduleDetail: SchedulePlace): Result<SchedulePlace> {
return scheduleDetailRemoteSource.updateScheduleDetail(scheduleId, scheduleDetail).map {
it.toDomain()
}
}

override suspend fun deleteScheduleDetail(
scheduleId: Long,
scheduleDetailId: Long
): Result<Boolean> {
return scheduleDetailRemoteSource.deleteScheduleDetail(scheduleId, scheduleDetailId)
}

data class LatLng(val latitude: Double, val longitude: Double)

private fun convertTM128ToWGS84(mapX: Double, mapY: Double): LatLng {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import dagger.Binds
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailApi
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSource
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSourceImpl
import com.ddd.oi.domain.usecase.scheduledetail.DeleteScheduleDetailUseCase
import com.ddd.oi.domain.usecase.scheduledetail.DeleteScheduleDetailUseCaseImpl
import com.ddd.oi.domain.usecase.scheduledetail.UpdateScheduleDetailUseCase
import com.ddd.oi.domain.usecase.scheduledetail.UpdateScheduleDetailUseCaseImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -41,6 +45,22 @@ object ScheduleDetailUseCaseModule {
): GetScheduleDetailsUseCase {
return GetScheduleDetailsUseCaseImpl(scheduleDetailRepository)
}

@Provides
@Singleton
fun provideUpdateScheduleDetailUseCase(
scheduleDetailRepository: ScheduleDetailRepository
): UpdateScheduleDetailUseCase {
return UpdateScheduleDetailUseCaseImpl(scheduleDetailRepository)
}

@Provides
@Singleton
fun provideDeleteScheduleDetailUseCase(
scheduleDetailRepository: ScheduleDetailRepository
): DeleteScheduleDetailUseCase {
return DeleteScheduleDetailUseCaseImpl(scheduleDetailRepository)
}
}

@Module
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ddd.oi.data.scheduledetail.mapper

import com.ddd.oi.data.scheduledetail.model.EditPlaceRequest
import com.ddd.oi.domain.model.schedule.SchedulePlace

internal fun SchedulePlace.toEditRequest(): EditPlaceRequest {
return EditPlaceRequest(
startTime = startTime,
targetDate = targetDate,
memo = memo,
spotName = spotName,
latitude = latitude,
longitude = longitude,
)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.ddd.oi.data.scheduledetail.mapper

import com.ddd.oi.data.scheduledetail.model.PlaceInfo
import com.ddd.oi.domain.model.schedule.Place
import com.ddd.oi.domain.model.schedule.SchedulePlace

internal fun PlaceInfo.toDomain(): Place {
return Place(
internal fun PlaceInfo.toDomain(): SchedulePlace {
return SchedulePlace(
id = id,
startTime = startTime,
targetDate = targetDate,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.ddd.oi.data.scheduledetail.model

import com.ddd.oi.domain.model.schedule.SchedulePlace
import kotlinx.serialization.Serializable

@Serializable
data class EditPlaceDto(
val scheduleDetailId: Long,
val startTime: String? = null,
val targetDate: String,
val memo: String,
val spotName: String,
val latitude: Double,
val longitude: Double,
val category: String
) {
fun toDomain(): SchedulePlace {
return SchedulePlace(
id = scheduleDetailId,
startTime = startTime,
targetDate = targetDate,
memo = memo,
spotName = spotName,
latitude = latitude,
longitude = longitude,
category = category
)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ddd.oi.data.scheduledetail.model

import kotlinx.serialization.Serializable

@Serializable
data class EditPlaceRequest(
val startTime: String? = null,
val targetDate: String,
val memo: String,
val spotName: String,
val latitude: Double,
val longitude: Double
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.ddd.oi.data.scheduledetail.remote

import com.ddd.oi.data.scheduledetail.model.EditPlaceDto
import com.ddd.oi.data.scheduledetail.model.PlaceDto
import com.ddd.oi.domain.model.schedule.SchedulePlace

interface ScheduleDetailRemoteSource {
suspend fun getScheduleDetails(scheduleId: Long): Result<List<PlaceDto>>

suspend fun updateScheduleDetail(scheduleId: Long, schedulePlace: SchedulePlace): Result<EditPlaceDto>

suspend fun deleteScheduleDetail(scheduleId: Long, scheduleDetailId: Long): Result<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package com.ddd.oi.data.scheduledetail.remote

import com.ddd.oi.data.core.model.safeApiCall
import com.ddd.oi.data.core.retrofit.api.ScheduleApiService
import com.ddd.oi.data.scheduledetail.mapper.toEditRequest
import com.ddd.oi.data.scheduledetail.model.EditPlaceDto
import com.ddd.oi.data.scheduledetail.model.PlaceDto
import com.ddd.oi.data.scheduledetail.model.PlaceInfo
import com.ddd.oi.domain.model.schedule.SchedulePlace
import javax.inject.Inject

class ScheduleDetailRemoteSourceImpl @Inject constructor(
Expand All @@ -14,4 +17,21 @@ class ScheduleDetailRemoteSourceImpl @Inject constructor(
scheduleApiService.getScheduleDetails(scheduleId = scheduleId)
}
}

override suspend fun updateScheduleDetail(scheduleId: Long, schedulePlace: SchedulePlace): Result<EditPlaceDto> {
val detailId = schedulePlace.id
val request = schedulePlace.toEditRequest()
return safeApiCall {
scheduleApiService.updateScheduleDetail(scheduleId = scheduleId, detailId = detailId, request = request)
}
}

override suspend fun deleteScheduleDetail(
scheduleId: Long,
scheduleDetailId: Long
): Result<Boolean> {
return safeApiCall {
scheduleApiService.deleteScheduleDetail(scheduleId, scheduleDetailId)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ data class Schedule(
val endedAt: LocalDate,
val transportation: Transportation,
val partySet: Set<Party>,
val placeList: List<Place>
val placeList: List<SchedulePlace>
)

// todo api 응답이랑 매핑 되게 수정 필요
@Serializable
data class Place(
data class SchedulePlace(
val id: Long,
val startTime: String? = null,
val targetDate: String,
Expand Down Expand Up @@ -46,5 +46,5 @@ enum class Party {
}

data class ScheduleDetail(
val details: Map<String, List<Place>>
val details: Map<String, List<SchedulePlace>>
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.ddd.oi.domain.repository

import com.ddd.oi.domain.model.Place

import com.ddd.oi.domain.model.schedule.SchedulePlace


interface ScheduleDetailRepository {
suspend fun getScheduleDetail(scheduleId: Long): Result<Map<String, List<com.ddd.oi.domain.model.schedule.Place>>>
suspend fun getScheduleDetail(scheduleId: Long): Result<Map<String, List<SchedulePlace>>>

suspend fun updateScheduleDetail(scheduleId: Long, scheduleDetail: SchedulePlace): Result<SchedulePlace>

suspend fun deleteScheduleDetail(scheduleId: Long, scheduleDetailId: Long): Result<Boolean>

suspend fun putScheduleDetail(
scheduleId: Int,
Expand All @@ -16,6 +19,7 @@ interface ScheduleDetailRepository {

suspend fun postScheduleDetail(
scheduleId: Int,
body: List<Place>
body: List<Place>,
targetDate: String
): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.ddd.oi.domain.usecase.scheduledetail

interface DeleteScheduleDetailUseCase {
suspend operator fun invoke(scheduleId: Long, scheduleDetailId: Long): Result<Boolean>
}
Loading