From d01c659ff161b254c429368f314e7e030fae695b Mon Sep 17 00:00:00 2001 From: Pearl Date: Tue, 24 Dec 2024 20:42:29 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat(#7):=20domain=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=EC=97=90=EC=84=9C=20User=20=EB=AA=A8=EB=8D=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20user=20=EA=B4=80=EB=A0=A8=20UseCase=20interface=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User model은 data class 로, 각 유즈케이스 목록은 다음과 같다. - CreateUserUseCase - DeleteUserUseCase - GetUserUseCase - UpdateUserUseCase 해당 유즈케이스들은 suspend로 중단 함수를 통해 비동기 처리 가능하게 선언했으며, invoke 함수를 통해 클래스 인스턴스를 함수호출처럼 사용할 수 있게 만들었다. 또한, 각 유즈케이스의 결과를 알아야하는 것들은 Result 을 반환하도록 만들었다. --- app/src/main/java/com/umc/phrase/domain/model/User.kt | 5 ++++- .../umc/phrase/domain/usecase/user/CreateUserUseCase.kt | 7 +++++++ .../umc/phrase/domain/usecase/user/DeleteUserUseCase.kt | 7 +++++++ .../com/umc/phrase/domain/usecase/user/GetUserUseCase.kt | 5 ++++- .../umc/phrase/domain/usecase/user/UpdateUserUseCase.kt | 7 +++++++ 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt create mode 100644 app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt create mode 100644 app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt diff --git a/app/src/main/java/com/umc/phrase/domain/model/User.kt b/app/src/main/java/com/umc/phrase/domain/model/User.kt index fa16db4..304dfd1 100644 --- a/app/src/main/java/com/umc/phrase/domain/model/User.kt +++ b/app/src/main/java/com/umc/phrase/domain/model/User.kt @@ -1,5 +1,8 @@ package com.umc.phrase.domain.model data class User ( - val name: String, + val id: Long, + val nickname: String, + val accountId: String, + val profileImgUrl: String? ) \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt new file mode 100644 index 0000000..685fa77 --- /dev/null +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt @@ -0,0 +1,7 @@ +package com.umc.phrase.domain.usecase.user + +import com.umc.phrase.domain.model.User + +interface CreateUserUseCase { + suspend operator fun invoke(user: User): Result +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt new file mode 100644 index 0000000..1ce85ad --- /dev/null +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt @@ -0,0 +1,7 @@ +package com.umc.phrase.domain.usecase.user + +import com.umc.phrase.domain.model.User + +interface DeleteUserUseCase { + suspend operator fun invoke(user: User): Result +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt index 91c55c3..756b5f9 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt @@ -1,4 +1,7 @@ package com.umc.phrase.domain.usecase.user -class GetUserUseCase { +import com.umc.phrase.domain.model.User + +interface GetUserUseCase { + suspend operator fun invoke(id: Long): User? } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt new file mode 100644 index 0000000..61983f6 --- /dev/null +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt @@ -0,0 +1,7 @@ +package com.umc.phrase.domain.usecase.user + +import com.umc.phrase.domain.model.User + +interface UpdateUserUseCase{ + suspend operator fun invoke(user: User): Result +} \ No newline at end of file From c9c18a5b282f0d55fbcc33fd644db787ddf129d9 Mon Sep 17 00:00:00 2001 From: Pearl Date: Tue, 24 Dec 2024 21:01:13 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat(#7):=20User=20Repository=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20DeleteUserUseCase,=20GetUserUseCase=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 DeleteUserUseCase: user 판별을 id:Long으로 변경 GetUserUseCase: 리턴 타입을 Result 로 변경하여 성공, 실패 여부를 추가했다. 성공 시 필요한 user 정보와 성공 상태를 같이 주고, 실패랄 경우 User? 에의해 null 이 들어오면서 실패 처리가 되는 것이다. Result 타입을 모두 반환하게 하여 명확한 에러 핸들링, 미래 확장성 대비, 코드의 일관성을 추구했다. --- .../java/com/umc/phrase/domain/repository/UserRepository.kt | 6 ++++++ .../com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt | 2 +- .../com/umc/phrase/domain/usecase/user/GetUserUseCase.kt | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt index 328e8a7..51bbd2f 100644 --- a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt @@ -1,4 +1,10 @@ package com.umc.phrase.domain.repository +import com.umc.phrase.domain.model.User + interface UserRepository { + suspend fun createUser(user: User): Result + suspend fun deleteUser(id: Long): Result + suspend fun getUser(id: Long) : Result + suspend fun updateUser(user: User): Result } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt index 1ce85ad..9c9c728 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt @@ -3,5 +3,5 @@ package com.umc.phrase.domain.usecase.user import com.umc.phrase.domain.model.User interface DeleteUserUseCase { - suspend operator fun invoke(user: User): Result + suspend operator fun invoke(id: Long): Result } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt index 756b5f9..c5ec277 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt @@ -3,5 +3,5 @@ package com.umc.phrase.domain.usecase.user import com.umc.phrase.domain.model.User interface GetUserUseCase { - suspend operator fun invoke(id: Long): User? + suspend operator fun invoke(id: Long): Result } \ No newline at end of file From 3eb94d0a143af46931526a2d24c6bc62d7088576 Mon Sep 17 00:00:00 2001 From: Pearl Date: Sat, 18 Jan 2025 14:04:08 +0900 Subject: [PATCH 3/6] =?UTF-8?q?:sparkles:=20feat(#7):=20DataResource=20?= =?UTF-8?q?=EC=84=A0=EC=96=B8=20=EB=B0=8F=20UserRepository=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/umc/phrase/domain/DataResource.kt | 13 +++++++++++++ .../umc/phrase/domain/repository/UserRepository.kt | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/umc/phrase/domain/DataResource.kt diff --git a/app/src/main/java/com/umc/phrase/domain/DataResource.kt b/app/src/main/java/com/umc/phrase/domain/DataResource.kt new file mode 100644 index 0000000..8502a16 --- /dev/null +++ b/app/src/main/java/com/umc/phrase/domain/DataResource.kt @@ -0,0 +1,13 @@ +package com.umc.phrase.domain + +sealed class DataResource { + class Success(val data: T) : DataResource() + class Error(val throwable: Throwable) : DataResource() + class Loading(val data: T? = null) : DataResource() + + companion object { + fun success(data: T): Success = Success(data) + fun error(throwable: Throwable): Error = Error(throwable) + fun loading(data: T? = null): Loading = Loading(data) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt index 51bbd2f..2514bda 100644 --- a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt @@ -1,10 +1,12 @@ package com.umc.phrase.domain.repository +import com.umc.phrase.domain.DataResource import com.umc.phrase.domain.model.User +import kotlinx.coroutines.flow.Flow interface UserRepository { - suspend fun createUser(user: User): Result - suspend fun deleteUser(id: Long): Result - suspend fun getUser(id: Long) : Result - suspend fun updateUser(user: User): Result + suspend fun createUser(user: User): Flow> + suspend fun deleteUser(id: Long): Flow> + suspend fun getUser(id: Long) : Flow> + suspend fun updateUser(user: User): Flow> } \ No newline at end of file From 34781839aa9f776670b7398e432e116461416c0d Mon Sep 17 00:00:00 2001 From: Pearl Date: Sat, 18 Jan 2025 14:29:25 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20CreateUserUseCase=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20suspend=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/umc/phrase/domain/repository/UserRepository.kt | 8 ++++---- .../phrase/domain/usecase/user/CreateUserUseCase.kt | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt index 2514bda..decf7ad 100644 --- a/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/umc/phrase/domain/repository/UserRepository.kt @@ -5,8 +5,8 @@ import com.umc.phrase.domain.model.User import kotlinx.coroutines.flow.Flow interface UserRepository { - suspend fun createUser(user: User): Flow> - suspend fun deleteUser(id: Long): Flow> - suspend fun getUser(id: Long) : Flow> - suspend fun updateUser(user: User): Flow> + fun createUser(user: User): Flow> + fun deleteUser(id: Long): Flow> + fun getUser(id: Long) : Flow> + fun updateUser(user: User): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt index 685fa77..e8075e8 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/CreateUserUseCase.kt @@ -1,7 +1,13 @@ package com.umc.phrase.domain.usecase.user +import com.umc.phrase.domain.DataResource import com.umc.phrase.domain.model.User +import com.umc.phrase.domain.repository.UserRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject -interface CreateUserUseCase { - suspend operator fun invoke(user: User): Result +class CreateUserUseCase @Inject constructor( + private val userRepository: UserRepository +){ + operator fun invoke(user: User): Flow> = userRepository.createUser(user) } \ No newline at end of file From 3531195071885f05ec21387850cafbacd4d86276 Mon Sep 17 00:00:00 2001 From: Pearl Date: Sat, 18 Jan 2025 14:36:12 +0900 Subject: [PATCH 5/6] =?UTF-8?q?:sparkles:=20feat(#7):=20UserUseCase=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../phrase/domain/usecase/user/DeleteUserUseCase.kt | 11 ++++++++--- .../umc/phrase/domain/usecase/user/GetUserUseCase.kt | 10 ++++++++-- .../phrase/domain/usecase/user/UpdateUserUseCase.kt | 10 ++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt index 9c9c728..578f8a2 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/DeleteUserUseCase.kt @@ -1,7 +1,12 @@ package com.umc.phrase.domain.usecase.user -import com.umc.phrase.domain.model.User +import com.umc.phrase.domain.DataResource +import com.umc.phrase.domain.repository.UserRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject -interface DeleteUserUseCase { - suspend operator fun invoke(id: Long): Result +class DeleteUserUseCase @Inject constructor( + private val userRepository: UserRepository +){ + operator fun invoke(id: Long): Flow> = userRepository.deleteUser(id) } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt index c5ec277..9f8d014 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/GetUserUseCase.kt @@ -1,7 +1,13 @@ package com.umc.phrase.domain.usecase.user +import com.umc.phrase.domain.DataResource import com.umc.phrase.domain.model.User +import com.umc.phrase.domain.repository.UserRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject -interface GetUserUseCase { - suspend operator fun invoke(id: Long): Result +class GetUserUseCase @Inject constructor( + private val userRepository: UserRepository +){ + operator fun invoke(id: Long): Flow> = userRepository.getUser(id) } \ No newline at end of file diff --git a/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt b/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt index 61983f6..254072a 100644 --- a/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt +++ b/app/src/main/java/com/umc/phrase/domain/usecase/user/UpdateUserUseCase.kt @@ -1,7 +1,13 @@ package com.umc.phrase.domain.usecase.user +import com.umc.phrase.domain.DataResource import com.umc.phrase.domain.model.User +import com.umc.phrase.domain.repository.UserRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject -interface UpdateUserUseCase{ - suspend operator fun invoke(user: User): Result +class UpdateUserUseCase @Inject constructor( + private val userRepository: UserRepository +){ + operator fun invoke(user: User): Flow> = userRepository.updateUser(user) } \ No newline at end of file From 4b5bc67c84123dc6e6cff531a470771d7a3cb3f9 Mon Sep 17 00:00:00 2001 From: Pearl Date: Sat, 18 Jan 2025 14:42:56 +0900 Subject: [PATCH 6/6] =?UTF-8?q?:sparkles:=20feat(#7):=20User=20data=20clas?= =?UTF-8?q?s=20=ED=99=95=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/umc/phrase/domain/model/User.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/umc/phrase/domain/model/User.kt b/app/src/main/java/com/umc/phrase/domain/model/User.kt index 304dfd1..a5b49ee 100644 --- a/app/src/main/java/com/umc/phrase/domain/model/User.kt +++ b/app/src/main/java/com/umc/phrase/domain/model/User.kt @@ -5,4 +5,11 @@ data class User ( val nickname: String, val accountId: String, val profileImgUrl: String? +) + +data class UserDetail( + val user: User, + val followers: Long, + val followings: Long, + val comment: String? ) \ No newline at end of file