Skip to content
Open
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
61 changes: 29 additions & 32 deletions app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,18 +92,43 @@ object NetworkModule {

@Provides
@Singleton
@Kakao
fun provideKakaoOkHttpClient(
fun provideBaseOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
@Kakao kakaoAuthInterceptor: Interceptor,
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(kakaoAuthInterceptor)
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10L, TimeUnit.SECONDS)
.writeTimeout(30L, TimeUnit.SECONDS)
.readTimeout(30L, TimeUnit.SECONDS)
.build()

@Provides
@Singleton
@NoneAuth
fun provideNoneAuthOkHttpClient(baseClient: OkHttpClient): OkHttpClient =
baseClient.newBuilder().build()

@Provides
@Singleton
@Auth
fun provideAuthOkHttpClient(
baseClient: OkHttpClient,
@Auth authInterceptor: Interceptor,
tokenAuthenticator: TokenAuthenticator,
): OkHttpClient = baseClient.newBuilder()
.addInterceptor(authInterceptor)
.authenticator(tokenAuthenticator)
.build()

@Provides
@Singleton
@Kakao
fun provideKakaoOkHttpClient(
baseClient: OkHttpClient,
@Kakao kakaoAuthInterceptor: Interceptor,
): OkHttpClient = baseClient.newBuilder()
.addInterceptor(kakaoAuthInterceptor)
.build()

@Provides
@Singleton
@Kakao
Expand Down Expand Up @@ -141,34 +166,6 @@ object NetworkModule {
fun provideAuthInterceptor(tokenProvider: TokenProvider): Interceptor =
AuthInterceptor(tokenProvider)

@Provides
@Singleton
@Auth
fun provideAuthOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
@Auth authInterceptor: Interceptor,
tokenAuthenticator: TokenAuthenticator,
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(authInterceptor)
.addInterceptor(httpLoggingInterceptor)
.authenticator(tokenAuthenticator)
.connectTimeout(10L, TimeUnit.SECONDS)
.writeTimeout(30L, TimeUnit.SECONDS)
.readTimeout(30L, TimeUnit.SECONDS)
.build()

@Provides
@Singleton
@NoneAuth
fun provideNoneAuthOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10L, TimeUnit.SECONDS)
.writeTimeout(30L, TimeUnit.SECONDS)
.readTimeout(30L, TimeUnit.SECONDS)
.build()

@Provides
@Singleton
@Auth
Expand Down
39 changes: 17 additions & 22 deletions app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.threegap.bitnagil.di.data

import com.threegap.bitnagil.data.address.service.AddressService
import com.threegap.bitnagil.data.auth.service.AuthService
import com.threegap.bitnagil.data.auth.service.LoginService
import com.threegap.bitnagil.data.emotion.service.EmotionService
import com.threegap.bitnagil.data.file.service.FileService
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
Expand All @@ -19,6 +20,7 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.create
import javax.inject.Singleton

@Module
Expand All @@ -27,56 +29,49 @@ object ServiceModule {

@Provides
@Singleton
fun provideAuthService(@Auth retrofit: Retrofit): AuthService =
retrofit.create(AuthService::class.java)
fun provideAuthService(@Auth retrofit: Retrofit): AuthService = retrofit.create()

@Provides
@Singleton
fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService =
retrofit.create(OnBoardingService::class.java)
fun provideLoginService(@NoneAuth retrofit: Retrofit): LoginService = retrofit.create()

@Provides
@Singleton
fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService =
retrofit.create(RoutineService::class.java)
fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService = retrofit.create()

@Provides
@Singleton
fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService =
retrofit.create(EmotionService::class.java)
fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService = retrofit.create()

@Provides
@Singleton
fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService =
retrofit.create(ReissueService::class.java)
fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService = retrofit.create()

@Provides
@Singleton
fun provideUserService(@Auth retrofit: Retrofit): UserService =
retrofit.create(UserService::class.java)
fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService = retrofit.create()

@Provides
@Singleton
fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService =
retrofit.create(RecommendRoutineService::class.java)
fun provideUserService(@Auth retrofit: Retrofit): UserService = retrofit.create()

@Provides
@Singleton
fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService =
retrofit.create(VersionService::class.java)
fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService = retrofit.create()

@Provides
@Singleton
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService =
retrofit.create(AddressService::class.java)
fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService = retrofit.create()

@Provides
@Singleton
fun provideFileService(@Auth retrofit: Retrofit): FileService =
retrofit.create(FileService::class.java)
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService = retrofit.create()

@Provides
@Singleton
fun provideReportService(@Auth retrofit: Retrofit): ReportService =
retrofit.create(ReportService::class.java)
fun provideFileService(@Auth retrofit: Retrofit): FileService = retrofit.create()

@Provides
@Singleton
fun provideReportService(@Auth retrofit: Retrofit): ReportService = retrofit.create()
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ internal fun Project.configureKotlinAndroid(commonExtension: CommonExtension<*,
resources {
excludes.add("META-INF/AL2.0")
excludes.add("META-INF/LGPL2.1")
excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,16 @@ package com.threegap.bitnagil.network.auth
import com.threegap.bitnagil.network.token.TokenProvider
import kotlinx.coroutines.runBlocking
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response

class AuthInterceptor(
private val tokenProvider: TokenProvider,
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val noToken = originalRequest.header(HEADER_NO_SERVICE_TOKEN)

if (noToken == "true") {
return chain.proceed(removeNoTokenHeader(originalRequest))
}

val token = runBlocking { tokenProvider.getAccessToken() }
if (token.isNullOrBlank()) {
return chain.proceed(originalRequest)
}
if (token.isNullOrBlank()) return chain.proceed(originalRequest)

val newRequest = originalRequest.newBuilder()
.addHeader(HEADER_AUTHORIZATION, "$TOKEN_PREFIX $token")
Expand All @@ -29,13 +21,7 @@ class AuthInterceptor(
return chain.proceed(newRequest)
}

private fun removeNoTokenHeader(request: Request): Request =
request.newBuilder()
.removeHeader(HEADER_NO_SERVICE_TOKEN)
.build()

companion object {
private const val HEADER_NO_SERVICE_TOKEN = "No-Service-Token"
private const val HEADER_AUTHORIZATION = "Authorization"
private const val TOKEN_PREFIX = "Bearer"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class TokenAuthenticator(
private val authMutex = Mutex()

override fun authenticate(route: Route?, response: Response): Request? {
if (response.request.header(AUTO_LOGIN_HEADER) != null) return null
if (!shouldRetry(response)) return null

val currentToken = runBlocking { tokenProvider.getAccessToken() }
Expand Down Expand Up @@ -83,7 +82,6 @@ class TokenAuthenticator(
private fun buildRequestWithToken(originalRequest: Request, token: String): Request {
return originalRequest.newBuilder()
.header(AUTHORIZATION, "$TOKEN_PREFIX $token")
.removeHeader(AUTO_LOGIN_HEADER)
.build()
}

Expand All @@ -98,6 +96,5 @@ class TokenAuthenticator(
private const val AUTHORIZATION = "Authorization"
private const val TOKEN_PREFIX = "Bearer"
private const val SUCCESS_CODE = "CO000"
private const val AUTO_LOGIN_HEADER = "Auto-Login"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest
import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
import com.threegap.bitnagil.data.auth.service.AuthService
import com.threegap.bitnagil.data.auth.service.LoginService
import com.threegap.bitnagil.data.common.safeApiCall
import com.threegap.bitnagil.data.common.safeUnitApiCall
import javax.inject.Inject

class AuthRemoteDataSourceImpl @Inject constructor(
private val authService: AuthService,
private val loginService: LoginService,
) : AuthRemoteDataSource {
override suspend fun login(socialAccessToken: String, loginRequest: LoginRequest): Result<LoginResponse> =
safeApiCall {
authService.postLogin(socialAccessToken, loginRequest)
loginService.postLogin(socialAccessToken, loginRequest)
}

override suspend fun submitAgreement(termsAgreementRequest: TermsAgreementRequest): Result<Unit> =
Expand All @@ -35,6 +37,6 @@ class AuthRemoteDataSourceImpl @Inject constructor(

override suspend fun reissueToken(refreshToken: String): Result<LoginResponse> =
safeApiCall {
authService.postReissueToken(refreshToken)
loginService.postReissueToken(refreshToken)
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
package com.threegap.bitnagil.data.auth.service

import com.threegap.bitnagil.data.auth.model.request.LoginRequest
import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest
import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
import com.threegap.bitnagil.network.model.BaseResponse
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.Headers
import retrofit2.http.POST

interface AuthService {
@POST("/api/v1/auth/login")
@Headers("No-Service-Token: true")
suspend fun postLogin(
@Header("SocialAccessToken") socialAccessToken: String,
@Body loginRequest: LoginRequest,
): BaseResponse<LoginResponse>

@POST("/api/v1/auth/agreements")
suspend fun submitAgreement(
@Body termsAgreementRequest: TermsAgreementRequest,
Expand All @@ -28,10 +17,4 @@ interface AuthService {

@POST("/api/v1/auth/logout")
suspend fun postLogout(): BaseResponse<Unit>

@POST("/api/v1/auth/token/reissue")
@Headers("No-Service-Token: true", "Auto-Login: true")
suspend fun postReissueToken(
@Header("Refresh-Token") refreshToken: String,
): BaseResponse<LoginResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.threegap.bitnagil.data.auth.service

import com.threegap.bitnagil.data.auth.model.request.LoginRequest
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
import com.threegap.bitnagil.network.model.BaseResponse
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.POST

interface LoginService {
@POST("/api/v1/auth/login")
suspend fun postLogin(
@Header("SocialAccessToken") socialAccessToken: String,
@Body loginRequest: LoginRequest,
): BaseResponse<LoginResponse>

@POST("/api/v1/auth/token/reissue")
suspend fun postReissueToken(
@Header("Refresh-Token") refreshToken: String,
): BaseResponse<LoginResponse>
}
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ composeBom = "2025.06.00"
composeNavigation = "2.9.0"

# Network
okhttp = "4.11.0"
retrofit = "2.11.0"
okhttp = "5.3.2"
retrofit = "3.0.0"

# Test
junit = "4.13.2"
Expand Down
Loading