Skip to content

Commit f5c1e76

Browse files
authored
Merge pull request #21 from YAPP-Github/feature/NDGL-88/impl-home-api
[NDGL-88] 홈 화면 API 연결
2 parents 30b8711 + 5f21cb0 commit f5c1e76

28 files changed

Lines changed: 734 additions & 427 deletions

core/ui/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
<!-- Place Type -->
2222
<string name="place_type_accommodation">숙소</string>
23+
<string name="place_type_airport">공항</string>
2324
<string name="place_type_restaurant">음식점</string>
2425
<string name="place_type_attraction">관광명소</string>
2526
<string name="place_type_cafe">카페</string>

data/core/src/main/java/com/yapp/ndgl/data/core/di/NetworkModule.kt

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
package com.yapp.ndgl.data.core.di
22

3+
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
34
import com.yapp.ndgl.data.core.BuildConfig
5+
import com.yapp.ndgl.data.core.adapter.NDGLCallAdapterFactory
46
import com.yapp.ndgl.data.core.authenticator.NDGLAuthenticator
57
import com.yapp.ndgl.data.core.interceptor.NDGLInterceptor
68
import dagger.Module
79
import dagger.Provides
810
import dagger.hilt.InstallIn
911
import dagger.hilt.components.SingletonComponent
1012
import kotlinx.serialization.json.Json
13+
import kotlinx.serialization.json.JsonElement
14+
import okhttp3.MediaType.Companion.toMediaType
1115
import okhttp3.OkHttpClient
1216
import okhttp3.logging.HttpLoggingInterceptor
17+
import retrofit2.Retrofit
18+
import timber.log.Timber
1319
import javax.inject.Qualifier
1420
import javax.inject.Singleton
1521

1622
@Module
1723
@InstallIn(SingletonComponent::class)
1824
object NetworkModule {
25+
private val prettyJson = Json { prettyPrint = true }
26+
1927
@Singleton
2028
@Provides
2129
fun provideJson(): Json = Json {
@@ -26,37 +34,67 @@ object NetworkModule {
2634
@Provides
2735
fun provideBaseUrl(): String = BuildConfig.NDGL_BASE_URL
2836

37+
@Singleton
38+
@Provides
39+
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor =
40+
HttpLoggingInterceptor { message ->
41+
if (message.startsWith("{").not() && message.startsWith("[").not()) {
42+
Timber.tag("OkHttp").d(message)
43+
return@HttpLoggingInterceptor
44+
}
45+
46+
try {
47+
val element = prettyJson.decodeFromString<JsonElement>(message)
48+
Timber.tag("OkHttp").d(prettyJson.encodeToString(JsonElement.serializer(), element))
49+
} catch (_: Exception) {
50+
Timber.tag("OkHttp").d(message)
51+
}
52+
}.apply {
53+
level = if (BuildConfig.DEBUG) {
54+
HttpLoggingInterceptor.Level.BODY
55+
} else {
56+
HttpLoggingInterceptor.Level.NONE
57+
}
58+
}
59+
2960
@Singleton
3061
@Provides
3162
fun provideDefaultOkHttpClient(
3263
interceptor: NDGLInterceptor,
3364
authenticator: NDGLAuthenticator,
65+
httpLoggingInterceptor: HttpLoggingInterceptor,
3466
): OkHttpClient {
3567
val builder = OkHttpClient.Builder()
3668
.addInterceptor(interceptor)
3769
.authenticator(authenticator)
38-
39-
if (BuildConfig.DEBUG) {
40-
val loggingInterceptor = HttpLoggingInterceptor()
41-
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
42-
builder.addInterceptor(loggingInterceptor)
43-
}
44-
70+
.addInterceptor(httpLoggingInterceptor)
4571
return builder.build()
4672
}
4773

74+
@Singleton
75+
@Provides
76+
fun provideRetrofit(
77+
json: Json,
78+
baseUrl: String,
79+
okHttpClient: OkHttpClient,
80+
callAdapterFactory: NDGLCallAdapterFactory,
81+
): Retrofit {
82+
return Retrofit.Builder()
83+
.baseUrl(baseUrl)
84+
.client(okHttpClient)
85+
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
86+
.addCallAdapterFactory(callAdapterFactory)
87+
.build()
88+
}
89+
4890
@AuthClient
4991
@Singleton
5092
@Provides
51-
fun provideAuthOkHttpClient(): OkHttpClient {
93+
fun provideAuthOkHttpClient(
94+
httpLoggingInterceptor: HttpLoggingInterceptor,
95+
): OkHttpClient {
5296
val builder = OkHttpClient.Builder()
53-
54-
if (BuildConfig.DEBUG) {
55-
val loggingInterceptor = HttpLoggingInterceptor()
56-
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
57-
builder.addInterceptor(loggingInterceptor)
58-
}
59-
97+
.addInterceptor(httpLoggingInterceptor)
6098
return builder.build()
6199
}
62100
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.yapp.ndgl.data.core.serializer
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.descriptors.PrimitiveKind
5+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
6+
import kotlinx.serialization.descriptors.SerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
import java.time.LocalDate
10+
import java.time.format.DateTimeFormatter
11+
12+
object LocalDateSerializer : KSerializer<LocalDate> {
13+
private val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
14+
15+
override val descriptor: SerialDescriptor =
16+
PrimitiveSerialDescriptor(LocalDate::class.java.name, PrimitiveKind.STRING)
17+
18+
override fun serialize(encoder: Encoder, value: LocalDate) {
19+
encoder.encodeString(value.format(formatter))
20+
}
21+
22+
override fun deserialize(decoder: Decoder): LocalDate {
23+
return LocalDate.parse(decoder.decodeString(), formatter)
24+
}
25+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.yapp.ndgl.data.travel.api
2+
3+
import com.yapp.ndgl.data.core.model.BaseResponse
4+
import com.yapp.ndgl.data.travel.model.TravelProgram
5+
import retrofit2.http.GET
6+
7+
interface TravelProgramApi {
8+
@GET("/api/v1/travel-programs")
9+
suspend fun getAllPrograms(): BaseResponse<List<TravelProgram>>
10+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.yapp.ndgl.data.travel.api
2+
3+
import com.yapp.ndgl.data.core.model.BaseResponse
4+
import com.yapp.ndgl.data.travel.model.PopularTravelTemplates
5+
import com.yapp.ndgl.data.travel.model.RecommendTravelTemplates
6+
import retrofit2.http.GET
7+
import retrofit2.http.Query
8+
9+
interface TravelTemplateApi {
10+
@GET("/api/v1/travel-templates/popular")
11+
suspend fun getPopularTravelTemplates(
12+
@Query("travelProgramId") travelProgramId: Long? = null,
13+
@Query("page") page: Int? = null,
14+
@Query("size") size: Int? = null,
15+
): BaseResponse<PopularTravelTemplates>
16+
17+
@GET("/api/v1/travel-templates/recommend")
18+
suspend fun getRecommendTravelTemplates(): BaseResponse<RecommendTravelTemplates>
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.yapp.ndgl.data.travel.api
2+
3+
import com.yapp.ndgl.data.core.model.BaseResponse
4+
import com.yapp.ndgl.data.travel.model.UpcomingTravelResponse
5+
import retrofit2.http.GET
6+
7+
interface UserTravelApi {
8+
@GET("/api/v1/travels/upcoming")
9+
suspend fun getUpcomingTravel(): BaseResponse<UpcomingTravelResponse>
10+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.yapp.ndgl.data.travel.di
2+
3+
import com.yapp.ndgl.data.travel.api.TravelProgramApi
4+
import com.yapp.ndgl.data.travel.api.TravelTemplateApi
5+
import com.yapp.ndgl.data.travel.api.UserTravelApi
6+
import dagger.Module
7+
import dagger.Provides
8+
import dagger.hilt.InstallIn
9+
import dagger.hilt.components.SingletonComponent
10+
import retrofit2.Retrofit
11+
import javax.inject.Singleton
12+
13+
@Module
14+
@InstallIn(SingletonComponent::class)
15+
object TravelNetworkModule {
16+
@Provides
17+
@Singleton
18+
fun provideTravelProgramApi(
19+
retrofit: Retrofit,
20+
): TravelProgramApi = retrofit.create(TravelProgramApi::class.java)
21+
22+
@Provides
23+
@Singleton
24+
fun provideTravelTemplateApi(
25+
retrofit: Retrofit,
26+
): TravelTemplateApi = retrofit.create(TravelTemplateApi::class.java)
27+
28+
@Provides
29+
@Singleton
30+
fun provideUserTravelApi(
31+
retrofit: Retrofit,
32+
): UserTravelApi = retrofit.create(UserTravelApi::class.java)
33+
}

data/travel/src/main/java/com/yapp/ndgl/data/travel/model/InProgressTravel.kt

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.yapp.ndgl.data.travel.model
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
enum class PlaceCategory {
8+
@SerialName("AIRPORT")
9+
AIRPORT,
10+
11+
@SerialName("TRANSPORT")
12+
TRANSPORT,
13+
14+
@SerialName("ATTRACTION")
15+
ATTRACTION,
16+
17+
@SerialName("RESTAURANT")
18+
RESTAURANT,
19+
20+
@SerialName("CAFE")
21+
CAFE,
22+
23+
@SerialName("ACCOMMODATION")
24+
ACCOMMODATION,
25+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.yapp.ndgl.data.travel.model
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class PopularTravelTemplates(
7+
val content: List<TravelTemplateSummary>,
8+
val hasNext: Boolean,
9+
)

0 commit comments

Comments
 (0)