From c9cc50a1f180b9138d559f0f7fec2561ed3ec2ec Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Fri, 10 May 2024 19:08:23 +0900 Subject: [PATCH] [refactor] #7 auth repository --- .../data/repository/AuthRepositoryImpl.kt | 89 ++++++++++--------- .../org/sopt/domain/repo/AuthRepository.kt | 2 +- .../src/main/java/org/sopt/model/Base.kt | 1 - .../java/org/sopt/model/exception/ApiError.kt | 5 ++ .../network/model/response/base/ApiError.kt | 15 ---- .../model/response/base/BaseResponse.kt | 2 - 6 files changed, 53 insertions(+), 61 deletions(-) create mode 100644 core/model/src/main/java/org/sopt/model/exception/ApiError.kt delete mode 100644 core/network/src/main/java/org/sopt/network/model/response/base/ApiError.kt diff --git a/core/data/src/main/java/org/sopt/data/repository/AuthRepositoryImpl.kt b/core/data/src/main/java/org/sopt/data/repository/AuthRepositoryImpl.kt index c183633..2563b62 100644 --- a/core/data/src/main/java/org/sopt/data/repository/AuthRepositoryImpl.kt +++ b/core/data/src/main/java/org/sopt/data/repository/AuthRepositoryImpl.kt @@ -4,13 +4,12 @@ import kotlinx.serialization.json.Json import org.sopt.domain.repo.AuthRepository import org.sopt.model.Base import org.sopt.model.Member +import org.sopt.model.exception.ApiError import org.sopt.network.api.AuthApi import org.sopt.network.model.request.RequestPatchPasswordDto import org.sopt.network.model.request.RequestPostSigninDto import org.sopt.network.model.request.RequestPostSignupDto -import org.sopt.network.model.response.base.ApiError import org.sopt.network.model.response.base.BaseResponse -import org.sopt.network.model.response.base.toCoreModel import org.sopt.network.model.response.base.toCoreModelNothingType import org.sopt.network.model.response.toCoreModel import retrofit2.HttpException @@ -19,8 +18,8 @@ import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( private val authApi: AuthApi, ) : AuthRepository { - override suspend fun postSignup(member: Member, pw: String): Result> { - val result = runCatching { + override suspend fun postSignup(member: Member, pw: String): Result> = + runCatching { authApi.postSignup( RequestPostSignupDto( authenticationId = member.id, @@ -29,59 +28,65 @@ class AuthRepositoryImpl @Inject constructor( phone = member.phone ) ) + }.handleResult { + it.toCoreModelNothingType() } - return handleResult(result) - } - override suspend fun getUserinfo(): Result = runCatching { - authApi.getUserinfo().data!!.toCoreModel() + + override suspend fun getUserinfo(): Result> = runCatching { + authApi.getUserinfo() + }.handleResult { + Base(data = it.data?.toCoreModel(), message = it.message) } - override suspend fun postSignin(id: String, pw: String): Result> { - val result = runCatching { - authApi.postSignin( - RequestPostSigninDto( - id, - pw - ) + override suspend fun postSignin(id: String, pw: String): Result> = runCatching { + authApi.postSignin( + RequestPostSigninDto( + authenticationId = id, + password = pw ) - } - return handleResult(result) + ) + }.handleResult { + it.toCoreModelNothingType() } + override suspend fun patchPassword( previousPassword: String, newPassword: String, newPasswordVerification: String, - ): Result> { - val result = runCatching { - authApi.patchPassword( - RequestPatchPasswordDto( - previousPassword = previousPassword, - newPassword = newPassword, - newPasswordVerification = newPasswordVerification - ) + ): Result> = runCatching { + authApi.patchPassword( + RequestPatchPasswordDto( + previousPassword = previousPassword, + newPassword = newPassword, + newPasswordVerification = newPasswordVerification ) - } - return handleResult(result) + ) + }.handleResult { + it.toCoreModelNothingType() } - private fun handleResult(result: Result>) = - when (val exception = result.exceptionOrNull()) { - null -> result.map { - it.toCoreModelNothingType() - } - is HttpException -> { - val json = exception.response()?.errorBody()?.string() - val api = Json.decodeFromString(json!!) - Result.success( - api.toCoreModel() - ) - } + private inline fun Result>.handleResult(action: (BaseResponse) -> Base) = + this.mapCatching { + action(it) + }.recoverCatching { exception -> + when (exception) { + is HttpException -> { + val json = exception.response()?.errorBody()?.string() + if (json != null) { + val api = Json.decodeFromString>(json) + val apiError = ApiError(message = api.message) + throw apiError + } else { + throw exception + } + } - else -> { - Result.failure(exception) + else -> { + throw exception + } } } -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/org/sopt/domain/repo/AuthRepository.kt b/core/domain/src/main/java/org/sopt/domain/repo/AuthRepository.kt index 94ce8de..92c1ed7 100644 --- a/core/domain/src/main/java/org/sopt/domain/repo/AuthRepository.kt +++ b/core/domain/src/main/java/org/sopt/domain/repo/AuthRepository.kt @@ -6,7 +6,7 @@ import org.sopt.model.Member interface AuthRepository { suspend fun postSignup(member: Member, pw: String): Result> - suspend fun getUserinfo(): Result + suspend fun getUserinfo(): Result> suspend fun postSignin(id: String, pw: String): Result> diff --git a/core/model/src/main/java/org/sopt/model/Base.kt b/core/model/src/main/java/org/sopt/model/Base.kt index 003976a..354b335 100644 --- a/core/model/src/main/java/org/sopt/model/Base.kt +++ b/core/model/src/main/java/org/sopt/model/Base.kt @@ -1,7 +1,6 @@ package org.sopt.model data class Base( - val code: Int, val data: T? = null, val message: String, ) diff --git a/core/model/src/main/java/org/sopt/model/exception/ApiError.kt b/core/model/src/main/java/org/sopt/model/exception/ApiError.kt new file mode 100644 index 0000000..87cd9e7 --- /dev/null +++ b/core/model/src/main/java/org/sopt/model/exception/ApiError.kt @@ -0,0 +1,5 @@ +package org.sopt.model.exception + +data class ApiError( + override val message: String, +): Exception() \ No newline at end of file diff --git a/core/network/src/main/java/org/sopt/network/model/response/base/ApiError.kt b/core/network/src/main/java/org/sopt/network/model/response/base/ApiError.kt deleted file mode 100644 index 19b39de..0000000 --- a/core/network/src/main/java/org/sopt/network/model/response/base/ApiError.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.sopt.network.model.response.base - -import kotlinx.serialization.Serializable -import org.sopt.model.Base - -@Serializable -data class ApiError( - val code: Int, - val message: String, -) - -fun ApiError.toCoreModel(): Base = Base( - code = this.code, - message = this.message -) diff --git a/core/network/src/main/java/org/sopt/network/model/response/base/BaseResponse.kt b/core/network/src/main/java/org/sopt/network/model/response/base/BaseResponse.kt index e71ca43..e2284ec 100644 --- a/core/network/src/main/java/org/sopt/network/model/response/base/BaseResponse.kt +++ b/core/network/src/main/java/org/sopt/network/model/response/base/BaseResponse.kt @@ -11,12 +11,10 @@ data class BaseResponse( ) fun BaseResponse.toCoreModel(): Base = Base( - code = this.code, data = this.data, message = this.message ) fun BaseResponse.toCoreModelNothingType(): Base = Base( - code = this.code, message = this.message ) \ No newline at end of file