From 03d6e7745ca14d3645fe110c72a64f90da1c1978 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 02:05:15 +0900 Subject: [PATCH 1/7] refactor#74 start destination --- .../src/main/java/com/teamsolply/solply/main/MainNavigator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index 778dc704..75409736 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -27,7 +27,7 @@ internal class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = OnBoarding + val startDestination = Splash val currentTab: MainNavTab? @Composable get() = MainNavTab.find { tab -> From 73bc90c270f68a7b016823198a6daefbc52354a2 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:54:08 +0900 Subject: [PATCH 2/7] feature#74 social login api --- app/build.gradle.kts | 1 + .../component/textfield/SolplyTextField.kt | 11 ++--- .../dto/response/SocialLoginResponseDto.kt | 14 ++++++ .../oauth/repository/OauthRepositoryImpl.kt | 30 ++++++++++--- .../oauth/source/OauthRemoteDataSource.kt | 7 +++ .../repository/OnBoardingRepositoryImpl.kt | 10 +---- .../source/OnBoardingRemoteDataSource.kt | 4 +- .../solply/oauth/model/TokenEntity.kt | 3 +- .../oauth/repository/OauthRepository.kt | 3 +- .../repository/OnBoardingRepository.kt | 6 +-- .../teamsolply/solply/main/MainNavigator.kt | 1 - .../teamsolply/solply/oauth/OauthContract.kt | 3 +- .../teamsolply/solply/oauth/OauthScreen.kt | 13 ++---- .../teamsolply/solply/oauth/OauthViewModel.kt | 43 +++++++++++++------ .../solply/onboarding/OnBoardingScreen.kt | 21 ++++----- .../solply/onboarding/component/BackHeader.kt | 2 - .../navigation/OnBoardingNavigation.kt | 4 +- .../onboarding/screen/SelectPersonaScreen.kt | 2 - remote/oauth/.gitignore | 1 + remote/oauth/build.gradle.kts | 13 ++++++ .../datasource/OauthRemoteDataSourceImpl.kt | 18 ++++++++ .../solply/oauth/di/OauthRemoteDataModule.kt | 17 ++++++++ .../solply/oauth/di/OauthServiceModule.kt | 19 ++++++++ .../solply/oauth/service/OauthService.kt | 15 +++++++ .../OnBoardingRemoteDataSourceImpl.kt | 10 +---- settings.gradle.kts | 1 + 26 files changed, 193 insertions(+), 79 deletions(-) create mode 100644 data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt create mode 100644 data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt create mode 100644 remote/oauth/.gitignore create mode 100644 remote/oauth/build.gradle.kts create mode 100644 remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt create mode 100644 remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt create mode 100644 remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt create mode 100644 remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 65ee0699..842961ec 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -32,6 +32,7 @@ dependencies { implementation(projects.local.main) implementation(projects.local.oauth) implementation(projects.local.place) + implementation(projects.remote.oauth) implementation(projects.remote.onboarding) implementation(projects.remote.place) implementation(projects.remote.course) diff --git a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt index e62decc6..31849efb 100644 --- a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt +++ b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt @@ -130,16 +130,16 @@ fun SolplyNicknameTextField( NickNameValidateState.MaxLength, NickNameValidateState.Typing ) || - (validationState == NickNameValidateState.Empty && value.isNotEmpty()) + (validationState == NickNameValidateState.Empty && value.isNotEmpty()) LaunchedEffect(value) { if (value.isNotEmpty()) { isTyping = true delay(300) - if(value.length + NickNameValidateState.TooShort + ) -> Pair(SolplyTheme.colors.white, SolplyTheme.colors.red600) validationState == NickNameValidateState.Typing -> diff --git a/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt new file mode 100644 index 00000000..5e76141d --- /dev/null +++ b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt @@ -0,0 +1,14 @@ +package com.teamsolply.solply.oauth.dto.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SocialLoginResponseDto( + @SerialName("accessToken") + val accessToken: String, + @SerialName("refreshToken") + val refreshToken: String, + @SerialName("isNewUser") + val isNewUser: Boolean +) diff --git a/data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt b/data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt index 900a7170..2c7a3021 100644 --- a/data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt +++ b/data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt @@ -2,15 +2,35 @@ package com.teamsolply.solply.oauth.repository import com.teamsolply.solply.oauth.model.TokenEntity import com.teamsolply.solply.oauth.source.OauthLocalDataSource +import com.teamsolply.solply.oauth.source.OauthRemoteDataSource import javax.inject.Inject class OauthRepositoryImpl @Inject constructor( - private val oauthLocalDataSource: OauthLocalDataSource + private val oauthLocalDataSource: OauthLocalDataSource, + private val oauthRemoteDataSource: OauthRemoteDataSource ) : OauthRepository { - override suspend fun saveJwtToken(jwtToken: TokenEntity): Result = runCatching { - oauthLocalDataSource.setAuthLocalData( - accessToken = jwtToken.accessToken, - refreshToken = jwtToken.refreshToken + + override suspend fun postSocialLogin( + provider: String, + oauthAccessToken: String + ): Result = runCatching { + oauthRemoteDataSource.socialLogin( + provider = provider, + oauthAccessToken = oauthAccessToken + ) + }.mapCatching { + TokenEntity( + accessToken = it.accessToken, + refreshToken = it.refreshToken, + isNewUser = it.isNewUser ) } + + override suspend fun saveJwtToken(accessToken: String, refreshToken: String): Result = + runCatching { + oauthLocalDataSource.setAuthLocalData( + accessToken = accessToken, + refreshToken = refreshToken + ) + } } diff --git a/data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt b/data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt new file mode 100644 index 00000000..50e28fbe --- /dev/null +++ b/data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt @@ -0,0 +1,7 @@ +package com.teamsolply.solply.oauth.source + +import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto + +interface OauthRemoteDataSource { + suspend fun socialLogin(provider: String, oauthAccessToken: String): SocialLoginResponseDto +} diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt index b1737c87..40cb671b 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt @@ -1,16 +1,8 @@ package com.teamsolply.solply.onboarding.repository -import com.teamsolply.solply.onboarding.model.SignUpEntity import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource import javax.inject.Inject class OnBoardingRepositoryImpl @Inject constructor( private val onBoardingRemoteDataSource: OnBoardingRemoteDataSource -) : OnBoardingRepository { - override suspend fun signUp(signUpInfo: SignUpEntity) = runCatching { - onBoardingRemoteDataSource.signUp( - nickname = signUpInfo.nickname, - id = signUpInfo.userId - ) - } -} +) : OnBoardingRepository diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt index a71a0cfd..ff4b6489 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt @@ -1,5 +1,3 @@ package com.teamsolply.solply.onboarding.source -interface OnBoardingRemoteDataSource { - suspend fun signUp(nickname: String, id: Int) -} +interface OnBoardingRemoteDataSource diff --git a/domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt b/domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt index 67ca7e04..c27c9ef6 100644 --- a/domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt +++ b/domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt @@ -2,5 +2,6 @@ package com.teamsolply.solply.oauth.model data class TokenEntity( val accessToken: String, - val refreshToken: String + val refreshToken: String, + val isNewUser: Boolean ) diff --git a/domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt b/domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt index b21cd4f7..9498e6cd 100644 --- a/domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt +++ b/domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt @@ -3,5 +3,6 @@ package com.teamsolply.solply.oauth.repository import com.teamsolply.solply.oauth.model.TokenEntity interface OauthRepository { - suspend fun saveJwtToken(jwtToken: TokenEntity): Result + suspend fun postSocialLogin(provider: String, oauthAccessToken: String): Result + suspend fun saveJwtToken(accessToken: String, refreshToken: String): Result } diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt index ddfd738c..04e90ab3 100644 --- a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt +++ b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt @@ -1,7 +1,3 @@ package com.teamsolply.solply.onboarding.repository -import com.teamsolply.solply.onboarding.model.SignUpEntity - -interface OnBoardingRepository { - suspend fun signUp(signUpInfo: SignUpEntity): Result -} +interface OnBoardingRepository diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index 75409736..a5542d50 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -16,7 +16,6 @@ import com.teamsolply.solply.mypage.collection.course.navigateCourseCollection import com.teamsolply.solply.mypage.collection.place.navigatePlaceCollection import com.teamsolply.solply.mypage.navigation.navigateMypage import com.teamsolply.solply.oauth.navigation.navigateOauth -import com.teamsolply.solply.onboarding.navigation.OnBoarding import com.teamsolply.solply.onboarding.navigation.navigateOnBoarding import com.teamsolply.solply.place.navigation.navigatePlace diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt index eacd739a..cd65d278 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt @@ -10,8 +10,9 @@ data class OauthState( sealed interface OauthIntent : UiIntent { data object KakaoLoginClick : OauthIntent - data class KakaoLoginSuccess(val accessToken: String, val refreshToken: String?) : OauthIntent + data class KakaoLoginSuccess(val provider: String, val accessToken: String) : OauthIntent data class KakaoLoginFailure(val error: Throwable) : OauthIntent + data class SaveJwtToken(val accessToken: String, val refreshToken: String) : OauthIntent } sealed interface OauthSideEffect : SideEffect { diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt index c26d0a79..c0a31727 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt @@ -54,20 +54,13 @@ fun OauthRoute( when (sideEffect) { OauthSideEffect.StartKakaoLogin -> startKakaoLogin( context = context, - onSuccess = { accessToken, refreshToken -> + onSuccess = { accessToken, _ -> viewModel.sendIntent( OauthIntent.KakaoLoginSuccess( - accessToken = accessToken, - refreshToken = refreshToken + provider = "KAKAO", + accessToken = accessToken ) ) - Log.d( - "asdasdasd", - "accessToken: ${accessToken}\n refreshToken: $refreshToken" - ) - }, - onFailure = { error -> - Log.d("asdasdasd", error.toString()) } ) diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt index dbd02985..58efeb87 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt @@ -1,7 +1,7 @@ package com.teamsolply.solply.oauth +import android.util.Log import androidx.lifecycle.viewModelScope -import com.teamsolply.solply.oauth.model.TokenEntity import com.teamsolply.solply.oauth.repository.OauthRepository import com.teamsolply.solply.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -16,28 +16,45 @@ class OauthViewModel @Inject constructor( override fun handleIntent(intent: OauthIntent) { when (intent) { OauthIntent.KakaoLoginClick -> postSideEffect(OauthSideEffect.StartKakaoLogin) - is OauthIntent.KakaoLoginSuccess -> saveJwtToken( - intent.accessToken, - intent.refreshToken + is OauthIntent.KakaoLoginSuccess -> postSocialLogin( + provider = intent.provider, + oauthAccessToken = intent.accessToken ) is OauthIntent.KakaoLoginFailure -> { TODO() } + + is OauthIntent.SaveJwtToken -> { + viewModelScope.launch { + oauthRepository.saveJwtToken( + intent.accessToken, + intent.refreshToken + ).onSuccess { + postSideEffect(OauthSideEffect.NavigateToOnBoarding) + } + } + } } } - private fun saveJwtToken(accessToken: String, refreshToken: String?) { + private fun postSocialLogin( + provider: String, + oauthAccessToken: String + ) { viewModelScope.launch { - refreshToken?.let { checkedRefreshToken -> - val token = TokenEntity( - accessToken = accessToken, - refreshToken = checkedRefreshToken + oauthRepository.postSocialLogin( + provider = provider, + oauthAccessToken = oauthAccessToken + ).onSuccess { + sendIntent( + OauthIntent.SaveJwtToken( + accessToken = it.accessToken, + refreshToken = it.refreshToken + ) ) - oauthRepository.saveJwtToken(token) - .onSuccess { - postSideEffect(OauthSideEffect.NavigateToOnBoarding) - } + }.onFailure { + Log.d("asdasdasd", it.toString()) } } } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt index 23c0dab5..f5e010db 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt @@ -8,26 +8,26 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PageSize import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.teamsolply.solply.designsystem.theme.SolplyTheme -import com.teamsolply.solply.ui.lifecycle.LaunchedEffectWithLifecycle -import kotlinx.coroutines.flow.collectLatest -import androidx.compose.foundation.pager.PageSize -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.teamsolply.solply.designsystem.theme.SolplyTheme import com.teamsolply.solply.onboarding.component.BackHeader import com.teamsolply.solply.onboarding.component.ProgressBar import com.teamsolply.solply.onboarding.screen.NamingScreen import com.teamsolply.solply.onboarding.screen.SelectPersonaScreen import com.teamsolply.solply.onboarding.screen.SelectTownScreen import com.teamsolply.solply.onboarding.screen.StartingScreen +import com.teamsolply.solply.ui.lifecycle.LaunchedEffectWithLifecycle +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @Composable @@ -42,7 +42,7 @@ fun OnBoardingRoute( LaunchedEffectWithLifecycle { viewModel.sideEffect.collectLatest { sideEffect -> when (sideEffect) { - is OnBoardingSideEffect.NavigateToPlace -> {navigateToPlace()} + is OnBoardingSideEffect.NavigateToPlace -> { navigateToPlace() } } } } @@ -78,7 +78,8 @@ fun OnBoardingScreen( ) { val pagerState = rememberPagerState( initialPage = state.currentPage, - pageCount = { state.totalPageCount }) + pageCount = { state.totalPageCount } + ) val scope = rememberCoroutineScope() @@ -131,7 +132,7 @@ fun OnBoardingScreen( ProgressBar( pageState = pagerState, - totalpageCount = state.totalPageCount, + totalpageCount = state.totalPageCount ) HorizontalPager( @@ -173,4 +174,4 @@ fun OnBoardingScreen( } } } -} \ No newline at end of file +} diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt index ff61bb70..f3e23276 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt @@ -3,7 +3,6 @@ package com.teamsolply.solply.onboarding.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Icon import androidx.compose.runtime.Composable @@ -14,7 +13,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.teamsolply.solply.ui.extension.customClickable - @Composable fun BackHeader( barText: String, diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt index 3497e36f..0d863e7b 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt @@ -18,9 +18,9 @@ fun NavController.navigateOnBoarding( fun NavGraphBuilder.onBoardingNavGraph( navController: NavController, paddingValues: PaddingValues, - navigateToPlace: () -> Unit, + navigateToPlace: () -> Unit - ) { +) { composable { OnBoardingRoute( paddingValues = paddingValues, diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt index 18d8fcce..3ce909ae 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt @@ -9,8 +9,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp diff --git a/remote/oauth/.gitignore b/remote/oauth/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/remote/oauth/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/remote/oauth/build.gradle.kts b/remote/oauth/build.gradle.kts new file mode 100644 index 00000000..a3d9266e --- /dev/null +++ b/remote/oauth/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + alias(libs.plugins.solply.remote) +} + +android { + namespace = "com.teamsolply.solply.oauth" +} + +dependencies { + implementation(projects.core.network) + implementation(projects.core.model) + implementation(projects.data.oauth) +} diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt new file mode 100644 index 00000000..d8821b65 --- /dev/null +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt @@ -0,0 +1,18 @@ +package com.teamsolply.solply.oauth.datasource + +import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto +import com.teamsolply.solply.oauth.service.OauthService +import com.teamsolply.solply.oauth.source.OauthRemoteDataSource +import javax.inject.Inject + +class OauthRemoteDataSourceImpl @Inject constructor( + private val oauthService: OauthService +) : OauthRemoteDataSource { + override suspend fun socialLogin( + provider: String, + oauthAccessToken: String + ): SocialLoginResponseDto = oauthService.postSocialLogin( + provider = provider, + oauthAccessToken = oauthAccessToken + ).data +} diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt new file mode 100644 index 00000000..1214c94a --- /dev/null +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt @@ -0,0 +1,17 @@ +package com.teamsolply.solply.oauth.di + +import com.teamsolply.solply.oauth.datasource.OauthRemoteDataSourceImpl +import com.teamsolply.solply.oauth.source.OauthRemoteDataSource +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class OauthRemoteDataModule { + @Binds + @Singleton + abstract fun bindsOauthRemoteDataSource(oauthRemoteDataSource: OauthRemoteDataSourceImpl): OauthRemoteDataSource +} diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt new file mode 100644 index 00000000..a7235153 --- /dev/null +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt @@ -0,0 +1,19 @@ +package com.teamsolply.solply.oauth.di + +import com.teamsolply.solply.network.di.NoneAccessToken +import com.teamsolply.solply.oauth.service.OauthService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object OauthServiceModule { + @Provides + @Singleton + fun providesOauthService(@NoneAccessToken retrofit: Retrofit): OauthService = + retrofit.create(OauthService::class.java) +} diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt new file mode 100644 index 00000000..8cb01637 --- /dev/null +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt @@ -0,0 +1,15 @@ +package com.teamsolply.solply.oauth.service + +import com.teamsolply.solply.network.model.BaseResponse +import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto +import retrofit2.http.Body +import retrofit2.http.POST +import retrofit2.http.Path + +interface OauthService { + @POST("api/auth/social/{provider}/login") + suspend fun postSocialLogin( + @Path("provider") provider: String, + @Body oauthAccessToken: String + ): BaseResponse +} diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt index 968859b1..3c7d03a8 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt @@ -1,17 +1,9 @@ package com.teamsolply.solply.onboarding.datasource -import com.teamsolply.solply.onboarding.dto.request.SignUpRequestDto import com.teamsolply.solply.onboarding.service.OnBoardingService import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource import javax.inject.Inject class OnBoardingRemoteDataSourceImpl @Inject constructor( private val onBoardingService: OnBoardingService -) : OnBoardingRemoteDataSource { - override suspend fun signUp(nickname: String, id: Int) = onBoardingService.signUp( - SignUpRequestDto( - nickname = nickname, - id = id - ) - ) -} +) : OnBoardingRemoteDataSource diff --git a/settings.gradle.kts b/settings.gradle.kts index a327c010..e0c19692 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -50,6 +50,7 @@ include(":data:maps") include(":local:main") include(":local:oauth") include(":local:place") +include(":remote:oauth") include(":remote:onboarding") include(":remote:place") include(":remote:course") From 3d6b40bf49afccfcb1a16d45a0819a1dc2992147 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 18:21:33 +0900 Subject: [PATCH 3/7] refactor#74 login flow --- .../java/com/teamsolply/solply/main/MainNavigator.kt | 3 ++- .../main/java/com/teamsolply/solply/main/MainScreen.kt | 9 +++++++++ .../java/com/teamsolply/solply/oauth/OauthContract.kt | 7 ++++++- .../main/java/com/teamsolply/solply/oauth/OauthScreen.kt | 2 ++ .../java/com/teamsolply/solply/oauth/OauthViewModel.kt | 9 +++++++-- .../solply/oauth/navigation/OauthNavigation.kt | 6 ++++-- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index a5542d50..778dc704 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -16,6 +16,7 @@ import com.teamsolply.solply.mypage.collection.course.navigateCourseCollection import com.teamsolply.solply.mypage.collection.place.navigatePlaceCollection import com.teamsolply.solply.mypage.navigation.navigateMypage import com.teamsolply.solply.oauth.navigation.navigateOauth +import com.teamsolply.solply.onboarding.navigation.OnBoarding import com.teamsolply.solply.onboarding.navigation.navigateOnBoarding import com.teamsolply.solply.place.navigation.navigatePlace @@ -26,7 +27,7 @@ internal class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = Splash + val startDestination = OnBoarding val currentTab: MainNavTab? @Composable get() = MainNavTab.find { tab -> diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt index 0c9cf097..9b8ee011 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt @@ -130,6 +130,15 @@ internal fun MainScreen( launchSingleTop = true } navigator.navigateToOnboarding(navOptions) + }, + navigateToPlace = { + val navOptions = navOptions { + popUpTo(0) { + inclusive = true + } + launchSingleTop = true + } + navigator.navigateToPlace(navOptions = navOptions) } ) onBoardingNavGraph( diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt index cd65d278..5d6bbc03 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt @@ -12,10 +12,15 @@ sealed interface OauthIntent : UiIntent { data object KakaoLoginClick : OauthIntent data class KakaoLoginSuccess(val provider: String, val accessToken: String) : OauthIntent data class KakaoLoginFailure(val error: Throwable) : OauthIntent - data class SaveJwtToken(val accessToken: String, val refreshToken: String) : OauthIntent + data class SaveJwtToken( + val accessToken: String, + val refreshToken: String, + val isNewUser: Boolean + ) : OauthIntent } sealed interface OauthSideEffect : SideEffect { data object StartKakaoLogin : OauthSideEffect data object NavigateToOnBoarding : OauthSideEffect + data object NavigateToPlace : OauthSideEffect } diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt index c0a31727..c512627d 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt @@ -44,6 +44,7 @@ import kotlinx.coroutines.flow.collectLatest fun OauthRoute( paddingValues: PaddingValues, navigateToOnBoarding: () -> Unit, + navigateToPlace: () -> Unit, viewModel: OauthViewModel = hiltViewModel() ) { val context = LocalContext.current @@ -65,6 +66,7 @@ fun OauthRoute( ) OauthSideEffect.NavigateToOnBoarding -> navigateToOnBoarding() + OauthSideEffect.NavigateToPlace -> navigateToPlace() } } } diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt index 58efeb87..a728459f 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt @@ -31,7 +31,11 @@ class OauthViewModel @Inject constructor( intent.accessToken, intent.refreshToken ).onSuccess { - postSideEffect(OauthSideEffect.NavigateToOnBoarding) + if (intent.isNewUser) { + postSideEffect(OauthSideEffect.NavigateToOnBoarding) + } else { + postSideEffect(OauthSideEffect.NavigateToPlace) + } } } } @@ -50,7 +54,8 @@ class OauthViewModel @Inject constructor( sendIntent( OauthIntent.SaveJwtToken( accessToken = it.accessToken, - refreshToken = it.refreshToken + refreshToken = it.refreshToken, + isNewUser = it.isNewUser ) ) }.onFailure { diff --git a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt index 896561aa..d6d7f46b 100644 --- a/feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt +++ b/feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt @@ -17,12 +17,14 @@ fun NavController.navigateOauth( fun NavGraphBuilder.oauthNavGraph( paddingValues: PaddingValues, - navigateToOnBoarding: () -> Unit + navigateToOnBoarding: () -> Unit, + navigateToPlace: () -> Unit ) { composable { OauthRoute( paddingValues = paddingValues, - navigateToOnBoarding = navigateToOnBoarding + navigateToOnBoarding = navigateToOnBoarding, + navigateToPlace = navigateToPlace ) } } From 1861723a6a364c0338f5cb7e2a1d7f843b5747e9 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:06:05 +0900 Subject: [PATCH 4/7] refactor#74 social login api --- .../solply/oauth/dto/request/SocialLoginRequestDto.kt | 10 ++++++++++ .../solply/onboarding/dto}/SignUpRequestDto.kt | 2 +- .../solply/onboarding/OnBoardingViewModel.kt | 5 ++++- .../oauth/datasource/OauthRemoteDataSourceImpl.kt | 5 +++-- .../teamsolply/solply/oauth/service/OauthService.kt | 7 ++++--- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt rename {remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request => data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto}/SignUpRequestDto.kt (80%) diff --git a/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt new file mode 100644 index 00000000..3338f49e --- /dev/null +++ b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt @@ -0,0 +1,10 @@ +package com.teamsolply.solply.oauth.dto.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SocialLoginRequestDto( + @SerialName("oauthAccessToken") + val oauthAccessToken: String, +) diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/SignUpRequestDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt similarity index 80% rename from remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/SignUpRequestDto.kt rename to data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt index fb064e68..33a25ffb 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/SignUpRequestDto.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt @@ -1,4 +1,4 @@ -package com.teamsolply.solply.onboarding.dto.request +package com.teamsolply.solply.onboarding.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt index 99dd489f..a28f2b48 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt @@ -1,11 +1,14 @@ package com.teamsolply.solply.onboarding +import com.teamsolply.solply.onboarding.repository.OnBoardingRepository import com.teamsolply.solply.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class OnBoardingViewModel @Inject constructor() : +class OnBoardingViewModel @Inject constructor( + private val onBoardingRepository: OnBoardingRepository +) : BaseViewModel( OnBoardingState() ) { diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt index d8821b65..80ec8f5d 100644 --- a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt @@ -1,5 +1,6 @@ package com.teamsolply.solply.oauth.datasource +import com.teamsolply.solply.oauth.dto.request.SocialLoginRequestDto import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto import com.teamsolply.solply.oauth.service.OauthService import com.teamsolply.solply.oauth.source.OauthRemoteDataSource @@ -12,7 +13,7 @@ class OauthRemoteDataSourceImpl @Inject constructor( provider: String, oauthAccessToken: String ): SocialLoginResponseDto = oauthService.postSocialLogin( - provider = provider, - oauthAccessToken = oauthAccessToken + soicialPlatform = provider, + oauthAccessToken = SocialLoginRequestDto(oauthAccessToken = oauthAccessToken) ).data } diff --git a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt index 8cb01637..96df1604 100644 --- a/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt +++ b/remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt @@ -1,15 +1,16 @@ package com.teamsolply.solply.oauth.service import com.teamsolply.solply.network.model.BaseResponse +import com.teamsolply.solply.oauth.dto.request.SocialLoginRequestDto import com.teamsolply.solply.oauth.dto.response.SocialLoginResponseDto import retrofit2.http.Body import retrofit2.http.POST import retrofit2.http.Path interface OauthService { - @POST("api/auth/social/{provider}/login") + @POST("api/auth/social/{soicialPlatform}/login") suspend fun postSocialLogin( - @Path("provider") provider: String, - @Body oauthAccessToken: String + @Path("soicialPlatform") soicialPlatform: String, + @Body oauthAccessToken: SocialLoginRequestDto ): BaseResponse } From 14bfead174e766cef8ba43dac982f465ca10c145 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:07:43 +0900 Subject: [PATCH 5/7] feature#74 check nickname duplicate api --- .gitignore | 2 ++ app/build.gradle.kts | 19 ++++++++++++++++ .../component/textfield/SolplyTextField.kt | 7 +++--- .../solply/network/AccessTokenInterceptor.kt | 13 +++++------ .../network/service/TokenRefreshService.kt | 4 ++-- .../response/NicknameDuplicateResponseDto.kt | 10 +++++++++ .../repository/OnBoardingRepositoryImpl.kt | 6 ++++- .../source/OnBoardingRemoteDataSource.kt | 6 ++++- .../solply/onboarding/model/SignUpEntity.kt | 6 ----- .../repository/OnBoardingRepository.kt | 4 +++- .../teamsolply/solply/main/MainNavigator.kt | 2 +- feature/onboarding/build.gradle.kts | 1 + .../solply/onboarding/OnBoardingContract.kt | 5 +++-- .../solply/onboarding/OnBoardingScreen.kt | 18 ++++++++++++--- .../solply/onboarding/OnBoardingViewModel.kt | 11 +++++++++- .../solply/onboarding/screen/NamingScreen.kt | 22 ++++++++----------- .../OnBoardingRemoteDataSourceImpl.kt | 7 +++++- .../onboarding/service/OnBoardingService.kt | 12 ++++++---- 18 files changed, 108 insertions(+), 47 deletions(-) create mode 100644 data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt delete mode 100644 domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt diff --git a/.gitignore b/.gitignore index ed4126c7..ece18a9d 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,8 @@ render.experimental.xml # Keystore files *.jks *.keystore +app/release.keystore +app/debug.keystore # Google Services (e.g. APIs or Firebase) google-services.json diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 842961ec..a422900c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,6 +6,25 @@ plugins { android { namespace = "com.teamsolply.solply" + + signingConfigs { + getByName("debug") { + keyAlias = "androiddebugkey" + keyPassword = "android" + storeFile = File("${project.rootDir.absolutePath}/keystore/debug.keystore") + } + } + + buildTypes { + debug { + signingConfig = signingConfigs.getByName("debug") + } + release { + signingConfig = signingConfigs.getByName("debug") + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } } dependencies { diff --git a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt index 31849efb..4421d361 100644 --- a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt +++ b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt @@ -114,12 +114,12 @@ private fun BaseTextField( @Composable fun SolplyNicknameTextField( value: String, + isNicknameDuplicate: Boolean, onValueChange: (String) -> Unit, modifier: Modifier = Modifier, placeholder: String = "여기에 입력하세요.", maxLength: Int = 8, minLength: Int = 2, - onDuplicateCheck: (String) -> Boolean, checkNicknameValidate: (String) -> Boolean ) { var validationState by remember { mutableStateOf(NickNameValidateState.Empty) } @@ -130,7 +130,7 @@ fun SolplyNicknameTextField( NickNameValidateState.MaxLength, NickNameValidateState.Typing ) || - (validationState == NickNameValidateState.Empty && value.isNotEmpty()) + (validationState == NickNameValidateState.Empty && value.isNotEmpty()) LaunchedEffect(value) { if (value.isNotEmpty()) { @@ -153,9 +153,8 @@ fun SolplyNicknameTextField( validationState = NickNameValidateState.Invalid isTyping = false } else { - val duplicate = onDuplicateCheck(value) validationState = - if (duplicate) NickNameValidateState.Duplicate else NickNameValidateState.Valid + if (isNicknameDuplicate) NickNameValidateState.Duplicate else NickNameValidateState.Valid isTyping = false } } else { diff --git a/core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt b/core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt index a1e36030..4e13ec52 100644 --- a/core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt +++ b/core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt @@ -32,13 +32,12 @@ class AccessTokenInterceptor @Inject constructor( originalRequest } - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Request URL: ${newRequest.url}") - Log.d( - TAG, - "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}" - ) - } + Log.d(TAG, "Request URL: ${newRequest.url}") + Log.d( + TAG, + "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}" + ) + return chain.proceed(newRequest) } diff --git a/core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt b/core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt index 9d25004e..af3b4c45 100644 --- a/core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt +++ b/core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt @@ -5,8 +5,8 @@ import retrofit2.http.Header import retrofit2.http.POST interface TokenRefreshService { - @POST("") + @POST("api/auth/refresh") suspend fun postRefreshJwtToken( - @Header("Authorization") refreshToken: String + @Header("Refresh-Token") refreshToken: String ): ResponsePostAuthRefreshDto } diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt new file mode 100644 index 00000000..25bf8926 --- /dev/null +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt @@ -0,0 +1,10 @@ +package com.teamsolply.solply.onboarding.dto.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class NicknameDuplicateResponseDto( + @SerialName("isDuplicated") + val isDuplicated: Boolean +) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt index 40cb671b..ff264ddf 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt @@ -5,4 +5,8 @@ import javax.inject.Inject class OnBoardingRepositoryImpl @Inject constructor( private val onBoardingRemoteDataSource: OnBoardingRemoteDataSource -) : OnBoardingRepository +) : OnBoardingRepository { + override suspend fun checkNicknameDuplicate(nickname: String): Result = runCatching { + onBoardingRemoteDataSource.checkNicknameDuplicate(nickname = nickname).isDuplicated + } +} diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt index ff4b6489..d1152a3c 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt @@ -1,3 +1,7 @@ package com.teamsolply.solply.onboarding.source -interface OnBoardingRemoteDataSource +import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto + +interface OnBoardingRemoteDataSource { + suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto +} diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt deleted file mode 100644 index 9f20b8ca..00000000 --- a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.teamsolply.solply.onboarding.model - -data class SignUpEntity( - val nickname: String, - val userId: Int -) diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt index 04e90ab3..c5c1cc6d 100644 --- a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt +++ b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt @@ -1,3 +1,5 @@ package com.teamsolply.solply.onboarding.repository -interface OnBoardingRepository +interface OnBoardingRepository { + suspend fun checkNicknameDuplicate(nickname: String): Result +} diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index 778dc704..75409736 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -27,7 +27,7 @@ internal class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = OnBoarding + val startDestination = Splash val currentTab: MainNavTab? @Composable get() = MainNavTab.find { tab -> diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts index 2c320c31..fd348125 100644 --- a/feature/onboarding/build.gradle.kts +++ b/feature/onboarding/build.gradle.kts @@ -7,5 +7,6 @@ android { } dependencies { + implementation(projects.domain.onboarding) implementation("androidx.compose.foundation:foundation:1.6.1") } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt index 5d31ca2b..2219a8a0 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt @@ -20,7 +20,8 @@ data class OnBoardingState( ), val selectedPersona: Persona? = null, - val userNickname: String? = null, + val userNickname: String = "", + val isNicknameDuplicate: Boolean = false, val showStartingScreen: Boolean = false ) : UiState @@ -31,7 +32,7 @@ sealed interface OnBoardingIntent : UiIntent { data class OnTownSelected(val townId: Long) : OnBoardingIntent data class OnPersonaChanged(val newPage: Int) : OnBoardingIntent data class OnPersonaSelected(val persona: Persona) : OnBoardingIntent - data class Nickname(val nickname: String) : OnBoardingIntent + data class ChangeInputNickname(val nickname: String) : OnBoardingIntent data object ShowStartingScreen : OnBoardingIntent } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt index f5e010db..00ac2545 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt @@ -1,5 +1,6 @@ package com.teamsolply.solply.onboarding +import android.util.Log import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column @@ -39,10 +40,14 @@ fun OnBoardingRoute( ) { val state by viewModel.uiState.collectAsStateWithLifecycle() + Log.d("asdasdasd", "${state.selectedTownId} ${state.selectedPersona} ${state.userNickname}") + LaunchedEffectWithLifecycle { viewModel.sideEffect.collectLatest { sideEffect -> when (sideEffect) { - is OnBoardingSideEffect.NavigateToPlace -> { navigateToPlace() } + is OnBoardingSideEffect.NavigateToPlace -> { + navigateToPlace() + } } } } @@ -62,7 +67,10 @@ fun OnBoardingRoute( }, onPageChanged = { viewModel.sendIntent(OnBoardingIntent.OnPageChanged(it)) }, onBoardingIntent = { viewModel.sendIntent(it) }, - navController = navController + navController = navController, + changeInputNickname = { inputNickname -> + viewModel.sendIntent(OnBoardingIntent.ChangeInputNickname(inputNickname)) + } ) } } @@ -74,7 +82,8 @@ fun OnBoardingScreen( onPageChanged: (Int) -> Unit, onBoardingIntent: (OnBoardingIntent) -> Unit, modifier: Modifier = Modifier, - navController: NavController + navController: NavController, + changeInputNickname: (String) -> Unit, ) { val pagerState = rememberPagerState( initialPage = state.currentPage, @@ -164,6 +173,9 @@ fun OnBoardingScreen( 2 -> NamingScreen( state = state, + inputNickname = state.userNickname, + isNicknameDuplicate = state.isNicknameDuplicate, + changeInputNickname = changeInputNickname, onNextClick = { scope.launch { pagerState.scrollToPage(pagerState.currentPage + 1) diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt index a28f2b48..fb0ef128 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt @@ -1,8 +1,10 @@ package com.teamsolply.solply.onboarding +import androidx.lifecycle.viewModelScope import com.teamsolply.solply.onboarding.repository.OnBoardingRepository import com.teamsolply.solply.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -39,7 +41,14 @@ class OnBoardingViewModel @Inject constructor( is OnBoardingIntent.ShowStartingScreen -> { reduce { copy(showStartingScreen = true) } } - is OnBoardingIntent.Nickname -> { + + is OnBoardingIntent.ChangeInputNickname -> { + viewModelScope.launch { + onBoardingRepository.checkNicknameDuplicate(nickname = intent.nickname) + .onSuccess { + reduce { copy(isNicknameDuplicate = it) } + } + } reduce { copy(userNickname = intent.nickname) } } } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt index 60f046a6..77532658 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt @@ -23,12 +23,12 @@ import com.teamsolply.solply.ui.extension.addFocusCleaner @Composable fun NamingScreen( state: OnBoardingState, + inputNickname: String, + isNicknameDuplicate: Boolean, + changeInputNickname: (String) -> Unit, onNextClick: () -> Unit, onBoardingIntent: (OnBoardingIntent) -> Unit ) { - var nickname by remember { mutableStateOf("") } - - val isButtonEnabled = nickname.isNotBlank() val focusManager = LocalFocusManager.current Column( @@ -49,12 +49,9 @@ fun NamingScreen( ) SolplyNicknameTextField( - value = nickname, - onValueChange = { nickname = it }, - onDuplicateCheck = { input -> - println("중복 체크 요청: $input") - input.lowercase() == "solply" - }, + value = inputNickname, + isNicknameDuplicate = state.isNicknameDuplicate, + onValueChange = { changeInputNickname(it) }, checkNicknameValidate = { input -> input.all { it.isLetterOrDigit() } } @@ -66,14 +63,13 @@ fun NamingScreen( modifier = Modifier .padding(bottom = 24.dp), onClick = { - if (isButtonEnabled) { - onBoardingIntent(OnBoardingIntent.Nickname(nickname)) + if (state.userNickname.isNotBlank()) { onBoardingIntent(OnBoardingIntent.ShowStartingScreen) } }, - selected = isButtonEnabled, + selected = state.userNickname.isNotBlank(), textStyle = SolplyTheme.typography.button16M, - textColor = if (isButtonEnabled) SolplyTheme.colors.white else SolplyTheme.colors.gray800, + textColor = if (state.userNickname.isNotBlank()) SolplyTheme.colors.white else SolplyTheme.colors.gray800, enabledBackgroundColor = SolplyTheme.colors.gray900, disabledBackgroundColor = SolplyTheme.colors.gray300 ) diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt index 3c7d03a8..875b3948 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt @@ -1,9 +1,14 @@ package com.teamsolply.solply.onboarding.datasource +import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto import com.teamsolply.solply.onboarding.service.OnBoardingService import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource import javax.inject.Inject class OnBoardingRemoteDataSourceImpl @Inject constructor( private val onBoardingService: OnBoardingService -) : OnBoardingRemoteDataSource +) : OnBoardingRemoteDataSource { + override suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto = + onBoardingService.checkNicknameDuplicate(nickname = nickname).data + +} diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt index e4499004..d2f4346c 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt @@ -1,10 +1,14 @@ package com.teamsolply.solply.onboarding.service -import com.teamsolply.solply.onboarding.dto.request.SignUpRequestDto +import com.teamsolply.solply.network.model.BaseResponse +import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto +import retrofit2.http.GET +import retrofit2.http.Query interface OnBoardingService { - suspend fun signUp( - signUpRequestDto: SignUpRequestDto - ) + @GET("api/users/check-nickname") + suspend fun checkNicknameDuplicate( + @Query("nickname") nickname: String + ): BaseResponse } From b4d3db1cbf6522210a2f7ed15fb19929ec5976e8 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:34:51 +0900 Subject: [PATCH 6/7] feature#74 patch user info api --- .../solply/onboarding/dto/SignUpRequestDto.kt | 12 ---------- .../dto/request/PatchUserInfoRequestDto.kt | 14 +++++++++++ .../dto/response/PatchUserInfoResponseDto.kt | 16 +++++++++++++ .../repository/OnBoardingRepositoryImpl.kt | 24 +++++++++++++++++++ .../source/OnBoardingRemoteDataSource.kt | 3 +++ .../solply/onboarding/model/UserInfoEntity.kt | 8 +++++++ .../repository/OnBoardingRepository.kt | 7 ++++++ .../solply/onboarding/OnBoardingViewModel.kt | 7 ++++++ .../OnBoardingRemoteDataSourceImpl.kt | 5 ++++ .../onboarding/service/OnBoardingService.kt | 9 +++++++ 10 files changed, 93 insertions(+), 12 deletions(-) delete mode 100644 data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt create mode 100644 data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt create mode 100644 data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt create mode 100644 domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt deleted file mode 100644 index 33a25ffb..00000000 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/SignUpRequestDto.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.teamsolply.solply.onboarding.dto - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class SignUpRequestDto( - @SerialName("nickname") - val nickname: String, - @SerialName("id") - val id: Int -) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt new file mode 100644 index 00000000..8f6e6862 --- /dev/null +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt @@ -0,0 +1,14 @@ +package com.teamsolply.solply.onboarding.dto.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PatchUserInfoRequestDto( + @SerialName("favoriteTown") + val favoriteTown: Long, + @SerialName("persona") + val persona: String, + @SerialName("nickname") + val nickname: String +) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt new file mode 100644 index 00000000..4a120b9b --- /dev/null +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt @@ -0,0 +1,16 @@ +package com.teamsolply.solply.onboarding.dto.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PatchUserInfoResponseDto( + @SerialName("favoriteTownId") + val favoriteTownId: Long, + @SerialName("favoriteTownName") + val favoriteTownName: String, + @SerialName("persona") + val persona: String, + @SerialName("nickname") + val nickname: String, +) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt index ff264ddf..582e01a2 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt @@ -1,5 +1,7 @@ package com.teamsolply.solply.onboarding.repository +import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto +import com.teamsolply.solply.onboarding.model.UserInfoEntity import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource import javax.inject.Inject @@ -9,4 +11,26 @@ class OnBoardingRepositoryImpl @Inject constructor( override suspend fun checkNicknameDuplicate(nickname: String): Result = runCatching { onBoardingRemoteDataSource.checkNicknameDuplicate(nickname = nickname).isDuplicated } + + override suspend fun patchUserInfo( + favoriteTown: Long, + persona: String, + nickname: String + ): Result = runCatching { + onBoardingRemoteDataSource.patchUserInfo( + PatchUserInfoRequestDto( + favoriteTown = favoriteTown, + persona = persona, + nickname = nickname + ) + ) + }.mapCatching { + UserInfoEntity( + favoriteTownId = it.favoriteTownId, + favoriteTownName = it.favoriteTownName, + persona = it.persona, + nickname = it.nickname + ) + + } } diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt index d1152a3c..7cc21535 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt @@ -1,7 +1,10 @@ package com.teamsolply.solply.onboarding.source +import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto +import com.teamsolply.solply.onboarding.dto.response.PatchUserInfoResponseDto interface OnBoardingRemoteDataSource { suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto + suspend fun patchUserInfo(patchUserInfoRequestDto: PatchUserInfoRequestDto): PatchUserInfoResponseDto } diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt new file mode 100644 index 00000000..e3ee1b93 --- /dev/null +++ b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt @@ -0,0 +1,8 @@ +package com.teamsolply.solply.onboarding.model + +data class UserInfoEntity( + val favoriteTownId: Long?, + val favoriteTownName: String, + val persona: String, + val nickname: String +) \ No newline at end of file diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt index c5c1cc6d..14eee464 100644 --- a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt +++ b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt @@ -1,5 +1,12 @@ package com.teamsolply.solply.onboarding.repository +import com.teamsolply.solply.onboarding.model.UserInfoEntity + interface OnBoardingRepository { suspend fun checkNicknameDuplicate(nickname: String): Result + suspend fun patchUserInfo( + favoriteTown: Long, + persona: String, + nickname: String + ): Result } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt index fb0ef128..96bbbd42 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt @@ -53,4 +53,11 @@ class OnBoardingViewModel @Inject constructor( } } } + + private fun patchUserInfo() { + viewModelScope.launch { + //TODO. 여기서 회원가입 api 쏘기 + //onBoardingRepository + } + } } diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt index 875b3948..16d29824 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt @@ -1,6 +1,8 @@ package com.teamsolply.solply.onboarding.datasource +import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto +import com.teamsolply.solply.onboarding.dto.response.PatchUserInfoResponseDto import com.teamsolply.solply.onboarding.service.OnBoardingService import com.teamsolply.solply.onboarding.source.OnBoardingRemoteDataSource import javax.inject.Inject @@ -11,4 +13,7 @@ class OnBoardingRemoteDataSourceImpl @Inject constructor( override suspend fun checkNicknameDuplicate(nickname: String): NicknameDuplicateResponseDto = onBoardingService.checkNicknameDuplicate(nickname = nickname).data + override suspend fun patchUserInfo(patchUserInfoRequestDto: PatchUserInfoRequestDto): PatchUserInfoResponseDto = + onBoardingService.patchUserInfo(patchUserInfoRequestDto = patchUserInfoRequestDto).data + } diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt index d2f4346c..59b4697f 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt @@ -1,8 +1,12 @@ package com.teamsolply.solply.onboarding.service import com.teamsolply.solply.network.model.BaseResponse +import com.teamsolply.solply.onboarding.dto.request.PatchUserInfoRequestDto import com.teamsolply.solply.onboarding.dto.response.NicknameDuplicateResponseDto +import com.teamsolply.solply.onboarding.dto.response.PatchUserInfoResponseDto +import retrofit2.http.Body import retrofit2.http.GET +import retrofit2.http.PATCH import retrofit2.http.Query interface OnBoardingService { @@ -11,4 +15,9 @@ interface OnBoardingService { suspend fun checkNicknameDuplicate( @Query("nickname") nickname: String ): BaseResponse + + @PATCH("api/users") + suspend fun patchUserInfo( + @Body patchUserInfoRequestDto: PatchUserInfoRequestDto + ): BaseResponse } From 20f1fd580e2f089eb73923e61ab81f9b547eebf2 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:35:48 +0900 Subject: [PATCH 7/7] chore#74 ktlint format --- .../designsystem/component/textfield/SolplyTextField.kt | 2 +- .../solply/oauth/dto/request/SocialLoginRequestDto.kt | 2 +- .../onboarding/dto/response/PatchUserInfoResponseDto.kt | 2 +- .../solply/onboarding/repository/OnBoardingRepositoryImpl.kt | 1 - .../com/teamsolply/solply/onboarding/model/UserInfoEntity.kt | 2 +- .../src/main/java/com/teamsolply/solply/main/MainNavigator.kt | 1 - .../java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt | 2 +- .../com/teamsolply/solply/onboarding/OnBoardingViewModel.kt | 4 ++-- .../com/teamsolply/solply/onboarding/screen/NamingScreen.kt | 2 -- .../onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt | 1 - 10 files changed, 7 insertions(+), 12 deletions(-) diff --git a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt index 4421d361..60a2442a 100644 --- a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt +++ b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt @@ -130,7 +130,7 @@ fun SolplyNicknameTextField( NickNameValidateState.MaxLength, NickNameValidateState.Typing ) || - (validationState == NickNameValidateState.Empty && value.isNotEmpty()) + (validationState == NickNameValidateState.Empty && value.isNotEmpty()) LaunchedEffect(value) { if (value.isNotEmpty()) { diff --git a/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt index 3338f49e..109cf2e4 100644 --- a/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt +++ b/data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt @@ -6,5 +6,5 @@ import kotlinx.serialization.Serializable @Serializable data class SocialLoginRequestDto( @SerialName("oauthAccessToken") - val oauthAccessToken: String, + val oauthAccessToken: String ) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt index 4a120b9b..1d57735f 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt @@ -12,5 +12,5 @@ data class PatchUserInfoResponseDto( @SerialName("persona") val persona: String, @SerialName("nickname") - val nickname: String, + val nickname: String ) diff --git a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt index 582e01a2..32ad429f 100644 --- a/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt +++ b/data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt @@ -31,6 +31,5 @@ class OnBoardingRepositoryImpl @Inject constructor( persona = it.persona, nickname = it.nickname ) - } } diff --git a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt index e3ee1b93..227760d5 100644 --- a/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt +++ b/domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt @@ -5,4 +5,4 @@ data class UserInfoEntity( val favoriteTownName: String, val persona: String, val nickname: String -) \ No newline at end of file +) diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index 75409736..a5542d50 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -16,7 +16,6 @@ import com.teamsolply.solply.mypage.collection.course.navigateCourseCollection import com.teamsolply.solply.mypage.collection.place.navigatePlaceCollection import com.teamsolply.solply.mypage.navigation.navigateMypage import com.teamsolply.solply.oauth.navigation.navigateOauth -import com.teamsolply.solply.onboarding.navigation.OnBoarding import com.teamsolply.solply.onboarding.navigation.navigateOnBoarding import com.teamsolply.solply.place.navigation.navigatePlace diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt index 00ac2545..8ea89310 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt @@ -83,7 +83,7 @@ fun OnBoardingScreen( onBoardingIntent: (OnBoardingIntent) -> Unit, modifier: Modifier = Modifier, navController: NavController, - changeInputNickname: (String) -> Unit, + changeInputNickname: (String) -> Unit ) { val pagerState = rememberPagerState( initialPage = state.currentPage, diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt index 96bbbd42..29a80018 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt @@ -56,8 +56,8 @@ class OnBoardingViewModel @Inject constructor( private fun patchUserInfo() { viewModelScope.launch { - //TODO. 여기서 회원가입 api 쏘기 - //onBoardingRepository + // TODO. 여기서 회원가입 api 쏘기 + // onBoardingRepository } } } diff --git a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt index 77532658..39c20609 100644 --- a/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt +++ b/feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt @@ -7,8 +7,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager diff --git a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt index 16d29824..a1af72fc 100644 --- a/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt +++ b/remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt @@ -15,5 +15,4 @@ class OnBoardingRemoteDataSourceImpl @Inject constructor( override suspend fun patchUserInfo(patchUserInfoRequestDto: PatchUserInfoRequestDto): PatchUserInfoResponseDto = onBoardingService.patchUserInfo(patchUserInfoRequestDto = patchUserInfoRequestDto).data - }