diff --git a/app/src/main/java/org/sopt/and/data/datasource/remote/AuthRemoteDataSource.kt b/app/src/main/java/org/sopt/and/data/datasource/remote/AuthRemoteDataSource.kt index 357a4a8..962ff63 100644 --- a/app/src/main/java/org/sopt/and/data/datasource/remote/AuthRemoteDataSource.kt +++ b/app/src/main/java/org/sopt/and/data/datasource/remote/AuthRemoteDataSource.kt @@ -5,9 +5,10 @@ import org.sopt.and.data.model.request.RequestUserRegisterDto import org.sopt.and.data.model.response.ResponseLoginTokenDto import org.sopt.and.data.model.response.ResponseRegisterNumberDto import org.sopt.and.presentation.util.BaseResponse +import org.sopt.and.presentation.util.NullableBaseRespone interface AuthRemoteDataSource { suspend fun register(requestUserRegisterDto: RequestUserRegisterDto): BaseResponse - suspend fun login(requestUserLoginDto: RequestUserLoginDto): BaseResponse + suspend fun login(requestUserLoginDto: RequestUserLoginDto): NullableBaseRespone } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/data/datasourceImpl/remote/AuthRemoteDataSourceImpl.kt b/app/src/main/java/org/sopt/and/data/datasourceImpl/remote/AuthRemoteDataSourceImpl.kt index bbb00d6..2b5e768 100644 --- a/app/src/main/java/org/sopt/and/data/datasourceImpl/remote/AuthRemoteDataSourceImpl.kt +++ b/app/src/main/java/org/sopt/and/data/datasourceImpl/remote/AuthRemoteDataSourceImpl.kt @@ -7,6 +7,7 @@ import org.sopt.and.data.model.response.ResponseLoginTokenDto import org.sopt.and.data.model.response.ResponseRegisterNumberDto import org.sopt.and.data.service.AuthService import org.sopt.and.presentation.util.BaseResponse +import org.sopt.and.presentation.util.NullableBaseRespone import javax.inject.Inject class AuthRemoteDataSourceImpl @Inject constructor( @@ -15,6 +16,6 @@ class AuthRemoteDataSourceImpl @Inject constructor( override suspend fun register(requestUserRegisterDto: RequestUserRegisterDto): BaseResponse = authService.postRegister(requestUserRegisterDto) - override suspend fun login(requestUserLoginDto: RequestUserLoginDto): BaseResponse = + override suspend fun login(requestUserLoginDto: RequestUserLoginDto): NullableBaseRespone = authService.postLogin(requestUserLoginDto) } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/data/repositoryImpl/AuthRepositoryImpl.kt b/app/src/main/java/org/sopt/and/data/repositoryImpl/AuthRepositoryImpl.kt index 66c37ac..a441300 100644 --- a/app/src/main/java/org/sopt/and/data/repositoryImpl/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/sopt/and/data/repositoryImpl/AuthRepositoryImpl.kt @@ -1,7 +1,9 @@ package org.sopt.and.data.repositoryImpl import org.sopt.and.data.datasource.remote.AuthRemoteDataSource +import org.sopt.and.domain.model.UserEntity import org.sopt.and.domain.model.UserIdEntity +import org.sopt.and.domain.model.UserLoginEntity import org.sopt.and.domain.model.UserRegisterEntity import org.sopt.and.domain.repository.AuthRepository import javax.inject.Inject @@ -13,4 +15,9 @@ class AuthRepositoryImpl @Inject constructor( runCatching { authRemoteDataSource.register(requestUserRegisterDto = userRegisterEntity.toRequestUserRegisterDto()).result.toUserIdEntity() } + + override suspend fun postLogin(userLoginEntity: UserLoginEntity): Result = + runCatching { + authRemoteDataSource.login(requestUserLoginDto = userLoginEntity.toRequestUserLoginDto()).result.toUserEntity() + } } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/data/service/AuthService.kt b/app/src/main/java/org/sopt/and/data/service/AuthService.kt index d571cae..9495a1c 100644 --- a/app/src/main/java/org/sopt/and/data/service/AuthService.kt +++ b/app/src/main/java/org/sopt/and/data/service/AuthService.kt @@ -5,6 +5,7 @@ import org.sopt.and.data.model.request.RequestUserRegisterDto import org.sopt.and.data.model.response.ResponseLoginTokenDto import org.sopt.and.data.model.response.ResponseRegisterNumberDto import org.sopt.and.presentation.util.BaseResponse +import org.sopt.and.presentation.util.NullableBaseRespone import retrofit2.http.Body import retrofit2.http.POST @@ -17,7 +18,7 @@ interface AuthService { @POST("/$LOGIN") suspend fun postLogin( @Body body: RequestUserLoginDto - ): BaseResponse + ): NullableBaseRespone companion object { const val USER = "user" diff --git a/app/src/main/java/org/sopt/and/di/UseCaseModule.kt b/app/src/main/java/org/sopt/and/di/UseCaseModule.kt index 5ab8fd2..0570e8f 100644 --- a/app/src/main/java/org/sopt/and/di/UseCaseModule.kt +++ b/app/src/main/java/org/sopt/and/di/UseCaseModule.kt @@ -5,6 +5,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.sopt.and.domain.repository.AuthRepository +import org.sopt.and.domain.usecase.PostUserLoginUseCase import org.sopt.and.domain.usecase.PostUserRegisterUseCase import javax.inject.Singleton @@ -15,4 +16,9 @@ class UseCaseModule { @Singleton fun providesUserRegisterUseCase(authRepository: AuthRepository): PostUserRegisterUseCase = PostUserRegisterUseCase(authRepository = authRepository) + + @Provides + @Singleton + fun providesUserLoginUseCase(authRepository: AuthRepository): PostUserLoginUseCase = + PostUserLoginUseCase(authRepository = authRepository) } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/domain/repository/AuthRepository.kt b/app/src/main/java/org/sopt/and/domain/repository/AuthRepository.kt index a020801..e67ddd0 100644 --- a/app/src/main/java/org/sopt/and/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/sopt/and/domain/repository/AuthRepository.kt @@ -1,8 +1,11 @@ package org.sopt.and.domain.repository +import org.sopt.and.domain.model.UserEntity import org.sopt.and.domain.model.UserIdEntity +import org.sopt.and.domain.model.UserLoginEntity import org.sopt.and.domain.model.UserRegisterEntity interface AuthRepository { suspend fun postRegister(userRegisterEntity: UserRegisterEntity): Result + suspend fun postLogin(userLoginEntity: UserLoginEntity): Result } \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/domain/usecase/PostUserLoginUseCase.kt b/app/src/main/java/org/sopt/and/domain/usecase/PostUserLoginUseCase.kt new file mode 100644 index 0000000..08931e0 --- /dev/null +++ b/app/src/main/java/org/sopt/and/domain/usecase/PostUserLoginUseCase.kt @@ -0,0 +1,12 @@ +package org.sopt.and.domain.usecase + +import org.sopt.and.domain.model.UserEntity +import org.sopt.and.domain.model.UserLoginEntity +import org.sopt.and.domain.repository.AuthRepository + +class PostUserLoginUseCase( + private val authRepository: AuthRepository +) { + suspend operator fun invoke(userLoginEntity: UserLoginEntity): Result = + authRepository.postLogin(userLoginEntity = userLoginEntity) +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/and/presentation/ui/auth/login/LoginViewModel.kt b/app/src/main/java/org/sopt/and/presentation/ui/auth/login/LoginViewModel.kt index 49d4626..b67ae76 100644 --- a/app/src/main/java/org/sopt/and/presentation/ui/auth/login/LoginViewModel.kt +++ b/app/src/main/java/org/sopt/and/presentation/ui/auth/login/LoginViewModel.kt @@ -2,12 +2,16 @@ package org.sopt.and.presentation.ui.auth.login import dagger.hilt.android.lifecycle.HiltViewModel import org.sopt.and.data.datasource.local.WaveLocalDataSource +import org.sopt.and.domain.model.UserLoginEntity +import org.sopt.and.domain.usecase.PostUserLoginUseCase import org.sopt.and.presentation.util.BaseViewModel +import timber.log.Timber import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( - private val localDataSource: WaveLocalDataSource + private val waveLocalDataStorage: WaveLocalDataSource, + private val postUserLoginUseCase: PostUserLoginUseCase ) : BaseViewModel() { override fun createInitialState(): LoginContract.LoginState { @@ -20,8 +24,8 @@ class LoginViewModel @Inject constructor( override suspend fun handleEvent(event: LoginContract.LoginEvent) { when (event) { - is LoginContract.LoginEvent.EmailChanged -> { - setState(currentUiState.copy(email = event.email)) + is LoginContract.LoginEvent.UsernameChanged -> { + setState(currentUiState.copy(username = event.username)) } is LoginContract.LoginEvent.PasswordChanged -> { @@ -33,10 +37,18 @@ class LoginViewModel @Inject constructor( } is LoginContract.LoginEvent.OnLoginBtnClicked -> { - if (checkIsUserEmail() && checkIsUserPassword()) { + postUserLoginUseCase( + userLoginEntity = UserLoginEntity( + username = currentUiState.username, + userPassword = currentUiState.password + ) + ).onSuccess { user -> + Timber.d("[로그인] 성공 -> $user") setEffect(LoginContract.LoginEffect.ShowSuccessSnackBar(successMessage = event.successMessage)) + setAccessToken(user.accessToken) setState(currentUiState.copy(loginStatus = LoginContract.LoginStatus.Success)) - } else { + }.onFailure { + Timber.d("[로그인] 실패 -> $it") setEffect(LoginContract.LoginEffect.ShowFailSnackBar(failMessage = event.failMessage)) setState(currentUiState.copy(loginStatus = LoginContract.LoginStatus.Fail)) } @@ -44,8 +56,10 @@ class LoginViewModel @Inject constructor( } } - private fun checkIsUserEmail(): Boolean = (currentUiState.email == localDataSource.userEmail) - - private fun checkIsUserPassword(): Boolean = - (currentUiState.password == localDataSource.userPassword) + private fun setAccessToken(token: String) { + with(waveLocalDataStorage) { + accessToken = token + isLogin = true + } + } } \ No newline at end of file