From c3591ce518696bfd9e69af10d7871c0d56c932bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Tue, 4 Jun 2024 02:29:12 +0900 Subject: [PATCH 01/32] =?UTF-8?q?[mod]=20#18=20SignUpViewModel=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/now/ui/signup/SignUpViewModel.kt | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 8fc14ea..c6817c1 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -3,18 +3,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool import com.sopt.now.data.datasouce.request.RequestSignUpDto -import com.sopt.now.data.datasouce.response.BaseResponse import com.sopt.now.data.model.User -import com.sopt.now.util.StringNetworkError.FAIL_ERROR -import com.sopt.now.util.StringNetworkError.SERVER_ERROR -import com.sopt.now.util.StringNetworkError.SIGNUP import com.sopt.now.util.UiState import kotlinx.coroutines.launch import org.json.JSONObject -import retrofit2.Call -import retrofit2.Callback import retrofit2.HttpException -import retrofit2.Response class SignUpViewModel : ViewModel() { private val authService by lazy { ServicePool.authService } @@ -27,18 +20,21 @@ class SignUpViewModel : ViewModel() { viewModelScope.launch { runCatching { authService.signUp(request) - }.onSuccess { - _signUpState.value = - UiState.Success(request.toUserWithUserId(it.headers()["userid"].toString())) + }.onSuccess { response -> + if (response.isSuccessful) + _signUpState.value = + UiState.Success(request.toUserWithUserId(response.headers()["userid"].toString())) + else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString("message") + _signUpState.value = UiState.Error(errorMessage.toString()) + } }.onFailure { e -> if (e is HttpException) { - val errorMessage = - JSONObject(e.response()?.errorBody()?.string()).getString("message") - _signUpState.value = UiState.Error(errorMessage) + _signUpState.value = UiState.Error(e.message()) } else { - _signUpState.value = UiState.Error("코드 똑바로 짜라.. ") + _signUpState.value = UiState.Error(e.message.toString()) } - } } } From 7e3a2b49d50dac5223065f641d05d6eb97b0c72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Tue, 4 Jun 2024 03:51:33 +0900 Subject: [PATCH 02/32] =?UTF-8?q?[mod]=20#18=20api=20login=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/data/api/AuthService.kt | 4 +- .../com/sopt/now/ui/login/LoginViewModel.kt | 53 ++++++++----------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/api/AuthService.kt b/app/src/main/java/com/sopt/now/data/api/AuthService.kt index 87b9dbe..1728aa9 100644 --- a/app/src/main/java/com/sopt/now/data/api/AuthService.kt +++ b/app/src/main/java/com/sopt/now/data/api/AuthService.kt @@ -18,7 +18,7 @@ interface AuthService { @POST("member/login") - fun login( + suspend fun login( @Body request: RequestLoginDto, - ): Call> + ): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index acb5e3c..158746c 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -2,18 +2,16 @@ package com.sopt.now.ui.login import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool import com.sopt.now.data.datasouce.request.RequestLoginDto -import com.sopt.now.data.datasouce.response.BaseResponse import com.sopt.now.data.model.User import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN -import com.sopt.now.util.StringNetworkError.SERVER_ERROR import com.sopt.now.util.UiState +import kotlinx.coroutines.launch import org.json.JSONObject -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import retrofit2.HttpException class LoginViewModel : ViewModel() { private val loginService by lazy { ServicePool.authService } @@ -22,37 +20,32 @@ class LoginViewModel : ViewModel() { fun login(request: RequestLoginDto) { _loginState.value = UiState.Loading - - loginService.login(request).enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - _loginState.value = UiState.Success( - User( + viewModelScope.launch { + runCatching { + loginService.login(request) + }.onSuccess { response -> + val userId = response.headers()["Location"].toString() + if (response.isSuccessful) + _loginState.value = + UiState.Success( User( request.authenticationId, request.password, "", "", - userId = response.headers()["location"].toString() - ) - ) + userId = userId + )) + else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString("message") + _loginState.value = UiState.Error(errorMessage.toString()) + } + }.onFailure { e -> + if (e is HttpException) { + _loginState.value = UiState.Error(e.message()) } else { - val error = response.errorBody()?.string() - try { - val errorJson = JSONObject(error) - val errorMessage = errorJson.getString("message") - _loginState.value = UiState.Error(errorMessage) - } catch (e: Exception) { - _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) - } + _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) } } - - override fun onFailure(call: Call>, t: Throwable) { - _loginState.value = UiState.Error(SERVER_ERROR) - } - }) + } } } From e9bb79d7566dc97901fcabe4e4a54d970cbb7ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Tue, 4 Jun 2024 20:25:05 +0900 Subject: [PATCH 03/32] =?UTF-8?q?[mod]=20#18=20api=20getUsrInfo=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/data/api/InfoService.kt | 6 +-- .../com/sopt/now/ui/main/MainViewModel.kt | 39 ++++++++----------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/api/InfoService.kt b/app/src/main/java/com/sopt/now/data/api/InfoService.kt index 98bb2a8..c9f8c6f 100644 --- a/app/src/main/java/com/sopt/now/data/api/InfoService.kt +++ b/app/src/main/java/com/sopt/now/data/api/InfoService.kt @@ -1,13 +1,13 @@ package com.sopt.now.data.api import com.sopt.now.data.datasouce.response.ResponseInfoDto -import retrofit2.Call +import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Header interface InfoService { @GET("/member/info") - fun getUserInfo( + suspend fun getUserInfo( @Header("memberid") userId: String, - ): Call + ): Response } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt index 74051dc..14ef218 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt @@ -2,18 +2,16 @@ package com.sopt.now.ui.main import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool.infoService -import com.sopt.now.data.datasouce.response.ResponseInfoDto import com.sopt.now.data.model.Profile import com.sopt.now.data.model.User import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN -import com.sopt.now.util.StringNetworkError.SERVER_ERROR import com.sopt.now.util.UiState +import kotlinx.coroutines.launch import org.json.JSONObject -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import retrofit2.HttpException class MainViewModel : ViewModel() { private val _userData = MutableLiveData>() @@ -35,30 +33,27 @@ class MainViewModel : ViewModel() { fun getInfo(userid: String) { _myInfo.value = UiState.Loading - infoService.getUserInfo(userid).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response, - ) { + viewModelScope.launch { + runCatching { + infoService.getUserInfo(userid) + }.onSuccess { response -> if (response.isSuccessful) { val user = response.body()?.data _myInfo.value = UiState.Success(user?.toUser() ?: User("", "", "", "")) } else { - val error = response.errorBody()?.string() - try { - val errorJson = JSONObject(error) - val errorMessage = errorJson.getString("message") - _myInfo.value = UiState.Error(errorMessage) - } catch (e: Exception) { - _myInfo.value = UiState.Error(FAIL_ERROR.format(LOGIN)) - } + val errorMessage = + JSONObject(response.errorBody()?.string()).getString("message") + _myInfo.value = UiState.Error(errorMessage.toString()) } - } - override fun onFailure(call: Call, t: Throwable) { - _myInfo.value = UiState.Error(SERVER_ERROR) + }.onFailure { e -> + if (e is HttpException) { + _myInfo.value = UiState.Error(e.message()) + } else { + _myInfo.value = UiState.Error(FAIL_ERROR.format(LOGIN)) + } } - }) + } } fun setMyProfile(data: User) { From ae881b64760dfd7da136ad32ac4011ec1f5864dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Wed, 5 Jun 2024 00:06:26 +0900 Subject: [PATCH 04/32] =?UTF-8?q?[mod]=20#18=20datasource=20->=20dto=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sopt/now/data/api/AuthService.kt | 9 +++------ .../main/java/com/sopt/now/data/api/InfoService.kt | 2 +- .../now/data/datasouce/response/ResponseLoginDto.kt | 12 ------------ .../now/data/datasouce/response/ResponseSignUpDto.kt | 12 ------------ .../{datasouce => dto}/request/RequestLoginDto.kt | 2 +- .../{datasouce => dto}/request/RequestSignUpDto.kt | 2 +- .../data/{datasouce => dto}/response/BaseResponse.kt | 2 +- .../{datasouce => dto}/response/ResponseInfoDto.kt | 2 +- .../main/java/com/sopt/now/ui/login/LoginActivity.kt | 2 +- .../java/com/sopt/now/ui/login/LoginViewModel.kt | 2 +- .../java/com/sopt/now/ui/signup/SignUpActivity.kt | 2 +- .../java/com/sopt/now/ui/signup/SignUpViewModel.kt | 2 +- 12 files changed, 12 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/com/sopt/now/data/datasouce/response/ResponseLoginDto.kt delete mode 100644 app/src/main/java/com/sopt/now/data/datasouce/response/ResponseSignUpDto.kt rename app/src/main/java/com/sopt/now/data/{datasouce => dto}/request/RequestLoginDto.kt (85%) rename app/src/main/java/com/sopt/now/data/{datasouce => dto}/request/RequestSignUpDto.kt (92%) rename app/src/main/java/com/sopt/now/data/{datasouce => dto}/response/BaseResponse.kt (85%) rename app/src/main/java/com/sopt/now/data/{datasouce => dto}/response/ResponseInfoDto.kt (93%) diff --git a/app/src/main/java/com/sopt/now/data/api/AuthService.kt b/app/src/main/java/com/sopt/now/data/api/AuthService.kt index 1728aa9..8dc7ea6 100644 --- a/app/src/main/java/com/sopt/now/data/api/AuthService.kt +++ b/app/src/main/java/com/sopt/now/data/api/AuthService.kt @@ -1,11 +1,8 @@ package com.sopt.now.data.api -import com.sopt.now.data.datasouce.request.RequestLoginDto -import com.sopt.now.data.datasouce.request.RequestSignUpDto -import com.sopt.now.data.datasouce.response.BaseResponse -import com.sopt.now.data.datasouce.response.ResponseLoginDto -import com.sopt.now.data.datasouce.response.ResponseSignUpDto -import retrofit2.Call +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.dto.response.BaseResponse import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/sopt/now/data/api/InfoService.kt b/app/src/main/java/com/sopt/now/data/api/InfoService.kt index c9f8c6f..bc63bf2 100644 --- a/app/src/main/java/com/sopt/now/data/api/InfoService.kt +++ b/app/src/main/java/com/sopt/now/data/api/InfoService.kt @@ -1,6 +1,6 @@ package com.sopt.now.data.api -import com.sopt.now.data.datasouce.response.ResponseInfoDto +import com.sopt.now.data.dto.response.ResponseInfoDto import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Header diff --git a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseLoginDto.kt b/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseLoginDto.kt deleted file mode 100644 index 3eb105e..0000000 --- a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseLoginDto.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopt.now.data.datasouce.response - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ResponseLoginDto( - @SerialName("code") - val code: Int, - @SerialName("message") - val message: String, -) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseSignUpDto.kt deleted file mode 100644 index d3e15d8..0000000 --- a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseSignUpDto.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopt.now.data.datasouce.response - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ResponseSignUpDto( - @SerialName("code") - val code: Int, - @SerialName("message") - val message: String, -) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasouce/request/RequestLoginDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt similarity index 85% rename from app/src/main/java/com/sopt/now/data/datasouce/request/RequestLoginDto.kt rename to app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt index 2923c1d..6366a15 100644 --- a/app/src/main/java/com/sopt/now/data/datasouce/request/RequestLoginDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.data.datasouce.request +package com.sopt.now.data.dto.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/data/datasouce/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt similarity index 92% rename from app/src/main/java/com/sopt/now/data/datasouce/request/RequestSignUpDto.kt rename to app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt index 1e66bf9..44d2b51 100644 --- a/app/src/main/java/com/sopt/now/data/datasouce/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.data.datasouce.request +package com.sopt.now.data.dto.request import com.sopt.now.data.model.User import kotlinx.serialization.SerialName diff --git a/app/src/main/java/com/sopt/now/data/datasouce/response/BaseResponse.kt b/app/src/main/java/com/sopt/now/data/dto/response/BaseResponse.kt similarity index 85% rename from app/src/main/java/com/sopt/now/data/datasouce/response/BaseResponse.kt rename to app/src/main/java/com/sopt/now/data/dto/response/BaseResponse.kt index 4d12f8c..bf15681 100644 --- a/app/src/main/java/com/sopt/now/data/datasouce/response/BaseResponse.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/BaseResponse.kt @@ -1,4 +1,4 @@ -package com.sopt.now.data.datasouce.response +package com.sopt.now.data.dto.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt similarity index 93% rename from app/src/main/java/com/sopt/now/data/datasouce/response/ResponseInfoDto.kt rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt index bf9fd39..5ac7125 100644 --- a/app/src/main/java/com/sopt/now/data/datasouce/response/ResponseInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.data.datasouce.response +package com.sopt.now.data.dto.response import com.sopt.now.data.model.User import kotlinx.serialization.SerialName diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index 94ebe10..146e17f 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.data.model.User -import com.sopt.now.data.datasouce.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.databinding.ActivityLoginBinding import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index 158746c..23464e6 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool -import com.sopt.now.data.datasouce.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.model.User import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index c4bae2d..397323e 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -6,7 +6,7 @@ import android.os.Bundle import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.data.model.User -import com.sopt.now.data.datasouce.request.RequestSignUpDto +import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.databinding.ActivitySignUpBinding import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index c6817c1..5338b45 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -2,7 +2,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool -import com.sopt.now.data.datasouce.request.RequestSignUpDto +import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User import com.sopt.now.util.UiState import kotlinx.coroutines.launch From 23151c30c6525002af852f424caa6ca02613cbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Wed, 5 Jun 2024 05:19:00 +0900 Subject: [PATCH 05/32] =?UTF-8?q?[chore]=20#18=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../now/data/dto/response/ResponseInfoDto.kt | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt index 5ac7125..cf44890 100644 --- a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt @@ -12,16 +12,17 @@ data class ResponseInfoDto( val message: String, @SerialName("data") val data: UserData -) +){ + @Serializable + data class UserData( + @SerialName("authenticationId") + val authenticationId: String, + @SerialName("nickname") + val nickname: String, + @SerialName("phone") + val phone: String, + ) { + fun toUser() = User(id = authenticationId, password = "", nickname = nickname, phoneNumber = phone) + } +} -@Serializable -data class UserData( - @SerialName("authenticationId") - val authenticationId: String, - @SerialName("nickname") - val nickname: String, - @SerialName("phone") - val phone: String, -) { - fun toUser() = User(id = authenticationId, password = "", nickname = nickname, phoneNumber = phone) -} \ No newline at end of file From b41a1354c30c9052ea0cc01c0cbd65db33bb21f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Wed, 5 Jun 2024 05:19:19 +0900 Subject: [PATCH 06/32] =?UTF-8?q?[add]=20#18=20repository=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/now/data/AuthRepositoryImpl.kt | 19 +++++++++++++++++++ .../domain/entity/request/AuthRequestModel.kt | 14 ++++++++++++++ .../now/domain/repository/AuthRepository.kt | 10 ++++++++++ 3 files changed, 43 insertions(+) create mode 100644 app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt create mode 100644 app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt create mode 100644 app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt diff --git a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt new file mode 100644 index 0000000..a2304bd --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt @@ -0,0 +1,19 @@ +package com.sopt.now.data + +import com.sopt.now.data.api.AuthService +import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.repository.AuthRepository +import retrofit2.Response + +class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { + override suspend fun logIn(authData: AuthRequestModel): Result>> = + runCatching { + authService.login(authData.toRequestLogin()) + } + + override suspend fun signUp(authData: AuthRequestModel): Result>> = + runCatching { + authService.signUp(authData.toRequestSignup()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt new file mode 100644 index 0000000..c697a27 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt @@ -0,0 +1,14 @@ +package com.sopt.now.domain.entity.request + +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto + +data class AuthRequestModel( + val authenticationId: String, + val password: String, + val nickname: String, + val phone: String, +){ + fun toRequestSignup():RequestSignUpDto= RequestSignUpDto(authenticationId,password, nickname, phone) + fun toRequestLogin():RequestLoginDto = RequestLoginDto(authenticationId, password) +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt new file mode 100644 index 0000000..ee06166 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt @@ -0,0 +1,10 @@ +package com.sopt.now.domain.repository + +import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.domain.entity.request.AuthRequestModel +import retrofit2.Response + +interface AuthRepository { + suspend fun logIn(authData: AuthRequestModel): Result>> + suspend fun signUp(authData: AuthRequestModel): Result>> +} \ No newline at end of file From f1ad91447f77d44cc32a9f20dd068b5ee24f1c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Thu, 6 Jun 2024 04:58:40 +0900 Subject: [PATCH 07/32] =?UTF-8?q?[add]=20#18=20LoginViewModelFactory=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/ui/login/LoginViewModelFactory.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt new file mode 100644 index 0000000..f3ecd96 --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt @@ -0,0 +1,18 @@ +package com.sopt.now.ui.login + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.sopt.now.data.AuthRepositoryImpl +import com.sopt.now.data.api.ServicePool + +class LoginViewModelFactory : ViewModelProvider.Factory{ + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { + val repository = + AuthRepositoryImpl(ServicePool.authService) + return LoginViewModel(repository) as T + } else { + throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") + } + } +} \ No newline at end of file From 8339904c6978ede7463ae9eda2d13cf61d25ccbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Thu, 6 Jun 2024 04:59:42 +0900 Subject: [PATCH 08/32] =?UTF-8?q?[mod]=20#18=20Login=20=EB=A0=88=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=EB=A1=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/now/ui/login/LoginActivity.kt | 14 +++-- .../com/sopt/now/ui/login/LoginViewModel.kt | 58 +++++++++---------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index 146e17f..29a894e 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -7,8 +7,8 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.data.model.User -import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.databinding.ActivityLoginBinding +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity import com.sopt.now.util.BindingActivity @@ -18,7 +18,7 @@ import com.sopt.now.util.toast class LoginActivity : BindingActivity(R.layout.activity_login) { private lateinit var resultLauncher: ActivityResultLauncher - private val viewModel by viewModels() + private val viewModel: LoginViewModel by viewModels { LoginViewModelFactory() } private lateinit var user: User override fun onCreate(savedInstanceState: Bundle?) { @@ -79,14 +79,16 @@ class LoginActivity : BindingActivity(R.layout.activity_lo private fun initLoginBtnClickListener() { binding.btnLogin.setOnClickListener { - viewModel.login(getLoginRequestDto()) + viewModel.login(getLoginRequest()) } } - private fun getLoginRequestDto() = - RequestLoginDto( + private fun getLoginRequest() = + AuthRequestModel( authenticationId = binding.etLoginId.text.toString(), - password = binding.etLoginPassword.text.toString() + password = binding.etLoginPassword.text.toString(), + nickname = "", + phone = "" ) companion object { diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index 23464e6..71b09e6 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -3,9 +3,9 @@ package com.sopt.now.ui.login import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.api.ServicePool -import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.repository.AuthRepository import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState @@ -13,39 +13,39 @@ import kotlinx.coroutines.launch import org.json.JSONObject import retrofit2.HttpException -class LoginViewModel : ViewModel() { - private val loginService by lazy { ServicePool.authService } +class LoginViewModel(private val authRepository: AuthRepository) : ViewModel() { private val _loginState = MutableLiveData>() val loginState = _loginState - fun login(request: RequestLoginDto) { + fun login(request: AuthRequestModel) { _loginState.value = UiState.Loading viewModelScope.launch { - runCatching { - loginService.login(request) - }.onSuccess { response -> - val userId = response.headers()["Location"].toString() - if (response.isSuccessful) - _loginState.value = - UiState.Success( User( - request.authenticationId, - request.password, - "", - "", - userId = userId - )) - else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString("message") - _loginState.value = UiState.Error(errorMessage.toString()) + authRepository.logIn(request) + .onSuccess { response -> + val userId = response.headers()["Location"].toString() + if (response.isSuccessful) + _loginState.value = + UiState.Success( + User( + request.authenticationId, + request.password, + "", + "", + userId = userId + ) + ) + else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString("message") + _loginState.value = UiState.Error(errorMessage.toString()) + } + }.onFailure { e -> + if (e is HttpException) { + _loginState.value = UiState.Error(e.message()) + } else { + _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) + } } - }.onFailure { e -> - if (e is HttpException) { - _loginState.value = UiState.Error(e.message()) - } else { - _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) - } - } } } } From ad8381d15a4888d450598b496140fca8bacf2298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:04:24 +0900 Subject: [PATCH 09/32] =?UTF-8?q?[mod]=20#18=20signup=20repository=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../now/data/dto/request/RequestSignUpDto.kt | 12 ++++- .../com/sopt/now/ui/signup/SignUpActivity.kt | 2 +- .../com/sopt/now/ui/signup/SignUpViewModel.kt | 44 ++++++++++--------- .../now/ui/signup/SignUpViewModelFactory.kt | 19 ++++++++ 4 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt diff --git a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt index 44d2b51..9121e44 100644 --- a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt @@ -1,6 +1,7 @@ package com.sopt.now.data.dto.request import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -16,5 +17,14 @@ data class RequestSignUpDto( val phone: String, ) { fun toUserWithUserId(userid: String): User = - User(id = authenticationId, password = password, nickname = nickname, phoneNumber = phone, userId = userid) + User( + id = authenticationId, + password = password, + nickname = nickname, + phoneNumber = phone, + userId = userid + ) + + fun toAuthRequestModel(): AuthRequestModel = + AuthRequestModel(authenticationId, password, nickname, phone) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 397323e..7d4f8ca 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -15,7 +15,7 @@ import com.sopt.now.util.UiState import com.sopt.now.util.toast class SignUpActivity : BindingActivity(R.layout.activity_sign_up) { - private val viewModel by viewModels() + private val viewModel by viewModels { SignUpViewModelFactory() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 5338b45..23a103a 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,41 +1,43 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.api.ServicePool import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User +import com.sopt.now.domain.repository.AuthRepository import com.sopt.now.util.UiState import kotlinx.coroutines.launch import org.json.JSONObject import retrofit2.HttpException -class SignUpViewModel : ViewModel() { - private val authService by lazy { ServicePool.authService } - +class SignUpViewModel(private val authRepository: AuthRepository) : ViewModel() { private val _signUpState = MutableLiveData>() val signUpState = _signUpState fun signUp(request: RequestSignUpDto) { _signUpState.value = UiState.Loading viewModelScope.launch { - runCatching { - authService.signUp(request) - }.onSuccess { response -> - if (response.isSuccessful) - _signUpState.value = - UiState.Success(request.toUserWithUserId(response.headers()["userid"].toString())) - else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString("message") - _signUpState.value = UiState.Error(errorMessage.toString()) - } - }.onFailure { e -> - if (e is HttpException) { - _signUpState.value = UiState.Error(e.message()) - } else { - _signUpState.value = UiState.Error(e.message.toString()) + authRepository.signUp(request.toAuthRequestModel()) + .onSuccess { response -> + if (response.isSuccessful) + _signUpState.value = + UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) + else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString(MESSAGE) + _signUpState.value = UiState.Error(errorMessage.toString()) + } + }.onFailure { e -> + if (e is HttpException) { + _signUpState.value = UiState.Error(e.message()) + } else { + _signUpState.value = UiState.Error(e.message.toString()) + } } - } } } + + companion object { + const val MESSAGE = "message" + const val LOCATION = "location" + } } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt new file mode 100644 index 0000000..92e431c --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt @@ -0,0 +1,19 @@ +package com.sopt.now.ui.signup + +import SignUpViewModel +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.sopt.now.data.AuthRepositoryImpl +import com.sopt.now.data.api.ServicePool + +class SignUpViewModelFactory : ViewModelProvider.Factory{ + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(SignUpViewModel::class.java)) { + val repository = + AuthRepositoryImpl(ServicePool.authService) + return SignUpViewModel(repository) as T + } else { + throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") + } + } +} \ No newline at end of file From 4784add9caf2d9fae4eca0bdc3b894fc3c6e8861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:14:46 +0900 Subject: [PATCH 10/32] =?UTF-8?q?[mod]=20#18=20signup=20usecase=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/domain/usecase/SignUpUseCase.kt | 45 +++++++++++++++++++ .../com/sopt/now/ui/signup/SignUpViewModel.kt | 29 ++---------- .../now/ui/signup/SignUpViewModelFactory.kt | 7 +-- 3 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt new file mode 100644 index 0000000..0b1ac2e --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -0,0 +1,45 @@ +package com.sopt.now.domain.usecase + +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.model.User +import com.sopt.now.domain.repository.AuthRepository +import com.sopt.now.util.UiState +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.json.JSONObject +import retrofit2.HttpException + +class SignUpUseCase(private val authRepository: AuthRepository) { + suspend fun execute(request: RequestSignUpDto): UiState { + return withContext(Dispatchers.IO) { + try { + val result = authRepository.signUp(request.toAuthRequestModel()) + result.fold( + onSuccess = { response -> + if (response.isSuccessful) { + UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) + } else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString(MESSAGE) + UiState.Error(errorMessage.toString()) + } + }, + onFailure = { e -> + if (e is HttpException) { + UiState.Error(e.message()) + } else { + UiState.Error(e.message.toString()) + } + } + ) + } catch (e: Exception) { + UiState.Error(e.message.toString()) + } + } + } + + companion object { + const val MESSAGE = "message" + const val LOCATION = "location" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 23a103a..4f2cab2 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -3,41 +3,18 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User -import com.sopt.now.domain.repository.AuthRepository +import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import org.json.JSONObject -import retrofit2.HttpException -class SignUpViewModel(private val authRepository: AuthRepository) : ViewModel() { +class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() val signUpState = _signUpState fun signUp(request: RequestSignUpDto) { _signUpState.value = UiState.Loading viewModelScope.launch { - authRepository.signUp(request.toAuthRequestModel()) - .onSuccess { response -> - if (response.isSuccessful) - _signUpState.value = - UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) - else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString(MESSAGE) - _signUpState.value = UiState.Error(errorMessage.toString()) - } - }.onFailure { e -> - if (e is HttpException) { - _signUpState.value = UiState.Error(e.message()) - } else { - _signUpState.value = UiState.Error(e.message.toString()) - } - } + _signUpState.value = signUpUseCase.execute(request) } } - - companion object { - const val MESSAGE = "message" - const val LOCATION = "location" - } } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt index 92e431c..65bd03b 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt @@ -5,13 +5,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.sopt.now.data.AuthRepositoryImpl import com.sopt.now.data.api.ServicePool +import com.sopt.now.domain.usecase.SignUpUseCase class SignUpViewModelFactory : ViewModelProvider.Factory{ override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(SignUpViewModel::class.java)) { - val repository = - AuthRepositoryImpl(ServicePool.authService) - return SignUpViewModel(repository) as T + val repository = AuthRepositoryImpl(ServicePool.authService) + val signUpUseCase = SignUpUseCase(repository) + return SignUpViewModel(signUpUseCase) as T } else { throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") } From adb8543a9c99eb60dca5863cfda7435935a6059b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:35:09 +0900 Subject: [PATCH 11/32] =?UTF-8?q?[mod]=20#18=20login=20usecase=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/domain/usecase/LogInUseCase.kt | 54 +++++++++++++++++++ .../com/sopt/now/ui/login/LoginViewModel.kt | 36 ++----------- .../now/ui/login/LoginViewModelFactory.kt | 6 ++- 3 files changed, 62 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt diff --git a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt new file mode 100644 index 0000000..4565743 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt @@ -0,0 +1,54 @@ +package com.sopt.now.domain.usecase + +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.repository.AuthRepository +import com.sopt.now.util.UiState +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.json.JSONObject +import retrofit2.HttpException + +class LogInUseCase(private val authRepository: AuthRepository) { + suspend fun execute(request: AuthRequestModel): UiState { + return withContext(Dispatchers.IO) { + try { + val result = authRepository.logIn(request) + result.fold( + onSuccess = { response -> + if (response.isSuccessful) { + UiState.Success( + User( + request.authenticationId, + request.password, + "", + "", + userId = response.headers()[LOCATION].toString() + ) + ) + } else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString(MESSAGE) + UiState.Error(errorMessage.toString()) + } + }, + onFailure = { e -> + if (e is HttpException) { + UiState.Error(e.message()) + } else { + UiState.Error(e.message.toString()) + } + } + ) + } catch (e: Exception) { + UiState.Error(e.message.toString()) + } + } + } + + companion object { + const val MESSAGE = "message" + const val LOCATION = "location" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index 71b09e6..eb5edf1 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -5,47 +5,19 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.model.User import com.sopt.now.domain.entity.request.AuthRequestModel -import com.sopt.now.domain.repository.AuthRepository -import com.sopt.now.util.StringNetworkError.FAIL_ERROR -import com.sopt.now.util.StringNetworkError.LOGIN +import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import org.json.JSONObject -import retrofit2.HttpException -class LoginViewModel(private val authRepository: AuthRepository) : ViewModel() { +class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { private val _loginState = MutableLiveData>() val loginState = _loginState fun login(request: AuthRequestModel) { _loginState.value = UiState.Loading viewModelScope.launch { - authRepository.logIn(request) - .onSuccess { response -> - val userId = response.headers()["Location"].toString() - if (response.isSuccessful) - _loginState.value = - UiState.Success( - User( - request.authenticationId, - request.password, - "", - "", - userId = userId - ) - ) - else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString("message") - _loginState.value = UiState.Error(errorMessage.toString()) - } - }.onFailure { e -> - if (e is HttpException) { - _loginState.value = UiState.Error(e.message()) - } else { - _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) - } - } + _loginState.value = logInUseCase.execute(request) } } } + diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt index f3ecd96..2705bfb 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt @@ -4,13 +4,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.sopt.now.data.AuthRepositoryImpl import com.sopt.now.data.api.ServicePool +import com.sopt.now.domain.usecase.LogInUseCase -class LoginViewModelFactory : ViewModelProvider.Factory{ +class LoginViewModelFactory : ViewModelProvider.Factory { override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { val repository = AuthRepositoryImpl(ServicePool.authService) - return LoginViewModel(repository) as T + val logInUseCase = LogInUseCase(repository) + return LoginViewModel(logInUseCase) as T } else { throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") } From 6029ae83ed7f3afee3e6d276c2c7d4129ca6296c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:10:26 +0900 Subject: [PATCH 12/32] =?UTF-8?q?[chore]=20#18=20=20data=20<-domain=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B6=84=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20dto=EC=99=80=20=EB=A1=9C=EC=A7=81=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../now/data/dto/request/RequestSignUpDto.kt | 16 +--------------- .../domain/entity/request/AuthRequestModel.kt | 17 ++++++++++++++--- .../sopt/now/domain/usecase/SignUpUseCase.kt | 6 +++--- .../com/sopt/now/ui/signup/SignUpActivity.kt | 4 ++-- .../com/sopt/now/ui/signup/SignUpViewModel.kt | 6 +++--- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt index 9121e44..6610d27 100644 --- a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt @@ -1,7 +1,5 @@ package com.sopt.now.data.dto.request -import com.sopt.now.data.model.User -import com.sopt.now.domain.entity.request.AuthRequestModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,16 +13,4 @@ data class RequestSignUpDto( val nickname: String, @SerialName("phone") val phone: String, -) { - fun toUserWithUserId(userid: String): User = - User( - id = authenticationId, - password = password, - nickname = nickname, - phoneNumber = phone, - userId = userid - ) - - fun toAuthRequestModel(): AuthRequestModel = - AuthRequestModel(authenticationId, password, nickname, phone) -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt index c697a27..b14083f 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt @@ -2,13 +2,24 @@ package com.sopt.now.domain.entity.request import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.model.User data class AuthRequestModel( val authenticationId: String, val password: String, val nickname: String, val phone: String, -){ - fun toRequestSignup():RequestSignUpDto= RequestSignUpDto(authenticationId,password, nickname, phone) - fun toRequestLogin():RequestLoginDto = RequestLoginDto(authenticationId, password) +) { + fun toRequestSignup(): RequestSignUpDto = + RequestSignUpDto(authenticationId, password, nickname, phone) + + fun toRequestLogin(): RequestLoginDto = RequestLoginDto(authenticationId, password) + fun toUserWithUserId(userid: String): User = + User( + id = authenticationId, + password = password, + nickname = nickname, + phoneNumber = phone, + userId = userid + ) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index 0b1ac2e..b8a25a1 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -1,7 +1,7 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository import com.sopt.now.util.UiState import kotlinx.coroutines.Dispatchers @@ -10,10 +10,10 @@ import org.json.JSONObject import retrofit2.HttpException class SignUpUseCase(private val authRepository: AuthRepository) { - suspend fun execute(request: RequestSignUpDto): UiState { + suspend fun execute(request: AuthRequestModel): UiState { return withContext(Dispatchers.IO) { try { - val result = authRepository.signUp(request.toAuthRequestModel()) + val result = authRepository.signUp(request) result.fold( onSuccess = { response -> if (response.isSuccessful) { diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 7d4f8ca..9d4f148 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.data.model.User -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.databinding.ActivitySignUpBinding +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.util.BindingActivity @@ -63,7 +63,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ finish() } - private fun getSignUpRequestDto() = RequestSignUpDto( + private fun getSignUpRequestDto() = AuthRequestModel( authenticationId = binding.etSignupId.text.toString(), password = binding.etSignupPassword.text.toString(), nickname = binding.etSignupNickname.text.toString(), diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 4f2cab2..8e9765d 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,17 +1,17 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch -class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { +class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() val signUpState = _signUpState - fun signUp(request: RequestSignUpDto) { + fun signUp(request: AuthRequestModel) { _signUpState.value = UiState.Loading viewModelScope.launch { _signUpState.value = signUpUseCase.execute(request) From 2cc557b9b73389b381f37d73d4d239d4eec62a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:10:26 +0900 Subject: [PATCH 13/32] =?UTF-8?q?[chore]=20#18=20=20data=20<-domain=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B6=84=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20dto=EC=99=80=20=EB=A1=9C=EC=A7=81=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../now/data/dto/request/RequestSignUpDto.kt | 16 +--------------- .../domain/entity/request/AuthRequestModel.kt | 17 ++++++++++++++--- .../sopt/now/domain/usecase/SignUpUseCase.kt | 6 +++--- .../com/sopt/now/ui/signup/SignUpActivity.kt | 9 +++------ .../com/sopt/now/ui/signup/SignUpViewModel.kt | 6 +++--- 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt index 9121e44..6610d27 100644 --- a/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt @@ -1,7 +1,5 @@ package com.sopt.now.data.dto.request -import com.sopt.now.data.model.User -import com.sopt.now.domain.entity.request.AuthRequestModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,16 +13,4 @@ data class RequestSignUpDto( val nickname: String, @SerialName("phone") val phone: String, -) { - fun toUserWithUserId(userid: String): User = - User( - id = authenticationId, - password = password, - nickname = nickname, - phoneNumber = phone, - userId = userid - ) - - fun toAuthRequestModel(): AuthRequestModel = - AuthRequestModel(authenticationId, password, nickname, phone) -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt index c697a27..b14083f 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt @@ -2,13 +2,24 @@ package com.sopt.now.domain.entity.request import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.data.model.User data class AuthRequestModel( val authenticationId: String, val password: String, val nickname: String, val phone: String, -){ - fun toRequestSignup():RequestSignUpDto= RequestSignUpDto(authenticationId,password, nickname, phone) - fun toRequestLogin():RequestLoginDto = RequestLoginDto(authenticationId, password) +) { + fun toRequestSignup(): RequestSignUpDto = + RequestSignUpDto(authenticationId, password, nickname, phone) + + fun toRequestLogin(): RequestLoginDto = RequestLoginDto(authenticationId, password) + fun toUserWithUserId(userid: String): User = + User( + id = authenticationId, + password = password, + nickname = nickname, + phoneNumber = phone, + userId = userid + ) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index 0b1ac2e..b8a25a1 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -1,7 +1,7 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository import com.sopt.now.util.UiState import kotlinx.coroutines.Dispatchers @@ -10,10 +10,10 @@ import org.json.JSONObject import retrofit2.HttpException class SignUpUseCase(private val authRepository: AuthRepository) { - suspend fun execute(request: RequestSignUpDto): UiState { + suspend fun execute(request: AuthRequestModel): UiState { return withContext(Dispatchers.IO) { try { - val result = authRepository.signUp(request.toAuthRequestModel()) + val result = authRepository.signUp(request) result.fold( onSuccess = { response -> if (response.isSuccessful) { diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 7d4f8ca..db4a794 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.data.model.User -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.databinding.ActivitySignUpBinding +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.util.BindingActivity @@ -30,10 +30,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ private fun initObserver() { viewModel.signUpState.observe(this) { state -> when (state) { - is UiState.Loading -> { - - } - + is UiState.Loading -> Unit is UiState.Success -> { toast("회원가입 성공 userid = ${state.data.userId} 입니다!") navToLogin(state.data) @@ -63,7 +60,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ finish() } - private fun getSignUpRequestDto() = RequestSignUpDto( + private fun getSignUpRequestDto() = AuthRequestModel( authenticationId = binding.etSignupId.text.toString(), password = binding.etSignupPassword.text.toString(), nickname = binding.etSignupNickname.text.toString(), diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 4f2cab2..8e9765d 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,17 +1,17 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User +import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch -class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { +class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() val signUpState = _signUpState - fun signUp(request: RequestSignUpDto) { + fun signUp(request: AuthRequestModel) { _signUpState.value = UiState.Loading viewModelScope.launch { _signUpState.value = signUpUseCase.execute(request) From 3e6e6ba731bb1a0b7024642b0aac7b2778160c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Wed, 12 Jun 2024 23:54:17 +0900 Subject: [PATCH 14/32] =?UTF-8?q?[mod]=20#18=20usecase=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/domain/usecase/LogInUseCase.kt | 50 ++----------------- .../sopt/now/domain/usecase/SignUpUseCase.kt | 41 ++------------- .../com/sopt/now/ui/login/LoginViewModel.kt | 37 +++++++++++++- .../com/sopt/now/ui/signup/SignUpViewModel.kt | 26 +++++++++- 4 files changed, 69 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt index 4565743..44e6d7e 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt @@ -1,54 +1,12 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.dto.request.RequestLoginDto -import com.sopt.now.data.model.User +import com.sopt.now.data.dto.response.BaseResponse import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository -import com.sopt.now.util.UiState -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.json.JSONObject -import retrofit2.HttpException +import retrofit2.Response class LogInUseCase(private val authRepository: AuthRepository) { - suspend fun execute(request: AuthRequestModel): UiState { - return withContext(Dispatchers.IO) { - try { - val result = authRepository.logIn(request) - result.fold( - onSuccess = { response -> - if (response.isSuccessful) { - UiState.Success( - User( - request.authenticationId, - request.password, - "", - "", - userId = response.headers()[LOCATION].toString() - ) - ) - } else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString(MESSAGE) - UiState.Error(errorMessage.toString()) - } - }, - onFailure = { e -> - if (e is HttpException) { - UiState.Error(e.message()) - } else { - UiState.Error(e.message.toString()) - } - } - ) - } catch (e: Exception) { - UiState.Error(e.message.toString()) - } - } - } - companion object { - const val MESSAGE = "message" - const val LOCATION = "location" - } + suspend operator fun invoke(request: AuthRequestModel):Result>> = + authRepository.logIn(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index b8a25a1..7fcccc2 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -1,45 +1,12 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.model.User +import com.sopt.now.data.dto.response.BaseResponse import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository -import com.sopt.now.util.UiState -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.json.JSONObject -import retrofit2.HttpException +import retrofit2.Response class SignUpUseCase(private val authRepository: AuthRepository) { - suspend fun execute(request: AuthRequestModel): UiState { - return withContext(Dispatchers.IO) { - try { - val result = authRepository.signUp(request) - result.fold( - onSuccess = { response -> - if (response.isSuccessful) { - UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) - } else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString(MESSAGE) - UiState.Error(errorMessage.toString()) - } - }, - onFailure = { e -> - if (e is HttpException) { - UiState.Error(e.message()) - } else { - UiState.Error(e.message.toString()) - } - } - ) - } catch (e: Exception) { - UiState.Error(e.message.toString()) - } - } - } - companion object { - const val MESSAGE = "message" - const val LOCATION = "location" - } + suspend operator fun invoke(request: AuthRequestModel):Result>> = + authRepository.signUp(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index eb5edf1..b37ec82 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -6,8 +6,12 @@ import androidx.lifecycle.viewModelScope import com.sopt.now.data.model.User import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.LogInUseCase +import com.sopt.now.util.StringNetworkError.FAIL_ERROR +import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState import kotlinx.coroutines.launch +import org.json.JSONObject +import retrofit2.HttpException class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { private val _loginState = MutableLiveData>() @@ -16,8 +20,39 @@ class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { fun login(request: AuthRequestModel) { _loginState.value = UiState.Loading viewModelScope.launch { - _loginState.value = logInUseCase.execute(request) + logInUseCase(request) + .onSuccess { response -> + val userId = response.headers()[LOCATION].toString() + if (response.isSuccessful) + _loginState.value = + UiState.Success( + User( + request.authenticationId, + request.password, + "", + "", + userId = userId + ) + ) + else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString(MESSAGE) + _loginState.value = UiState.Error(errorMessage.toString()) + } + } + .onFailure { e -> + if (e is HttpException) { + _loginState.value = UiState.Error(e.message()) + } else { + _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) + } + } } } + + companion object { + private const val MESSAGE = "message" + private const val LOCATION = "location" + } } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 8e9765d..88827c5 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -6,6 +6,8 @@ import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch +import org.json.JSONObject +import retrofit2.HttpException class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() @@ -14,7 +16,29 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { fun signUp(request: AuthRequestModel) { _signUpState.value = UiState.Loading viewModelScope.launch { - _signUpState.value = signUpUseCase.execute(request) + signUpUseCase(request) + .onSuccess { response -> + if (response.isSuccessful) { + _signUpState.value = + UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) + } else { + val errorMessage = + JSONObject(response.errorBody()?.string()).getString(MESSAGE) + _signUpState.value = UiState.Error(errorMessage.toString()) + } + } + .onFailure { e -> + if (e is HttpException) { + _signUpState.value = UiState.Error(e.message()) + } else { + _signUpState.value = UiState.Error(e.message.toString()) + } + } } } + + companion object { + private const val LOCATION = "location" + private const val MESSAGE = "message" + } } From d752e679f3fb9ea373b4c1abf91ae79c750cd4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Wed, 12 Jun 2024 23:54:30 +0900 Subject: [PATCH 15/32] =?UTF-8?q?[mod]=20#18=20mapper=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=EC=84=B1=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/now/data/AuthRepositoryImpl.kt | 6 ++++-- .../main/java/com/sopt/now/data/dto/Mapper.kt | 19 +++++++++++++++++++ .../domain/entity/request/AuthRequestModel.kt | 6 ------ 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/sopt/now/data/dto/Mapper.kt diff --git a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt index a2304bd..7a6248b 100644 --- a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt @@ -2,6 +2,8 @@ package com.sopt.now.data import com.sopt.now.data.api.AuthService import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.data.dto.toRequestLoginDto +import com.sopt.now.data.dto.toRequestSignUpDto import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository import retrofit2.Response @@ -9,11 +11,11 @@ import retrofit2.Response class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { override suspend fun logIn(authData: AuthRequestModel): Result>> = runCatching { - authService.login(authData.toRequestLogin()) + authService.login(authData.toRequestLoginDto()) } override suspend fun signUp(authData: AuthRequestModel): Result>> = runCatching { - authService.signUp(authData.toRequestSignup()) + authService.signUp(authData.toRequestSignUpDto()) } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt new file mode 100644 index 0000000..a084a7d --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt @@ -0,0 +1,19 @@ +package com.sopt.now.data.dto + +import com.sopt.now.data.dto.request.RequestLoginDto +import com.sopt.now.data.dto.request.RequestSignUpDto +import com.sopt.now.domain.entity.request.AuthRequestModel + +internal fun AuthRequestModel.toRequestLoginDto(): RequestLoginDto = + RequestLoginDto( + authenticationId = authenticationId, + password = password + ) + +internal fun AuthRequestModel.toRequestSignUpDto(): RequestSignUpDto = + RequestSignUpDto( + authenticationId = authenticationId, + password = password, + nickname = nickname, + phone = phone + ) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt index b14083f..1f02162 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt @@ -1,7 +1,5 @@ package com.sopt.now.domain.entity.request -import com.sopt.now.data.dto.request.RequestLoginDto -import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.model.User data class AuthRequestModel( @@ -10,10 +8,6 @@ data class AuthRequestModel( val nickname: String, val phone: String, ) { - fun toRequestSignup(): RequestSignUpDto = - RequestSignUpDto(authenticationId, password, nickname, phone) - - fun toRequestLogin(): RequestLoginDto = RequestLoginDto(authenticationId, password) fun toUserWithUserId(userid: String): User = User( id = authenticationId, From 05219f117c207797dc0bf564295bb00610933fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Thu, 13 Jun 2024 06:16:52 +0900 Subject: [PATCH 16/32] =?UTF-8?q?[Chore]=20#18=20user=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20Ui=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/data/dto/response/ResponseInfoDto.kt | 2 +- .../now/domain/entity/request/AuthRequestModel.kt | 12 +----------- .../main/java/com/sopt/now/ui/login/LoginActivity.kt | 2 +- .../java/com/sopt/now/ui/login/LoginViewModel.kt | 2 +- .../main/java/com/sopt/now/ui/main/MainActivity.kt | 2 +- .../main/java/com/sopt/now/ui/main/MainViewModel.kt | 2 +- .../java/com/sopt/now/{data => ui}/model/User.kt | 2 +- .../java/com/sopt/now/ui/signup/SignUpActivity.kt | 2 +- .../java/com/sopt/now/ui/signup/SignUpViewModel.kt | 12 ++++++++++-- 9 files changed, 18 insertions(+), 20 deletions(-) rename app/src/main/java/com/sopt/now/{data => ui}/model/User.kt (88%) diff --git a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt index cf44890..703dfec 100644 --- a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt @@ -1,6 +1,6 @@ package com.sopt.now.data.dto.response -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt index 1f02162..d01a796 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt @@ -1,19 +1,9 @@ package com.sopt.now.domain.entity.request -import com.sopt.now.data.model.User data class AuthRequestModel( val authenticationId: String, val password: String, val nickname: String, val phone: String, -) { - fun toUserWithUserId(userid: String): User = - User( - id = authenticationId, - password = password, - nickname = nickname, - phoneNumber = phone, - userId = userid - ) -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index 29a894e..4a80892 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -6,7 +6,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import com.sopt.now.R -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityLoginBinding import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.main.MainActivity diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index b37ec82..055cdc9 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -3,7 +3,7 @@ package com.sopt.now.ui.login import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.util.StringNetworkError.FAIL_ERROR diff --git a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt index 9a334cb..a0d0b53 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt @@ -4,7 +4,7 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.fragment.app.Fragment import com.sopt.now.R -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityMainBinding import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.ui.main.home.MainHomeFragment diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt index 14ef218..948a748 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.data.api.ServicePool.infoService import com.sopt.now.data.model.Profile -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState diff --git a/app/src/main/java/com/sopt/now/data/model/User.kt b/app/src/main/java/com/sopt/now/ui/model/User.kt similarity index 88% rename from app/src/main/java/com/sopt/now/data/model/User.kt rename to app/src/main/java/com/sopt/now/ui/model/User.kt index 7f5c2c0..67cdcf7 100644 --- a/app/src/main/java/com/sopt/now/data/model/User.kt +++ b/app/src/main/java/com/sopt/now/ui/model/User.kt @@ -1,4 +1,4 @@ -package com.sopt.now.data.model +package com.sopt.now.ui.model import android.os.Parcelable import kotlinx.android.parcel.Parcelize diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index db4a794..224d998 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -5,7 +5,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import com.sopt.now.R -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivitySignUpBinding import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.login.LoginActivity diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 88827c5..b0e3893 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,7 +1,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.model.User +import com.sopt.now.ui.model.User import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState @@ -20,7 +20,15 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { .onSuccess { response -> if (response.isSuccessful) { _signUpState.value = - UiState.Success(request.toUserWithUserId(response.headers()[LOCATION].toString())) + UiState.Success( + User( + request.authenticationId, + request.password, + request.nickname, + request.phone, + response.headers()[LOCATION].toString() + ) + ) } else { val errorMessage = JSONObject(response.errorBody()?.string()).getString(MESSAGE) From 29a96dbff0e528a4cec2c275d11f93e7f422b1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Thu, 13 Jun 2024 06:22:40 +0900 Subject: [PATCH 17/32] =?UTF-8?q?[Chore]=20#18=20ViewModelFactory=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iewModelFactory.kt => ViewModelFactory.kt} | 11 ++++++++-- .../com/sopt/now/ui/login/LoginActivity.kt | 3 ++- .../now/ui/login/LoginViewModelFactory.kt | 20 ------------------- .../com/sopt/now/ui/signup/SignUpActivity.kt | 3 ++- 4 files changed, 13 insertions(+), 24 deletions(-) rename app/src/main/java/com/sopt/now/ui/{signup/SignUpViewModelFactory.kt => ViewModelFactory.kt} (61%) delete mode 100644 app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt similarity index 61% rename from app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt rename to app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt index 65bd03b..502e916 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModelFactory.kt +++ b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt @@ -1,18 +1,25 @@ -package com.sopt.now.ui.signup +package com.sopt.now.ui import SignUpViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.sopt.now.data.AuthRepositoryImpl import com.sopt.now.data.api.ServicePool +import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.domain.usecase.SignUpUseCase +import com.sopt.now.ui.login.LoginViewModel -class SignUpViewModelFactory : ViewModelProvider.Factory{ +class ViewModelFactory : ViewModelProvider.Factory { override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(SignUpViewModel::class.java)) { val repository = AuthRepositoryImpl(ServicePool.authService) val signUpUseCase = SignUpUseCase(repository) return SignUpViewModel(signUpUseCase) as T + } else if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { + val repository = AuthRepositoryImpl(ServicePool.authService) + val loginUseCase = LogInUseCase(repository) + return LoginViewModel(loginUseCase) as T + } else { throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") } diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index 4a80892..7fdd29e 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -11,6 +11,7 @@ import com.sopt.now.databinding.ActivityLoginBinding import com.sopt.now.domain.entity.request.AuthRequestModel import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity +import com.sopt.now.ui.ViewModelFactory import com.sopt.now.util.BindingActivity import com.sopt.now.util.UiState import com.sopt.now.util.getSafeParcelable @@ -18,7 +19,7 @@ import com.sopt.now.util.toast class LoginActivity : BindingActivity(R.layout.activity_login) { private lateinit var resultLauncher: ActivityResultLauncher - private val viewModel: LoginViewModel by viewModels { LoginViewModelFactory() } + private val viewModel: LoginViewModel by viewModels { ViewModelFactory() } private lateinit var user: User override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt deleted file mode 100644 index 2705bfb..0000000 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModelFactory.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.sopt.now.ui.login - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.sopt.now.data.AuthRepositoryImpl -import com.sopt.now.data.api.ServicePool -import com.sopt.now.domain.usecase.LogInUseCase - -class LoginViewModelFactory : ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { - val repository = - AuthRepositoryImpl(ServicePool.authService) - val logInUseCase = LogInUseCase(repository) - return LoginViewModel(logInUseCase) as T - } else { - throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 224d998..5955186 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -8,6 +8,7 @@ import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivitySignUpBinding import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.util.BindingActivity @@ -15,7 +16,7 @@ import com.sopt.now.util.UiState import com.sopt.now.util.toast class SignUpActivity : BindingActivity(R.layout.activity_sign_up) { - private val viewModel by viewModels { SignUpViewModelFactory() } + private val viewModel by viewModels { ViewModelFactory() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 381ecab801a1a770705243864a50082cbfd955cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 05:30:52 +0900 Subject: [PATCH 18/32] =?UTF-8?q?[Mod]=20#18=20AuthService=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/sopt/now/data/api/AuthService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/now/data/api/AuthService.kt b/app/src/main/java/com/sopt/now/data/api/AuthService.kt index 8dc7ea6..89ab5be 100644 --- a/app/src/main/java/com/sopt/now/data/api/AuthService.kt +++ b/app/src/main/java/com/sopt/now/data/api/AuthService.kt @@ -11,7 +11,7 @@ interface AuthService { @POST("member/join") suspend fun signUp( @Body request: RequestSignUpDto, - ): Response> + ): BaseResponse @POST("member/login") From f639c9a9971afbf8801fe17cc93ae44f566cddc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 05:31:18 +0900 Subject: [PATCH 19/32] =?UTF-8?q?[Add]=20#18=20getErrorMessage,ApiError=20?= =?UTF-8?q?,BaseResponseEntity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/getErrorMessage.kt | 35 +++++++++++++++++++ .../com/sopt/now/domain/entity/ApiError.kt | 5 +++ .../now/domain/entity/BaseResponseEntity.kt | 6 ++++ 3 files changed, 46 insertions(+) create mode 100644 app/src/main/java/com/sopt/now/data/repositoryimpl/extension/getErrorMessage.kt create mode 100644 app/src/main/java/com/sopt/now/domain/entity/ApiError.kt create mode 100644 app/src/main/java/com/sopt/now/domain/entity/BaseResponseEntity.kt diff --git a/app/src/main/java/com/sopt/now/data/repositoryimpl/extension/getErrorMessage.kt b/app/src/main/java/com/sopt/now/data/repositoryimpl/extension/getErrorMessage.kt new file mode 100644 index 0000000..dc99fef --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repositoryimpl/extension/getErrorMessage.kt @@ -0,0 +1,35 @@ +package com.sopt.now.data.repositoryimpl.extension + +import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.domain.entity.ApiError +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import retrofit2.HttpException +import retrofit2.Response + +fun Throwable.getErrorMessage(): String { + return when (this) { + is HttpException -> { + val errorBody = response()?.errorBody()?.string() ?: return "Unknown error" + val errorResponse = Json.decodeFromString>(errorBody) + errorResponse.message + } + + else -> "An unknown error occurred." + } +} + +fun Throwable.handleThrowable(): Result { + return Result.failure( + when (this) { + is HttpException -> ApiError(this.getErrorMessage()) + else -> this + } + ) +} + +fun Response<*>?.getResponseErrorMessage(): String { + val errorBody = this?.errorBody()?.string() ?: return "Unknown error" + val errorResponse = Json.decodeFromString>(errorBody) + return errorResponse.message +} diff --git a/app/src/main/java/com/sopt/now/domain/entity/ApiError.kt b/app/src/main/java/com/sopt/now/domain/entity/ApiError.kt new file mode 100644 index 0000000..89f2fc6 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/entity/ApiError.kt @@ -0,0 +1,5 @@ +package com.sopt.now.domain.entity + +data class ApiError( + val errorMessage: String? +) : Exception(errorMessage) diff --git a/app/src/main/java/com/sopt/now/domain/entity/BaseResponseEntity.kt b/app/src/main/java/com/sopt/now/domain/entity/BaseResponseEntity.kt new file mode 100644 index 0000000..9c5d374 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/entity/BaseResponseEntity.kt @@ -0,0 +1,6 @@ +package com.sopt.now.domain.entity + +data class BaseResponseEntity( + val code: Int, + val message: String +) From 06dbdef988d4dd5225ede3699a2d871aa79bbac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 05:34:29 +0900 Subject: [PATCH 20/32] =?UTF-8?q?[Mod]=20#18=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/now/data/AuthRepositoryImpl.kt | 21 ----------- .../main/java/com/sopt/now/data/dto/Mapper.kt | 12 +++++- .../data/repositoryimpl/AuthRepositoryImpl.kt | 37 +++++++++++++++++++ .../entity/{request => }/AuthRequestModel.kt | 2 +- .../now/domain/repository/AuthRepository.kt | 9 ++--- .../sopt/now/domain/usecase/LogInUseCase.kt | 8 ++-- .../sopt/now/domain/usecase/SignUpUseCase.kt | 7 ++-- .../java/com/sopt/now/ui/ViewModelFactory.kt | 2 +- .../com/sopt/now/ui/login/LoginActivity.kt | 2 +- .../com/sopt/now/ui/login/LoginViewModel.kt | 33 ++++++----------- .../com/sopt/now/ui/signup/SignUpActivity.kt | 2 +- .../com/sopt/now/ui/signup/SignUpViewModel.kt | 30 +++++---------- 12 files changed, 81 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt create mode 100644 app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt rename app/src/main/java/com/sopt/now/domain/entity/{request => }/AuthRequestModel.kt (76%) diff --git a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt deleted file mode 100644 index 7a6248b..0000000 --- a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.sopt.now.data - -import com.sopt.now.data.api.AuthService -import com.sopt.now.data.dto.response.BaseResponse -import com.sopt.now.data.dto.toRequestLoginDto -import com.sopt.now.data.dto.toRequestSignUpDto -import com.sopt.now.domain.entity.request.AuthRequestModel -import com.sopt.now.domain.repository.AuthRepository -import retrofit2.Response - -class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { - override suspend fun logIn(authData: AuthRequestModel): Result>> = - runCatching { - authService.login(authData.toRequestLoginDto()) - } - - override suspend fun signUp(authData: AuthRequestModel): Result>> = - runCatching { - authService.signUp(authData.toRequestSignUpDto()) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt index a084a7d..b3d1a87 100644 --- a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt +++ b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt @@ -2,7 +2,9 @@ package com.sopt.now.data.dto import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.BaseResponseEntity internal fun AuthRequestModel.toRequestLoginDto(): RequestLoginDto = RequestLoginDto( @@ -16,4 +18,10 @@ internal fun AuthRequestModel.toRequestSignUpDto(): RequestSignUpDto = password = password, nickname = nickname, phone = phone - ) \ No newline at end of file + ) + +internal fun BaseResponse.toBaseResponseEntity(): BaseResponseEntity = + BaseResponseEntity( + code = this.code, + message = this.message + ) diff --git a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt new file mode 100644 index 0000000..6ff71fe --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt @@ -0,0 +1,37 @@ +package com.sopt.now.data.repositoryimpl + +import com.sopt.now.data.api.AuthService +import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.data.dto.toBaseResponseEntity +import com.sopt.now.data.dto.toRequestLoginDto +import com.sopt.now.data.dto.toRequestSignUpDto +import com.sopt.now.data.repositoryimpl.extension.getResponseErrorMessage +import com.sopt.now.data.repositoryimpl.extension.handleThrowable +import com.sopt.now.domain.entity.ApiError +import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.BaseResponseEntity +import com.sopt.now.domain.repository.AuthRepository +import retrofit2.Response + +class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { + override suspend fun login(authData: AuthRequestModel): Result = + runCatching { + val response: Response> = authService.login(authData.toRequestLoginDto()) + if (response.isSuccessful) { + response.headers()["location"]?.toInt() + } + else{ + throw ApiError(response.getResponseErrorMessage()) + } + } + + override suspend fun signUp(authData: AuthRequestModel): Result { + return runCatching { + authService.signUp(authData.toRequestSignUpDto()).toBaseResponseEntity() + }.onFailure { throwable -> + return throwable.handleThrowable() + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt similarity index 76% rename from app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt rename to app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt index d01a796..17e06e1 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/request/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt @@ -1,4 +1,4 @@ -package com.sopt.now.domain.entity.request +package com.sopt.now.domain.entity data class AuthRequestModel( diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt index ee06166..89ac3d5 100644 --- a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt @@ -1,10 +1,9 @@ package com.sopt.now.domain.repository -import com.sopt.now.data.dto.response.BaseResponse -import com.sopt.now.domain.entity.request.AuthRequestModel -import retrofit2.Response +import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.BaseResponseEntity interface AuthRepository { - suspend fun logIn(authData: AuthRequestModel): Result>> - suspend fun signUp(authData: AuthRequestModel): Result>> + suspend fun login(authData: AuthRequestModel): Result + suspend fun signUp(authData: AuthRequestModel): Result } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt index 44e6d7e..9e4c006 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt @@ -1,12 +1,10 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.dto.response.BaseResponse -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel import com.sopt.now.domain.repository.AuthRepository -import retrofit2.Response class LogInUseCase(private val authRepository: AuthRepository) { - suspend operator fun invoke(request: AuthRequestModel):Result>> = - authRepository.logIn(request) + suspend operator fun invoke(request: AuthRequestModel):Result = + authRepository.login(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index 7fcccc2..9dc86d5 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -1,12 +1,11 @@ package com.sopt.now.domain.usecase -import com.sopt.now.data.dto.response.BaseResponse -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.BaseResponseEntity import com.sopt.now.domain.repository.AuthRepository -import retrofit2.Response class SignUpUseCase(private val authRepository: AuthRepository) { - suspend operator fun invoke(request: AuthRequestModel):Result>> = + suspend operator fun invoke(request: AuthRequestModel):Result = authRepository.signUp(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt index 502e916..7f45e47 100644 --- a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt +++ b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt @@ -3,7 +3,7 @@ package com.sopt.now.ui import SignUpViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.sopt.now.data.AuthRepositoryImpl +import com.sopt.now.data.repositoryimpl.AuthRepositoryImpl import com.sopt.now.data.api.ServicePool import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.domain.usecase.SignUpUseCase diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index 7fdd29e..c07a910 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -8,7 +8,7 @@ import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityLoginBinding -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity import com.sopt.now.ui.ViewModelFactory diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index 055cdc9..c4d49f7 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.ui.model.User -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN @@ -22,30 +22,19 @@ class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { viewModelScope.launch { logInUseCase(request) .onSuccess { response -> - val userId = response.headers()[LOCATION].toString() - if (response.isSuccessful) - _loginState.value = - UiState.Success( - User( - request.authenticationId, - request.password, - "", - "", - userId = userId - ) + _loginState.value = + UiState.Success( + User( + request.authenticationId, + request.password, + "", + "", + userId = response.toString() ) - else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString(MESSAGE) - _loginState.value = UiState.Error(errorMessage.toString()) - } + ) } .onFailure { e -> - if (e is HttpException) { - _loginState.value = UiState.Error(e.message()) - } else { - _loginState.value = UiState.Error(FAIL_ERROR.format(LOGIN)) - } + _loginState.value = UiState.Error(e.message.toString()) } } } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 5955186..fbbdbc5 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -7,7 +7,7 @@ import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivitySignUpBinding -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index b0e3893..0f4b123 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -2,7 +2,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.ui.model.User -import com.sopt.now.domain.entity.request.AuthRequestModel +import com.sopt.now.domain.entity.AuthRequestModel import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch @@ -18,22 +18,15 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { viewModelScope.launch { signUpUseCase(request) .onSuccess { response -> - if (response.isSuccessful) { - _signUpState.value = - UiState.Success( - User( - request.authenticationId, - request.password, - request.nickname, - request.phone, - response.headers()[LOCATION].toString() - ) + _signUpState.value = + UiState.Success( + User( + request.authenticationId, + request.password, + request.nickname, + request.phone, ) - } else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString(MESSAGE) - _signUpState.value = UiState.Error(errorMessage.toString()) - } + ) } .onFailure { e -> if (e is HttpException) { @@ -44,9 +37,4 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { } } } - - companion object { - private const val LOCATION = "location" - private const val MESSAGE = "message" - } } From f4bb9c195fb7c6d8a54ed1ee310da4dfeb446bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 05:35:21 +0900 Subject: [PATCH 21/32] =?UTF-8?q?[Mod]=20#18=20AuthRequestModel=20->UserEn?= =?UTF-8?q?tity=20=EC=9D=B4=EB=A6=84=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/sopt/now/data/dto/Mapper.kt | 6 +++--- .../now/data/repositoryimpl/AuthRepositoryImpl.kt | 6 +++--- .../entity/{AuthRequestModel.kt => UserEntity.kt} | 2 +- .../sopt/now/domain/repository/AuthRepository.kt | 6 +++--- .../com/sopt/now/domain/usecase/LogInUseCase.kt | 4 ++-- .../com/sopt/now/domain/usecase/SignUpUseCase.kt | 4 ++-- .../java/com/sopt/now/ui/login/LoginActivity.kt | 4 ++-- .../java/com/sopt/now/ui/login/LoginViewModel.kt | 13 ++----------- .../java/com/sopt/now/ui/signup/SignUpActivity.kt | 4 ++-- .../java/com/sopt/now/ui/signup/SignUpViewModel.kt | 5 ++--- 10 files changed, 22 insertions(+), 32 deletions(-) rename app/src/main/java/com/sopt/now/domain/entity/{AuthRequestModel.kt => UserEntity.kt} (83%) diff --git a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt index b3d1a87..97ba034 100644 --- a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt +++ b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt @@ -3,16 +3,16 @@ package com.sopt.now.data.dto import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.dto.response.BaseResponse -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity -internal fun AuthRequestModel.toRequestLoginDto(): RequestLoginDto = +internal fun UserEntity.toRequestLoginDto(): RequestLoginDto = RequestLoginDto( authenticationId = authenticationId, password = password ) -internal fun AuthRequestModel.toRequestSignUpDto(): RequestSignUpDto = +internal fun UserEntity.toRequestSignUpDto(): RequestSignUpDto = RequestSignUpDto( authenticationId = authenticationId, password = password, diff --git a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt index 6ff71fe..f57a1d7 100644 --- a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt @@ -8,13 +8,13 @@ import com.sopt.now.data.dto.toRequestSignUpDto import com.sopt.now.data.repositoryimpl.extension.getResponseErrorMessage import com.sopt.now.data.repositoryimpl.extension.handleThrowable import com.sopt.now.domain.entity.ApiError -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity import com.sopt.now.domain.repository.AuthRepository import retrofit2.Response class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { - override suspend fun login(authData: AuthRequestModel): Result = + override suspend fun login(authData: UserEntity): Result = runCatching { val response: Response> = authService.login(authData.toRequestLoginDto()) if (response.isSuccessful) { @@ -25,7 +25,7 @@ class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository } } - override suspend fun signUp(authData: AuthRequestModel): Result { + override suspend fun signUp(authData: UserEntity): Result { return runCatching { authService.signUp(authData.toRequestSignUpDto()).toBaseResponseEntity() }.onFailure { throwable -> diff --git a/app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt b/app/src/main/java/com/sopt/now/domain/entity/UserEntity.kt similarity index 83% rename from app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt rename to app/src/main/java/com/sopt/now/domain/entity/UserEntity.kt index 17e06e1..9fd5287 100644 --- a/app/src/main/java/com/sopt/now/domain/entity/AuthRequestModel.kt +++ b/app/src/main/java/com/sopt/now/domain/entity/UserEntity.kt @@ -1,7 +1,7 @@ package com.sopt.now.domain.entity -data class AuthRequestModel( +data class UserEntity( val authenticationId: String, val password: String, val nickname: String, diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt index 89ac3d5..a74b630 100644 --- a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt @@ -1,9 +1,9 @@ package com.sopt.now.domain.repository -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity interface AuthRepository { - suspend fun login(authData: AuthRequestModel): Result - suspend fun signUp(authData: AuthRequestModel): Result + suspend fun login(authData: UserEntity): Result + suspend fun signUp(authData: UserEntity): Result } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt index 9e4c006..55bbb8e 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt @@ -1,10 +1,10 @@ package com.sopt.now.domain.usecase -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.repository.AuthRepository class LogInUseCase(private val authRepository: AuthRepository) { - suspend operator fun invoke(request: AuthRequestModel):Result = + suspend operator fun invoke(request: UserEntity):Result = authRepository.login(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index 9dc86d5..f7c8a00 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -1,11 +1,11 @@ package com.sopt.now.domain.usecase -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity import com.sopt.now.domain.repository.AuthRepository class SignUpUseCase(private val authRepository: AuthRepository) { - suspend operator fun invoke(request: AuthRequestModel):Result = + suspend operator fun invoke(request: UserEntity):Result = authRepository.signUp(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index c07a910..de29d92 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -8,7 +8,7 @@ import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityLoginBinding -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity import com.sopt.now.ui.ViewModelFactory @@ -85,7 +85,7 @@ class LoginActivity : BindingActivity(R.layout.activity_lo } private fun getLoginRequest() = - AuthRequestModel( + UserEntity( authenticationId = binding.etLoginId.text.toString(), password = binding.etLoginPassword.text.toString(), nickname = "", diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index c4d49f7..c5ca408 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -4,20 +4,16 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.ui.model.User -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.usecase.LogInUseCase -import com.sopt.now.util.StringNetworkError.FAIL_ERROR -import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import org.json.JSONObject -import retrofit2.HttpException class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { private val _loginState = MutableLiveData>() val loginState = _loginState - fun login(request: AuthRequestModel) { + fun login(request: UserEntity) { _loginState.value = UiState.Loading viewModelScope.launch { logInUseCase(request) @@ -38,10 +34,5 @@ class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { } } } - - companion object { - private const val MESSAGE = "message" - private const val LOCATION = "location" - } } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index fbbdbc5..05d58b2 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -7,7 +7,7 @@ import androidx.activity.viewModels import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivitySignUpBinding -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER @@ -61,7 +61,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ finish() } - private fun getSignUpRequestDto() = AuthRequestModel( + private fun getSignUpRequestDto() = UserEntity( authenticationId = binding.etSignupId.text.toString(), password = binding.etSignupPassword.text.toString(), nickname = binding.etSignupNickname.text.toString(), diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 0f4b123..8a31b7f 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -2,18 +2,17 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.now.ui.model.User -import com.sopt.now.domain.entity.AuthRequestModel +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import org.json.JSONObject import retrofit2.HttpException class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() val signUpState = _signUpState - fun signUp(request: AuthRequestModel) { + fun signUp(request: UserEntity) { _signUpState.value = UiState.Loading viewModelScope.launch { signUpUseCase(request) From 32a8c17772a98e82157b428a9a6946e7e56bd290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 06:14:24 +0900 Subject: [PATCH 22/32] =?UTF-8?q?[Feat]=20#18=20getinfo=20domain=EA=B3=BC?= =?UTF-8?q?=20data=20=EC=98=81=EC=97=AD=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sopt/now/data/api/ApiFactory.kt | 1 - .../main/java/com/sopt/now/data/api/AuthService.kt | 8 ++++++++ .../main/java/com/sopt/now/data/api/InfoService.kt | 13 ------------- app/src/main/java/com/sopt/now/data/dto/Mapper.kt | 8 ++++++++ .../now/data/repositoryimpl/AuthRepositoryImpl.kt | 13 ++++++++++--- .../sopt/now/domain/repository/AuthRepository.kt | 3 ++- .../sopt/now/domain/usecase/GetUserInfoUseCase.kt | 9 +++++++++ 7 files changed, 37 insertions(+), 18 deletions(-) delete mode 100644 app/src/main/java/com/sopt/now/data/api/InfoService.kt create mode 100644 app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt diff --git a/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt b/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt index d68d00d..d51a0a9 100644 --- a/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt +++ b/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt @@ -22,5 +22,4 @@ object ApiFactory { object ServicePool { val authService: AuthService by lazy { create() } - val infoService: InfoService by lazy { create() } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/api/AuthService.kt b/app/src/main/java/com/sopt/now/data/api/AuthService.kt index 89ab5be..6c341a3 100644 --- a/app/src/main/java/com/sopt/now/data/api/AuthService.kt +++ b/app/src/main/java/com/sopt/now/data/api/AuthService.kt @@ -3,8 +3,11 @@ package com.sopt.now.data.api import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.data.dto.response.ResponseInfoDto import retrofit2.Response import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header import retrofit2.http.POST interface AuthService { @@ -18,4 +21,9 @@ interface AuthService { suspend fun login( @Body request: RequestLoginDto, ): Response> + + @GET("/member/info") + suspend fun getUserInfo( + @Header("memberid") userId: String, + ): Response } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/api/InfoService.kt b/app/src/main/java/com/sopt/now/data/api/InfoService.kt deleted file mode 100644 index bc63bf2..0000000 --- a/app/src/main/java/com/sopt/now/data/api/InfoService.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.sopt.now.data.api - -import com.sopt.now.data.dto.response.ResponseInfoDto -import retrofit2.Response -import retrofit2.http.GET -import retrofit2.http.Header - -interface InfoService { - @GET("/member/info") - suspend fun getUserInfo( - @Header("memberid") userId: String, - ): Response -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt index 97ba034..b122e5d 100644 --- a/app/src/main/java/com/sopt/now/data/dto/Mapper.kt +++ b/app/src/main/java/com/sopt/now/data/dto/Mapper.kt @@ -3,6 +3,7 @@ package com.sopt.now.data.dto import com.sopt.now.data.dto.request.RequestLoginDto import com.sopt.now.data.dto.request.RequestSignUpDto import com.sopt.now.data.dto.response.BaseResponse +import com.sopt.now.data.dto.response.ResponseInfoDto import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity @@ -25,3 +26,10 @@ internal fun BaseResponse.toBaseResponseEntity(): BaseResponseEntity = code = this.code, message = this.message ) + +internal fun ResponseInfoDto.UserData.toUserEntity(): UserEntity = UserEntity( + authenticationId = authenticationId, + password = "", + nickname = nickname, + phone = phone +) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt index f57a1d7..af437ef 100644 --- a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.sopt.now.data.dto.response.BaseResponse import com.sopt.now.data.dto.toBaseResponseEntity import com.sopt.now.data.dto.toRequestLoginDto import com.sopt.now.data.dto.toRequestSignUpDto +import com.sopt.now.data.dto.toUserEntity import com.sopt.now.data.repositoryimpl.extension.getResponseErrorMessage import com.sopt.now.data.repositoryimpl.extension.handleThrowable import com.sopt.now.domain.entity.ApiError @@ -16,11 +17,11 @@ import retrofit2.Response class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { override suspend fun login(authData: UserEntity): Result = runCatching { - val response: Response> = authService.login(authData.toRequestLoginDto()) + val response: Response> = + authService.login(authData.toRequestLoginDto()) if (response.isSuccessful) { response.headers()["location"]?.toInt() - } - else{ + } else { throw ApiError(response.getResponseErrorMessage()) } } @@ -33,5 +34,11 @@ class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository } } + override suspend fun getMemberInfo(userid: String): Result = + runCatching { + authService.getUserInfo(userid).body()?.data?.toUserEntity() + ?: throw Exception("data is null") + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt index a74b630..aff40dc 100644 --- a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt @@ -1,9 +1,10 @@ package com.sopt.now.domain.repository -import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity +import com.sopt.now.domain.entity.UserEntity interface AuthRepository { suspend fun login(authData: UserEntity): Result suspend fun signUp(authData: UserEntity): Result + suspend fun getMemberInfo(userid:String): Result } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt new file mode 100644 index 0000000..ecb3947 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt @@ -0,0 +1,9 @@ +package com.sopt.now.domain.usecase + +import com.sopt.now.domain.entity.UserEntity +import com.sopt.now.domain.repository.AuthRepository + +class GetUserInfoUseCase(private val authRepository: AuthRepository) { + suspend operator fun invoke(userid: String): Result = + authRepository.getMemberInfo(userid) +} \ No newline at end of file From d91ec8a26aca807e464acf11c8fff1e35c1ea652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 06:16:13 +0900 Subject: [PATCH 23/32] =?UTF-8?q?[Feat]=20#18=20getinfo=20repository=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/ui/ViewModelFactory.kt | 34 +++++++++++++------ .../java/com/sopt/now/ui/main/MainActivity.kt | 4 +-- .../com/sopt/now/ui/main/MainViewModel.kt | 29 +++++----------- .../ui/main/profile/MainProfileFragment.kt | 4 +-- 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt index 7f45e47..34acbcc 100644 --- a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt +++ b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt @@ -1,27 +1,39 @@ package com.sopt.now.ui -import SignUpViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.sopt.now.data.repositoryimpl.AuthRepositoryImpl import com.sopt.now.data.api.ServicePool +import com.sopt.now.domain.usecase.GetUserInfoUseCase import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.ui.login.LoginViewModel +import com.sopt.now.ui.main.MainViewModel +import com.sopt.now.ui.signup.SignUpViewModel class ViewModelFactory : ViewModelProvider.Factory { override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(SignUpViewModel::class.java)) { - val repository = AuthRepositoryImpl(ServicePool.authService) - val signUpUseCase = SignUpUseCase(repository) - return SignUpViewModel(signUpUseCase) as T - } else if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { - val repository = AuthRepositoryImpl(ServicePool.authService) - val loginUseCase = LogInUseCase(repository) - return LoginViewModel(loginUseCase) as T + when (modelClass) { + SignUpViewModel::class.java -> { + val repository = AuthRepositoryImpl(ServicePool.authService) + val signUpUseCase = SignUpUseCase(repository) + return SignUpViewModel(signUpUseCase) as T + } - } else { - throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") + LoginViewModel::class.java -> { + val repository = AuthRepositoryImpl(ServicePool.authService) + val loginUseCase = LogInUseCase(repository) + return LoginViewModel(loginUseCase) as T + } + + MainViewModel::class.java -> { + val repository = AuthRepositoryImpl(ServicePool.authService) + val getUserInfoUseCase = GetUserInfoUseCase(repository) + return MainViewModel(getUserInfoUseCase) as T + } + + else -> throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") } + } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt index a0d0b53..26242fa 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityMainBinding +import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.ui.main.home.MainHomeFragment import com.sopt.now.ui.main.profile.MainProfileFragment @@ -16,7 +17,7 @@ import com.sopt.now.util.getSafeParcelable import com.sopt.now.util.toast class MainActivity : BindingActivity(R.layout.activity_main) { - private val viewModel by viewModels() + private val viewModel: MainViewModel by viewModels { ViewModelFactory() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -38,7 +39,6 @@ class MainActivity : BindingActivity(R.layout.activity_main viewModel.setMyProfile(state.data) viewModel.updateProfileWithMyProfile() } - is UiState.Error -> toast(state.errorMessage) } diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt index 948a748..1595a1d 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt @@ -3,24 +3,23 @@ package com.sopt.now.ui.main import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.data.api.ServicePool.infoService import com.sopt.now.data.model.Profile -import com.sopt.now.ui.model.User +import com.sopt.now.domain.entity.UserEntity +import com.sopt.now.domain.usecase.GetUserInfoUseCase import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import org.json.JSONObject import retrofit2.HttpException -class MainViewModel : ViewModel() { +class MainViewModel(private val getUserInfoUseCase: GetUserInfoUseCase) : ViewModel() { private val _userData = MutableLiveData>() val userData = _userData - private val _myInfo = MutableLiveData>() + private val _myInfo = MutableLiveData>() val myInfo = _myInfo - private val _myProfile = MutableLiveData() + private val _myProfile = MutableLiveData() val myProfile = _myProfile init { @@ -34,18 +33,8 @@ class MainViewModel : ViewModel() { fun getInfo(userid: String) { _myInfo.value = UiState.Loading viewModelScope.launch { - runCatching { - infoService.getUserInfo(userid) - }.onSuccess { response -> - if (response.isSuccessful) { - val user = response.body()?.data - _myInfo.value = UiState.Success(user?.toUser() ?: User("", "", "", "")) - } else { - val errorMessage = - JSONObject(response.errorBody()?.string()).getString("message") - _myInfo.value = UiState.Error(errorMessage.toString()) - } - + getUserInfoUseCase(userid).onSuccess { response -> + _myInfo.value = UiState.Success(response) }.onFailure { e -> if (e is HttpException) { _myInfo.value = UiState.Error(e.message()) @@ -56,14 +45,14 @@ class MainViewModel : ViewModel() { } } - fun setMyProfile(data: User) { + fun setMyProfile(data: UserEntity) { _myProfile.value = data } fun updateProfileWithMyProfile() { _userData.value = listOf( - Profile(_myProfile.value!!.nickname, _myProfile.value!!.phoneNumber), + Profile(_myProfile.value!!.nickname, _myProfile.value!!.phone), Profile("주효은", "INFP"), Profile("이유빈", "ENFP"), Profile("김민우", "ISTP"), diff --git a/app/src/main/java/com/sopt/now/ui/main/profile/MainProfileFragment.kt b/app/src/main/java/com/sopt/now/ui/main/profile/MainProfileFragment.kt index c6a7268..a31564a 100644 --- a/app/src/main/java/com/sopt/now/ui/main/profile/MainProfileFragment.kt +++ b/app/src/main/java/com/sopt/now/ui/main/profile/MainProfileFragment.kt @@ -19,10 +19,10 @@ class MainProfileFragment : private fun initLayout() { with(binding) { - tvMainIdContent.text = viewModel.myProfile.value?.id + tvMainIdContent.text = viewModel.myProfile.value?.authenticationId tvMainPasswordContent.text = viewModel.myProfile.value?.password tvMainNickname.text = getString(R.string.main_welcome).format(viewModel.myProfile.value?.nickname) - tvMainNumberContent.text = viewModel.myProfile.value?.phoneNumber + tvMainNumberContent.text = viewModel.myProfile.value?.phone } } } \ No newline at end of file From 94ace2d506304fb05013d34cb33d423f5b77bc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 06:16:37 +0900 Subject: [PATCH 24/32] =?UTF-8?q?[Chore]=20#18=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/data/dto/response/ResponseInfoDto.kt | 5 +---- .../java/com/sopt/now/ui/signup/SignUpActivity.kt | 1 - .../java/com/sopt/now/ui/signup/SignUpViewModel.kt | 13 +++++-------- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt index 703dfec..57c6c03 100644 --- a/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseInfoDto.kt @@ -1,6 +1,5 @@ package com.sopt.now.data.dto.response -import com.sopt.now.ui.model.User import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -21,8 +20,6 @@ data class ResponseInfoDto( val nickname: String, @SerialName("phone") val phone: String, - ) { - fun toUser() = User(id = authenticationId, password = "", nickname = nickname, phoneNumber = phone) - } + ) } diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index 05d58b2..a364ad5 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -1,6 +1,5 @@ package com.sopt.now.ui.signup -import SignUpViewModel import android.content.Intent import android.os.Bundle import androidx.activity.viewModels diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 8a31b7f..1e94f59 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,12 +1,13 @@ +package com.sopt.now.ui.signup + import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.ui.model.User import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.usecase.SignUpUseCase +import com.sopt.now.ui.model.User import com.sopt.now.util.UiState import kotlinx.coroutines.launch -import retrofit2.HttpException class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() @@ -16,7 +17,7 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { _signUpState.value = UiState.Loading viewModelScope.launch { signUpUseCase(request) - .onSuccess { response -> + .onSuccess { _signUpState.value = UiState.Success( User( @@ -28,11 +29,7 @@ class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { ) } .onFailure { e -> - if (e is HttpException) { - _signUpState.value = UiState.Error(e.message()) - } else { - _signUpState.value = UiState.Error(e.message.toString()) - } + _signUpState.value = UiState.Error(e.message.toString()) } } } From 46038a3c8bb8278bc780e76af7944eac5ab3786e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AA=85=EC=84=9D?= Date: Sat, 15 Jun 2024 06:49:08 +0900 Subject: [PATCH 25/32] =?UTF-8?q?[Chore]=20#18=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20viewmodel=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/ui/login/LoginViewModel.kt | 3 ++- .../main/java/com/sopt/now/ui/main/MainViewModel.kt | 13 +++++++------ .../java/com/sopt/now/ui/signup/SignUpViewModel.kt | 3 ++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index c5ca408..27ecedd 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -1,5 +1,6 @@ package com.sopt.now.ui.login +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -11,7 +12,7 @@ import kotlinx.coroutines.launch class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { private val _loginState = MutableLiveData>() - val loginState = _loginState + val loginState : LiveData> = _loginState fun login(request: UserEntity) { _loginState.value = UiState.Loading diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt index 1595a1d..611a8c4 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt @@ -1,5 +1,6 @@ package com.sopt.now.ui.main +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -13,14 +14,14 @@ import kotlinx.coroutines.launch import retrofit2.HttpException class MainViewModel(private val getUserInfoUseCase: GetUserInfoUseCase) : ViewModel() { - private val _userData = MutableLiveData>() - val userData = _userData + private val _userData: MutableLiveData> = MutableLiveData() + val userData: LiveData> = _userData - private val _myInfo = MutableLiveData>() - val myInfo = _myInfo + private val _myInfo: MutableLiveData> = MutableLiveData() + val myInfo: LiveData> = _myInfo - private val _myProfile = MutableLiveData() - val myProfile = _myProfile + private val _myProfile: MutableLiveData = MutableLiveData() + val myProfile: LiveData = _myProfile init { _userData.value = diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 1e94f59..2dec148 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -1,5 +1,6 @@ package com.sopt.now.ui.signup +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -11,7 +12,7 @@ import kotlinx.coroutines.launch class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { private val _signUpState = MutableLiveData>() - val signUpState = _signUpState + val signUpState:LiveData> = _signUpState fun signUp(request: UserEntity) { _signUpState.value = UiState.Loading From a2f41dfda9a303dc1b1cf24a3f71a665fa3d21ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Tue, 18 Jun 2024 17:37:17 +0900 Subject: [PATCH 26/32] =?UTF-8?q?[Add]=20#18=20hilt=20gradle=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +++++++ build.gradle | 1 + 2 files changed, 8 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 511113c..5f50630 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,9 @@ plugins { id 'org.jetbrains.kotlin.android' id "kotlin-parcelize" id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0' + id 'com.google.dagger.hilt.android' + id 'kotlin-kapt' + id 'kotlin-android' } Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) @@ -66,4 +69,8 @@ dependencies { // define any required OkHttp artifacts without version implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") + + //hlit + implementation 'com.google.dagger:hilt-android:2.51' + kapt 'com.google.dagger:hilt-compiler:2.51.1' } \ No newline at end of file diff --git a/build.gradle b/build.gradle index be6601c..5100030 100644 --- a/build.gradle +++ b/build.gradle @@ -3,4 +3,5 @@ plugins { id 'com.android.application' version '8.3.1' apply false id 'com.android.library' version '8.3.1' apply false id 'org.jetbrains.kotlin.android' version '1.9.0' apply false + id 'com.google.dagger.hilt.android' version '2.51' apply false } \ No newline at end of file From 60b29dcb6ff352b2d896bd6ae4dcc05ed7fd3f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:18:08 +0900 Subject: [PATCH 27/32] =?UTF-8?q?[Add]=20#18=20HiltAndroidApp=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20app=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + app/src/main/java/com/sopt/now/NowSopt.kt | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 app/src/main/java/com/sopt/now/NowSopt.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11c7435..3a58c0d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ Date: Wed, 19 Jun 2024 16:18:34 +0900 Subject: [PATCH 28/32] =?UTF-8?q?[Add]=20#18=20Api,=20DataModule=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/data/api/ApiModule.kt | 33 +++++++++++++++++++ .../java/com/sopt/now/data/di/DataModule.kt | 21 ++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 app/src/main/java/com/sopt/now/data/api/ApiModule.kt create mode 100644 app/src/main/java/com/sopt/now/data/di/DataModule.kt diff --git a/app/src/main/java/com/sopt/now/data/api/ApiModule.kt b/app/src/main/java/com/sopt/now/data/api/ApiModule.kt new file mode 100644 index 0000000..780c559 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/api/ApiModule.kt @@ -0,0 +1,33 @@ +package com.sopt.now.data.api + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.sopt.now.BuildConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ApiModule { + private const val CONTENT_TYPE = "application/json" + + @Singleton + @Provides + fun provideRetrofit(): Retrofit { + return Retrofit.Builder() + .baseUrl(BuildConfig.AUTH_BASE_URL) + .addConverterFactory(Json.asConverterFactory(CONTENT_TYPE.toMediaType())) + .build() + } + + @Singleton + @Provides + fun provideAuthService(retrofit: Retrofit): AuthService { + return retrofit.create(AuthService::class.java) + } +} diff --git a/app/src/main/java/com/sopt/now/data/di/DataModule.kt b/app/src/main/java/com/sopt/now/data/di/DataModule.kt new file mode 100644 index 0000000..050f9af --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/di/DataModule.kt @@ -0,0 +1,21 @@ +package com.sopt.now.data.di + +import com.sopt.now.data.repositoryimpl.AuthRepositoryImpl +import com.sopt.now.domain.repository.AuthRepository +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 DataModule { + + @Binds + @Singleton + abstract fun bindAuthRepository( + authRepositoryImpl: AuthRepositoryImpl + ): AuthRepository +} From b374cf0a893679a06c1668b16b40ece8bccf9a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:18:52 +0900 Subject: [PATCH 29/32] =?UTF-8?q?[Mod]=20#18=20hilt=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt | 8 ++++++-- .../com/sopt/now/domain/usecase/GetUserInfoUseCase.kt | 5 ++++- .../java/com/sopt/now/domain/usecase/LogInUseCase.kt | 7 +++++-- .../java/com/sopt/now/domain/usecase/SignUpUseCase.kt | 7 +++++-- app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt | 5 +++-- .../main/java/com/sopt/now/ui/login/LoginViewModel.kt | 9 +++++++-- app/src/main/java/com/sopt/now/ui/main/MainActivity.kt | 5 +++-- app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt | 7 ++++++- .../main/java/com/sopt/now/ui/signup/SignUpActivity.kt | 5 +++-- .../main/java/com/sopt/now/ui/signup/SignUpViewModel.kt | 9 +++++++-- 10 files changed, 49 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt index af437ef..ded6088 100644 --- a/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/repositoryimpl/AuthRepositoryImpl.kt @@ -9,12 +9,16 @@ import com.sopt.now.data.dto.toUserEntity import com.sopt.now.data.repositoryimpl.extension.getResponseErrorMessage import com.sopt.now.data.repositoryimpl.extension.handleThrowable import com.sopt.now.domain.entity.ApiError -import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity +import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.repository.AuthRepository import retrofit2.Response +import javax.inject.Inject -class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { +class AuthRepositoryImpl @Inject constructor( + private val authService: AuthService +) : + AuthRepository { override suspend fun login(authData: UserEntity): Result = runCatching { val response: Response> = diff --git a/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt index ecb3947..d2cc6d9 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/GetUserInfoUseCase.kt @@ -2,8 +2,11 @@ package com.sopt.now.domain.usecase import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.repository.AuthRepository +import javax.inject.Inject -class GetUserInfoUseCase(private val authRepository: AuthRepository) { +class GetUserInfoUseCase @Inject constructor( + private val authRepository: AuthRepository +) { suspend operator fun invoke(userid: String): Result = authRepository.getMemberInfo(userid) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt index 55bbb8e..60844fd 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/LogInUseCase.kt @@ -2,9 +2,12 @@ package com.sopt.now.domain.usecase import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.repository.AuthRepository +import javax.inject.Inject -class LogInUseCase(private val authRepository: AuthRepository) { +class LogInUseCase @Inject constructor( + private val authRepository: AuthRepository +) { - suspend operator fun invoke(request: UserEntity):Result = + suspend operator fun invoke(request: UserEntity): Result = authRepository.login(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt index f7c8a00..3189cb8 100644 --- a/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt +++ b/app/src/main/java/com/sopt/now/domain/usecase/SignUpUseCase.kt @@ -3,9 +3,12 @@ package com.sopt.now.domain.usecase import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.entity.BaseResponseEntity import com.sopt.now.domain.repository.AuthRepository +import javax.inject.Inject -class SignUpUseCase(private val authRepository: AuthRepository) { +class SignUpUseCase @Inject constructor( + private val authRepository: AuthRepository +) { - suspend operator fun invoke(request: UserEntity):Result = + suspend operator fun invoke(request: UserEntity): Result = authRepository.signUp(request) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt index de29d92..1db6f3f 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt @@ -11,15 +11,16 @@ import com.sopt.now.databinding.ActivityLoginBinding import com.sopt.now.domain.entity.UserEntity import com.sopt.now.ui.main.MainActivity import com.sopt.now.ui.signup.SignUpActivity -import com.sopt.now.ui.ViewModelFactory import com.sopt.now.util.BindingActivity import com.sopt.now.util.UiState import com.sopt.now.util.getSafeParcelable import com.sopt.now.util.toast +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class LoginActivity : BindingActivity(R.layout.activity_login) { private lateinit var resultLauncher: ActivityResultLauncher - private val viewModel: LoginViewModel by viewModels { ViewModelFactory() } + private val viewModel: LoginViewModel by viewModels() private lateinit var user: User override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt index 27ecedd..070f498 100644 --- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt @@ -8,11 +8,16 @@ import com.sopt.now.ui.model.User import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.usecase.LogInUseCase import com.sopt.now.util.UiState +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class LoginViewModel(private val logInUseCase: LogInUseCase) : ViewModel() { +@HiltViewModel +class LoginViewModel @Inject constructor( + private val logInUseCase: LogInUseCase +) : ViewModel() { private val _loginState = MutableLiveData>() - val loginState : LiveData> = _loginState + val loginState: LiveData> = _loginState fun login(request: UserEntity) { _loginState.value = UiState.Loading diff --git a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt index 26242fa..c0d601d 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt @@ -6,7 +6,6 @@ import androidx.fragment.app.Fragment import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivityMainBinding -import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.ui.main.home.MainHomeFragment import com.sopt.now.ui.main.profile.MainProfileFragment @@ -15,9 +14,11 @@ import com.sopt.now.util.BindingActivity import com.sopt.now.util.UiState import com.sopt.now.util.getSafeParcelable import com.sopt.now.util.toast +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : BindingActivity(R.layout.activity_main) { - private val viewModel: MainViewModel by viewModels { ViewModelFactory() } + private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt index 611a8c4..492df15 100644 --- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt @@ -10,10 +10,15 @@ import com.sopt.now.domain.usecase.GetUserInfoUseCase import com.sopt.now.util.StringNetworkError.FAIL_ERROR import com.sopt.now.util.StringNetworkError.LOGIN import com.sopt.now.util.UiState +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import retrofit2.HttpException +import javax.inject.Inject -class MainViewModel(private val getUserInfoUseCase: GetUserInfoUseCase) : ViewModel() { +@HiltViewModel +class MainViewModel @Inject constructor( + private val getUserInfoUseCase: GetUserInfoUseCase +) : ViewModel() { private val _userData: MutableLiveData> = MutableLiveData() val userData: LiveData> = _userData diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt index a364ad5..05468fa 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpActivity.kt @@ -7,15 +7,16 @@ import com.sopt.now.R import com.sopt.now.ui.model.User import com.sopt.now.databinding.ActivitySignUpBinding import com.sopt.now.domain.entity.UserEntity -import com.sopt.now.ui.ViewModelFactory import com.sopt.now.ui.login.LoginActivity import com.sopt.now.ui.login.LoginActivity.Companion.TAG_USER import com.sopt.now.util.BindingActivity import com.sopt.now.util.UiState import com.sopt.now.util.toast +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SignUpActivity : BindingActivity(R.layout.activity_sign_up) { - private val viewModel by viewModels { ViewModelFactory() } + private val viewModel: SignUpViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt index 2dec148..dba22c3 100644 --- a/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/ui/signup/SignUpViewModel.kt @@ -8,11 +8,16 @@ import com.sopt.now.domain.entity.UserEntity import com.sopt.now.domain.usecase.SignUpUseCase import com.sopt.now.ui.model.User import com.sopt.now.util.UiState +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class SignUpViewModel(private val signUpUseCase: SignUpUseCase) : ViewModel() { +@HiltViewModel +class SignUpViewModel @Inject constructor( + private val signUpUseCase: SignUpUseCase +) : ViewModel() { private val _signUpState = MutableLiveData>() - val signUpState:LiveData> = _signUpState + val signUpState: LiveData> = _signUpState fun signUp(request: UserEntity) { _signUpState.value = UiState.Loading From df0c370f3f6f68c548e2b382230ec13375dc4cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:19:09 +0900 Subject: [PATCH 30/32] =?UTF-8?q?[Del]=20#18=20hilt=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=20=ED=9B=84=20=EC=95=88=EC=93=B0=EB=8A=94=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/now/data/api/ApiFactory.kt | 25 ------------ .../java/com/sopt/now/ui/ViewModelFactory.kt | 39 ------------------- 2 files changed, 64 deletions(-) delete mode 100644 app/src/main/java/com/sopt/now/data/api/ApiFactory.kt delete mode 100644 app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt diff --git a/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt b/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt deleted file mode 100644 index d51a0a9..0000000 --- a/app/src/main/java/com/sopt/now/data/api/ApiFactory.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.sopt.now.data.api - -import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import com.sopt.now.BuildConfig -import com.sopt.now.data.api.ApiFactory.create -import kotlinx.serialization.json.Json -import okhttp3.MediaType.Companion.toMediaType -import retrofit2.Retrofit - -object ApiFactory { - private const val BASE_URL = BuildConfig.AUTH_BASE_URL - - val retrofit: Retrofit by lazy { - Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .build() - } - - inline fun create(): T = retrofit.create(T::class.java) -} - -object ServicePool { - val authService: AuthService by lazy { create() } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt b/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt deleted file mode 100644 index 34acbcc..0000000 --- a/app/src/main/java/com/sopt/now/ui/ViewModelFactory.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.sopt.now.ui - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.sopt.now.data.repositoryimpl.AuthRepositoryImpl -import com.sopt.now.data.api.ServicePool -import com.sopt.now.domain.usecase.GetUserInfoUseCase -import com.sopt.now.domain.usecase.LogInUseCase -import com.sopt.now.domain.usecase.SignUpUseCase -import com.sopt.now.ui.login.LoginViewModel -import com.sopt.now.ui.main.MainViewModel -import com.sopt.now.ui.signup.SignUpViewModel - -class ViewModelFactory : ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - when (modelClass) { - SignUpViewModel::class.java -> { - val repository = AuthRepositoryImpl(ServicePool.authService) - val signUpUseCase = SignUpUseCase(repository) - return SignUpViewModel(signUpUseCase) as T - } - - LoginViewModel::class.java -> { - val repository = AuthRepositoryImpl(ServicePool.authService) - val loginUseCase = LogInUseCase(repository) - return LoginViewModel(loginUseCase) as T - } - - MainViewModel::class.java -> { - val repository = AuthRepositoryImpl(ServicePool.authService) - val getUserInfoUseCase = GetUserInfoUseCase(repository) - return MainViewModel(getUserInfoUseCase) as T - } - - else -> throw IllegalArgumentException("Failed to create ViewModel: ${modelClass.name}") - } - - } -} \ No newline at end of file From e2a65aa29efdfac8cec68fcd254650c3f19e9ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:19:43 +0900 Subject: [PATCH 31/32] =?UTF-8?q?[Mod]=20#18=20ApiModule=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/sopt/now/data/{api => di}/ApiModule.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename app/src/main/java/com/sopt/now/data/{api => di}/ApiModule.kt (92%) diff --git a/app/src/main/java/com/sopt/now/data/api/ApiModule.kt b/app/src/main/java/com/sopt/now/data/di/ApiModule.kt similarity index 92% rename from app/src/main/java/com/sopt/now/data/api/ApiModule.kt rename to app/src/main/java/com/sopt/now/data/di/ApiModule.kt index 780c559..3495f7e 100644 --- a/app/src/main/java/com/sopt/now/data/api/ApiModule.kt +++ b/app/src/main/java/com/sopt/now/data/di/ApiModule.kt @@ -1,7 +1,8 @@ -package com.sopt.now.data.api +package com.sopt.now.data.di import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.sopt.now.BuildConfig +import com.sopt.now.data.api.AuthService import dagger.Module import dagger.Provides import dagger.hilt.InstallIn From 256d629cd5b394fb86ba621641b26ed22c15c7ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=86=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=A5=E1=86=A8?= <75840431+cacaocoffee@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:10:26 +0900 Subject: [PATCH 32/32] [Mod] #18 kapt -> ksp --- app/build.gradle | 4 ++-- build.gradle | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5f50630..c59d17b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,8 +4,8 @@ plugins { id "kotlin-parcelize" id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0' id 'com.google.dagger.hilt.android' - id 'kotlin-kapt' id 'kotlin-android' + id 'com.google.devtools.ksp' } Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) @@ -72,5 +72,5 @@ dependencies { //hlit implementation 'com.google.dagger:hilt-android:2.51' - kapt 'com.google.dagger:hilt-compiler:2.51.1' + ksp 'com.google.dagger:hilt-compiler:2.51.1' } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5100030..e62ab31 100644 --- a/build.gradle +++ b/build.gradle @@ -4,4 +4,5 @@ plugins { id 'com.android.library' version '8.3.1' apply false id 'org.jetbrains.kotlin.android' version '1.9.0' apply false id 'com.google.dagger.hilt.android' version '2.51' apply false + id 'com.google.devtools.ksp' version '1.9.0-1.0.12' apply false } \ No newline at end of file