Skip to content

Commit b4ba9f3

Browse files
authored
Merge pull request #27 from DDD-Community/feature/#23-scheduledetail
Feature/#23 scheduledetail
2 parents 49880ef + ff0da87 commit b4ba9f3

File tree

55 files changed

+1555
-395
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1555
-395
lines changed

app/src/main/kotlin/com/ddd/oi/navigation/OiNavHost.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ fun OiNavHost(
5555
navigateToHome = {
5656
val navOptions = navOptions {
5757
popUpTo(Route.Login) {
58-
inclusive = true // 로그인 화면도 스택에서 제거
59-
saveState = false // 로그인 화면 상태 저장하지 않음
58+
inclusive = true
59+
saveState = false
6060
}
6161
launchSingleTop = true
6262
}
@@ -95,7 +95,8 @@ fun OiNavHost(
9595
)
9696
scheduleDetailNavGraph(
9797
onBackClick = { navigator.popBackStack() },
98-
navigateToSearchPlace = { navigator.navigateToSearchPlace(it) }
98+
navigateToSearchPlace = { navigator.navigateToSearchPlace(it) },
99+
navigateToEditPlace = { navigator.navigateToUpsertPlace(it) }
99100
)
100101

101102
searchPlaceNavGraph(
@@ -133,7 +134,7 @@ fun OiNavHost(
133134

134135
profileNavGraph(
135136
navigatePopBack = { navigator.popBackStack() },
136-
onLogout = { /* TODO: 로그아웃 처리 */ },
137+
onLogout = { navigator.navigateToLogin() },
137138
navigateToWithdraw = { navigator.navigateToWithdraw() }
138139
)
139140

data/src/main/kotlin/com/ddd/oi/data/core/datastore/AuthDataStore.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ddd.oi.data.core.datastore
22

33
import android.content.Context
4+
import android.util.Log
45
import androidx.datastore.core.DataStore
56
import androidx.datastore.preferences.core.Preferences
67
import androidx.datastore.preferences.core.edit
@@ -66,10 +67,14 @@ class AuthDataStore @Inject constructor(
6667
return context.dataStore.data.first()[Keys.REFRESH_TOKEN]
6768
}
6869

69-
/**
70-
* logout, 탈퇴시 모든 정보 제거
71-
*/
7270
suspend fun clear() {
73-
context.dataStore.edit { it.clear() }
71+
context.dataStore.edit { preferences ->
72+
val currentSocialType = preferences[Keys.CURRENT_SOCIAL]
73+
preferences.clear()
74+
currentSocialType?.let {
75+
Log.d("currentSocialType 저장", it)
76+
preferences[Keys.CURRENT_SOCIAL] = it
77+
}
78+
}
7479
}
7580
}

data/src/main/kotlin/com/ddd/oi/data/core/retrofit/api/ScheduleApiService.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.ddd.oi.data.core.retrofit.api
33
import com.ddd.oi.data.core.model.BaseResponse
44
import com.ddd.oi.data.schedule.model.ScheduleDto
55
import com.ddd.oi.data.schedule.model.ScheduleRequest
6+
import com.ddd.oi.data.scheduledetail.model.EditPlaceDto
7+
import com.ddd.oi.data.scheduledetail.model.EditPlaceRequest
68
import com.ddd.oi.data.scheduledetail.model.PlaceDto
79
import retrofit2.http.Body
810
import retrofit2.http.DELETE
@@ -53,7 +55,14 @@ interface ScheduleApiService {
5355

5456
@PUT("api/v1/schedules/{scheduleId}/details/{detailId}")
5557
suspend fun updateScheduleDetail(
58+
@Path("scheduleId") scheduleId: Long,
59+
@Path("detailId") detailId: Long,
60+
@Body request: EditPlaceRequest
61+
): BaseResponse<EditPlaceDto>
62+
63+
@DELETE("api/v1/schedules/{scheduleId}/details/{detailId}")
64+
suspend fun deleteScheduleDetail(
5665
@Path("scheduleId") scheduleId: Long,
5766
@Path("detailId") detailId: Long
58-
)
67+
): BaseResponse<Boolean>
5968
}

data/src/main/kotlin/com/ddd/oi/data/core/retrofit/di/NetworkModule.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import com.ddd.oi.data.core.retrofit.api.UserApiService
88
import com.ddd.oi.data.place.remote.PlaceApi
99
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailApi
1010
import com.ddd.oi.data.spot.remote.SpotApi
11+
import com.ddd.oi.data.core.retrofit.interceptor.TokenInterceptor
12+
import com.ddd.oi.data.core.retrofit.interceptor.TokenAuthenticator
1113
import dagger.Module
1214
import dagger.Provides
1315
import dagger.hilt.InstallIn
@@ -46,22 +48,24 @@ object NetworkModule {
4648
@Singleton
4749
fun provideOkHttpClient(
4850
loggingInterceptor: HttpLoggingInterceptor,
51+
tokenInterceptor: TokenInterceptor,
52+
tokenAuthenticator: TokenAuthenticator
4953
): OkHttpClient =
5054
OkHttpClient.Builder()
5155
.addInterceptor(loggingInterceptor)
56+
.addInterceptor(tokenInterceptor)
57+
.authenticator(tokenAuthenticator)
5258
.build()
5359

5460
@Provides
5561
@Singleton
5662
@NonAuthRetrofit
5763
fun provideNonAuthRetrofit(
5864
json: Json,
59-
okHttpClient: OkHttpClient
6065
): Retrofit {
6166
return Retrofit.Builder()
6267
.baseUrl(BuildConfig.BASE_URL)
6368
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
64-
.client(okHttpClient)
6569
.build()
6670
}
6771

@@ -123,7 +127,7 @@ object NetworkModule {
123127
): ContentApi {
124128
return retrofit.create(ContentApi::class.java)
125129
}
126-
130+
127131
@Provides
128132
@Singleton
129133
fun provideUserApiService(

data/src/main/kotlin/com/ddd/oi/data/scheduledetail/ScheduleDetailRepositoryImpl.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSource
55
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteSource
66
import com.ddd.oi.data.scheduledetail.remote.SpotRequest
77
import com.ddd.oi.domain.model.Place
8+
import com.ddd.oi.domain.model.schedule.SchedulePlace
89
import com.ddd.oi.domain.repository.ScheduleDetailRepository
910
import kotlinx.datetime.Clock
1011
import kotlinx.datetime.TimeZone
@@ -45,11 +46,7 @@ class ScheduleDetailRepositoryImpl @Inject constructor(
4546
)
4647
}
4748

48-
override suspend fun postScheduleDetail(scheduleId: Int, body: List<Place>): Boolean {
49-
val targetDate = Clock.System.now()
50-
.toLocalDateTime(TimeZone.currentSystemDefault())
51-
.toJavaLocalDateTime()
52-
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
49+
override suspend fun postScheduleDetail(scheduleId: Int, body: List<Place>, targetDate: String): Boolean {
5350
return remoteDataSource.postScheduleDetail(
5451
scheduleId,
5552
body.map { place ->
@@ -65,7 +62,7 @@ class ScheduleDetailRepositoryImpl @Inject constructor(
6562
)
6663
}
6764

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

76+
override suspend fun updateScheduleDetail(scheduleId: Long, scheduleDetail: SchedulePlace): Result<SchedulePlace> {
77+
return scheduleDetailRemoteSource.updateScheduleDetail(scheduleId, scheduleDetail).map {
78+
it.toDomain()
79+
}
80+
}
81+
82+
override suspend fun deleteScheduleDetail(
83+
scheduleId: Long,
84+
scheduleDetailId: Long
85+
): Result<Boolean> {
86+
return scheduleDetailRemoteSource.deleteScheduleDetail(scheduleId, scheduleDetailId)
87+
}
88+
7989
data class LatLng(val latitude: Double, val longitude: Double)
8090

8191
private fun convertTM128ToWGS84(mapX: Double, mapY: Double): LatLng {

data/src/main/kotlin/com/ddd/oi/data/scheduledetail/di/ScheduleDetailModule.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import dagger.Binds
1010
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailApi
1111
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSource
1212
import com.ddd.oi.data.scheduledetail.remote.ScheduleDetailRemoteDataSourceImpl
13+
import com.ddd.oi.domain.usecase.scheduledetail.DeleteScheduleDetailUseCase
14+
import com.ddd.oi.domain.usecase.scheduledetail.DeleteScheduleDetailUseCaseImpl
15+
import com.ddd.oi.domain.usecase.scheduledetail.UpdateScheduleDetailUseCase
16+
import com.ddd.oi.domain.usecase.scheduledetail.UpdateScheduleDetailUseCaseImpl
1317
import dagger.Module
1418
import dagger.Provides
1519
import dagger.hilt.InstallIn
@@ -41,6 +45,22 @@ object ScheduleDetailUseCaseModule {
4145
): GetScheduleDetailsUseCase {
4246
return GetScheduleDetailsUseCaseImpl(scheduleDetailRepository)
4347
}
48+
49+
@Provides
50+
@Singleton
51+
fun provideUpdateScheduleDetailUseCase(
52+
scheduleDetailRepository: ScheduleDetailRepository
53+
): UpdateScheduleDetailUseCase {
54+
return UpdateScheduleDetailUseCaseImpl(scheduleDetailRepository)
55+
}
56+
57+
@Provides
58+
@Singleton
59+
fun provideDeleteScheduleDetailUseCase(
60+
scheduleDetailRepository: ScheduleDetailRepository
61+
): DeleteScheduleDetailUseCase {
62+
return DeleteScheduleDetailUseCaseImpl(scheduleDetailRepository)
63+
}
4464
}
4565

4666
@Module
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.ddd.oi.data.scheduledetail.mapper
2+
3+
import com.ddd.oi.data.scheduledetail.model.EditPlaceRequest
4+
import com.ddd.oi.domain.model.schedule.SchedulePlace
5+
6+
internal fun SchedulePlace.toEditRequest(): EditPlaceRequest {
7+
return EditPlaceRequest(
8+
startTime = startTime,
9+
targetDate = targetDate,
10+
memo = memo,
11+
spotName = spotName,
12+
latitude = latitude,
13+
longitude = longitude,
14+
)
15+
}

data/src/main/kotlin/com/ddd/oi/data/scheduledetail/mapper/DtoToDomain.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.ddd.oi.data.scheduledetail.mapper
22

33
import com.ddd.oi.data.scheduledetail.model.PlaceInfo
4-
import com.ddd.oi.domain.model.schedule.Place
4+
import com.ddd.oi.domain.model.schedule.SchedulePlace
55

6-
internal fun PlaceInfo.toDomain(): Place {
7-
return Place(
6+
internal fun PlaceInfo.toDomain(): SchedulePlace {
7+
return SchedulePlace(
88
id = id,
99
startTime = startTime,
1010
targetDate = targetDate,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.ddd.oi.data.scheduledetail.model
2+
3+
import com.ddd.oi.domain.model.schedule.SchedulePlace
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class EditPlaceDto(
8+
val scheduleDetailId: Long,
9+
val startTime: String? = null,
10+
val targetDate: String,
11+
val memo: String,
12+
val spotName: String,
13+
val latitude: Double,
14+
val longitude: Double,
15+
val category: String
16+
) {
17+
fun toDomain(): SchedulePlace {
18+
return SchedulePlace(
19+
id = scheduleDetailId,
20+
startTime = startTime,
21+
targetDate = targetDate,
22+
memo = memo,
23+
spotName = spotName,
24+
latitude = latitude,
25+
longitude = longitude,
26+
category = category
27+
)
28+
}
29+
}
30+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.ddd.oi.data.scheduledetail.model
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class EditPlaceRequest(
7+
val startTime: String? = null,
8+
val targetDate: String,
9+
val memo: String,
10+
val spotName: String,
11+
val latitude: Double,
12+
val longitude: Double
13+
)

0 commit comments

Comments
 (0)