diff --git a/project/Projects/App/Resources/GoogleService-Info.plist b/project/Projects/App/Resources/GoogleService-Info.plist
index e902d244..35260fe6 100644
--- a/project/Projects/App/Resources/GoogleService-Info.plist
+++ b/project/Projects/App/Resources/GoogleService-Info.plist
@@ -15,16 +15,16 @@
STORAGE_BUCKET
swm-3idiots.appspot.com
IS_ADS_ENABLED
-
+
IS_ANALYTICS_ENABLED
-
+
IS_APPINVITE_ENABLED
-
+
IS_GCM_ENABLED
-
+
IS_SIGNIN_ENABLED
-
+
GOOGLE_APP_ID
1:740246202578:ios:d5e59f4f2116f92342250b
-
\ No newline at end of file
+
diff --git a/project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DataAssembly.swift b/project/Projects/App/Sources/DIAssembly/DataAssembly.swift
similarity index 80%
rename from project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DataAssembly.swift
rename to project/Projects/App/Sources/DIAssembly/DataAssembly.swift
index 6bfcee48..5e13e8c9 100644
--- a/project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DataAssembly.swift
+++ b/project/Projects/App/Sources/DIAssembly/DataAssembly.swift
@@ -9,6 +9,7 @@ import Foundation
import Domain
import Repository
import DataSource
+import RootFeature
import Swinject
@@ -57,5 +58,15 @@ public struct DataAssembly: Assembly {
container.register(RecruitmentPostRepository.self) { _ in
return DefaultRecruitmentPostRepository()
}
+
+ // MARK: 토큰 전송 레포지토리
+ container.register(NotificationTokenTransferRepository.self) { _ in
+ return DefaultNotificationTokenTransferRepository()
+ }
+
+ // MARK: 토큰 획득 레포지토리
+ container.register(NotificationTokenRepository.self) { _ in
+ return RootFeature.FCMTokenRepository()
+ }
}
}
diff --git a/project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DomainAssembly.swift b/project/Projects/App/Sources/DIAssembly/DomainAssembly.swift
similarity index 67%
rename from project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DomainAssembly.swift
rename to project/Projects/App/Sources/DIAssembly/DomainAssembly.swift
index 9e70eede..0115cb24 100644
--- a/project/Projects/Presentation/Feature/Base/Sources/DIAssembly/DomainAssembly.swift
+++ b/project/Projects/App/Sources/DIAssembly/DomainAssembly.swift
@@ -17,22 +17,19 @@ public struct DomainAssembly: Assembly {
public func assemble(container: Container) {
// MARK: UseCase
+ container.register(NotificationTokenUseCase.self) { _ in
+ return DefaultNotificationTokenUseCase()
+ }
+ .inObjectScope(.container)
+
container.register(AuthInputValidationUseCase.self) { resolver in
let repository = resolver.resolve(AuthInputValidationRepository.self)!
return DefaultAuthInputValidationUseCase(repository: repository)
}
- container.register(AuthUseCase.self) { resolver in
- let authRepository = resolver.resolve(AuthRepository.self)!
- let userProfileRepository = resolver.resolve(UserProfileRepository.self)!
- let userInfoLocalRepository = resolver.resolve(UserInfoLocalRepository.self)!
-
- return DefaultAuthUseCase(
- authRepository: authRepository,
- userProfileRepository: userProfileRepository,
- userInfoLocalRepository: userInfoLocalRepository
- )
+ container.register(AuthUseCase.self) { _ in
+ return DefaultAuthUseCase()
}
container.register(CenterProfileUseCase.self) { resolver in
@@ -61,14 +58,8 @@ public struct DomainAssembly: Assembly {
)
}
- container.register(SettingScreenUseCase.self) { resolver in
- let authRepository = resolver.resolve(AuthRepository.self)!
- let userInfoLocalRepository = resolver.resolve(UserInfoLocalRepository.self)!
-
- return DefaultSettingUseCase(
- authRepository: authRepository,
- userInfoLocalRepository: userInfoLocalRepository
- )
+ container.register(SettingScreenUseCase.self) { _ in
+ return DefaultSettingUseCase()
}
container.register(CenterCertificateUseCase.self) { resolver in
@@ -80,9 +71,5 @@ public struct DomainAssembly: Assembly {
userInfoLocalRepository: userInfoLocalRepository
)
}
-
- container.register(NotificationTokenManage.self) { resolver in
- DefaultNotificationTokenManage()
- }
}
}
diff --git a/project/Projects/App/Sources/DIAssembly/LoggerAssembly.swift b/project/Projects/App/Sources/DIAssembly/LoggerAssembly.swift
index 3ee4f9aa..2772a77b 100644
--- a/project/Projects/App/Sources/DIAssembly/LoggerAssembly.swift
+++ b/project/Projects/App/Sources/DIAssembly/LoggerAssembly.swift
@@ -8,7 +8,6 @@
import Foundation
import RootFeature
import AuthFeature
-import CenterFeature
import PresentationCore
import CenterMainPageFeature
diff --git a/project/Projects/App/Sources/RemoteNotification/FCMService.swift b/project/Projects/App/Sources/RemoteNotification/FCMService.swift
deleted file mode 100644
index a1a3a021..00000000
--- a/project/Projects/App/Sources/RemoteNotification/FCMService.swift
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// FCMService.swift
-// Idle-iOS
-//
-// Created by choijunios on 9/24/24.
-//
-
-import Foundation
-import BaseFeature
-import PresentationCore
-import Domain
-import Core
-
-import FirebaseMessaging
-
-class FCMService: NSObject {
-
- @Injected var notificationTokenManageUseCase: NotificationTokenManage
-
- override public init() {
- super.init()
- Messaging.messaging().delegate = self
-
-
- // Notification설정
- subscribeNotification()
- }
-
- func subscribeNotification() {
-
- NotificationCenter.default.addObserver(
- forName: .requestTransportTokenToServer,
- object: nil,
- queue: nil) { [weak self] _ in
-
- guard let self else { return }
-
- if let token = Messaging.messaging().fcmToken {
-
- notificationTokenManageUseCase.setNotificationToken(
- token: token) { result in
-
- print("FCMService 토큰 전송 \(result ? "완료" : "실패")")
- }
- }
- }
-
- NotificationCenter.default.addObserver(
- forName: .requestDeleteTokenFromServer,
- object: nil,
- queue: nil) { [weak self] _ in
-
- guard let self else { return }
-
- notificationTokenManageUseCase.deleteNotificationToken(completion: { result in
- print("FCMService 토큰 삭제 \(result ? "완료" : "실패")")
- })
- }
- }
-}
-
-extension FCMService: MessagingDelegate {
-
- func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
-
- if let fcmToken {
-
- print("FCM토큰: \(fcmToken)")
-
- notificationTokenManageUseCase.setNotificationToken(token: fcmToken) { isSuccess in
-
- print(isSuccess ? "토큰 전송 성공" : "토큰 전송 실패")
- }
- }
- }
-}
-
-
-extension FCMService: UNUserNotificationCenterDelegate {
-
- /// 앱이 포그라운드에 있는 경우, 노티페이케이션이 도착하기만 하면 호출된다.
- public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
-
- }
-
- /// 앱이 백그라운드에 있는 경우, 유저가 노티피케이션을 통해 액션을 선택한 경우 호출
- public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
-
- print(response.notification.request.content.userInfo)
- }
-}
diff --git a/project/Projects/App/Sources/SceneDelegate.swift b/project/Projects/App/Sources/SceneDelegate.swift
index 7474990c..95ea1ebf 100644
--- a/project/Projects/App/Sources/SceneDelegate.swift
+++ b/project/Projects/App/Sources/SceneDelegate.swift
@@ -23,9 +23,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
return coodinator
}()
- // FCMService
- var fcmService: FCMService!
-
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
@@ -41,9 +38,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
DataAssembly(),
DomainAssembly(),
])
-
- // FCMService
- fcmService = FCMService()
// Start AppCoodinator
appCoordinator.start()
diff --git a/project/Projects/Data/DataSource/API/BaseAPI.swift b/project/Projects/Data/DataSource/API/BaseAPI.swift
index 6e0e2cb7..3c16127e 100644
--- a/project/Projects/Data/DataSource/API/BaseAPI.swift
+++ b/project/Projects/Data/DataSource/API/BaseAPI.swift
@@ -16,6 +16,7 @@ public enum APIType {
case crawling_job_postings
case external(url: String)
case applys
+ case notificationToken
}
// MARK: BaseAPI
@@ -43,6 +44,8 @@ public extension BaseAPI {
baseStr += "/applys"
case .external(let url):
baseStr = url
+ case .notificationToken:
+ baseStr += "/fcm"
}
return URL(string: baseStr)!
diff --git a/project/Projects/Data/DataSource/API/NotificationTokenAPI.swift b/project/Projects/Data/DataSource/API/NotificationTokenAPI.swift
new file mode 100644
index 00000000..7be6452e
--- /dev/null
+++ b/project/Projects/Data/DataSource/API/NotificationTokenAPI.swift
@@ -0,0 +1,62 @@
+//
+// NotificationTokenAPI.swift
+// DataSource
+//
+// Created by choijunios on 10/8/24.
+//
+
+import Foundation
+import Moya
+
+public enum NotificationTokenAPI {
+ case saveToken(deviceToken: String, userType: String)
+ case deleteToken(deviceToken: String)
+}
+
+extension NotificationTokenAPI: BaseAPI {
+
+ public var apiType: APIType {
+ .notificationToken
+ }
+
+ public var path: String {
+ switch self {
+ case .saveToken(let deviceToken, let userType):
+ "token"
+ case .deleteToken(let deviceToken):
+ "token"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .saveToken:
+ .post
+ case .deleteToken:
+ .delete
+ }
+ }
+
+ var parameterEncoding: ParameterEncoding {
+ switch self {
+ default:
+ return JSONEncoding.default
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .saveToken(let deviceToken, let userType):
+ var bodyData: [String: String] = [
+ "deviceToken": deviceToken,
+ "userType": userType
+ ]
+ return .requestParameters(parameters: bodyData, encoding: parameterEncoding)
+ case .deleteToken(let deviceToken):
+ var bodyData: [String: String] = [
+ "deviceToken": deviceToken
+ ]
+ return .requestParameters(parameters: bodyData, encoding: parameterEncoding)
+ }
+ }
+}
diff --git a/project/Projects/Data/DataSource/Service/NotificationTokenTransferService.swift b/project/Projects/Data/DataSource/Service/NotificationTokenTransferService.swift
new file mode 100644
index 00000000..1bce1ab9
--- /dev/null
+++ b/project/Projects/Data/DataSource/Service/NotificationTokenTransferService.swift
@@ -0,0 +1,17 @@
+//
+// NotificationTokenTransferService.swift
+// DataSource
+//
+// Created by choijunios on 10/8/24.
+//
+
+import Foundation
+
+public class NotificationTokenTransferService: BaseNetworkService {
+
+ public init() { }
+
+ public override init(keyValueStore: KeyValueStore) {
+ super.init(keyValueStore: keyValueStore)
+ }
+}
diff --git a/project/Projects/Data/Repository/Cache/CacheRepository.swift b/project/Projects/Data/Repository/CacheRepository.swift
similarity index 100%
rename from project/Projects/Data/Repository/Cache/CacheRepository.swift
rename to project/Projects/Data/Repository/CacheRepository.swift
diff --git a/project/Projects/Data/Repository/Auth/DefaultAuthInputValidationRepository.swift b/project/Projects/Data/Repository/DefaultAuthInputValidationRepository.swift
similarity index 51%
rename from project/Projects/Data/Repository/Auth/DefaultAuthInputValidationRepository.swift
rename to project/Projects/Data/Repository/DefaultAuthInputValidationRepository.swift
index 0cc4734b..1f68a9e6 100644
--- a/project/Projects/Data/Repository/Auth/DefaultAuthInputValidationRepository.swift
+++ b/project/Projects/Data/Repository/DefaultAuthInputValidationRepository.swift
@@ -8,6 +8,7 @@
import Foundation
import DataSource
import Domain
+import Core
import RxSwift
@@ -18,30 +19,40 @@ public class DefaultAuthInputValidationRepository: AuthInputValidationRepository
public init() { }
- public func requestPhoneNumberAuthentication(phoneNumber: String) -> Single {
+ public func requestPhoneNumberAuthentication(phoneNumber: String) -> Single> {
- networkService
+ let dataTask = networkService
.request(api: .startPhoneNumberAuth(phoneNumber: phoneNumber), with: .plain)
- .map { _ in return () }
+ .map { _ in phoneNumber }
+
+ return convertToDomain(task: dataTask)
}
- public func authenticateAuthNumber(phoneNumber: String, authNumber: String) -> Single {
+ public func authenticateAuthNumber(phoneNumber: String, authNumber: String) -> Single> {
+
+ let dataTask = networkService.request(api: .checkAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber), with: .plain)
+ .map { _ in phoneNumber }
- networkService.request(api: .checkAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber), with: .plain)
- .map { _ in return () }
+ return convertToDomain(task: dataTask)
}
- public func requestBusinessNumberAuthentication(businessNumber: String) -> Single {
+ public func requestBusinessNumberAuthentication(businessNumber: String) -> Single> {
- networkService.requestDecodable(
+ let dataTask = networkService.requestDecodable(
api: .authenticateBusinessNumber(businessNumber: businessNumber),
with: .plain
).map { (dto: BusinessInfoDTO) in dto.toEntity() }
+
+ return convertToDomain(task: dataTask)
}
- public func requestCheckingIdDuplication(id: String) -> Single {
- networkService.request(api: .checkIdDuplication(id: id), with: .plain)
- .map { _ in return () }
+ public func requestCheckingIdDuplication(id: String) -> Single> {
+
+ let dataTask = networkService
+ .request(api: .checkIdDuplication(id: id), with: .plain)
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
}
diff --git a/project/Projects/Data/Repository/Auth/DefaultAuthRepository.swift b/project/Projects/Data/Repository/DefaultAuthRepository.swift
similarity index 60%
rename from project/Projects/Data/Repository/Auth/DefaultAuthRepository.swift
rename to project/Projects/Data/Repository/DefaultAuthRepository.swift
index 8f1244d2..d0555602 100644
--- a/project/Projects/Data/Repository/Auth/DefaultAuthRepository.swift
+++ b/project/Projects/Data/Repository/DefaultAuthRepository.swift
@@ -28,7 +28,7 @@ public extension DefaultAuthRepository {
businessNumber: String,
id: String,
password: String
- ) -> Single {
+ ) -> Single> {
let dto = CenterRegistrationDTO(
identifier: id,
@@ -40,26 +40,34 @@ public extension DefaultAuthRepository {
let data = (try? JSONEncoder().encode(dto)) ?? Data()
- return networkService.request(api: .registerCenterAccount(data: data), with: .plain)
- .map { _ in return () }
+ let dataTask = networkService.request(api: .registerCenterAccount(data: data), with: .plain)
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- func requestCenterLogin(id: String, password: String) -> Single {
- return networkService.requestDecodable(api: .centerLogin(id: id, password: password), with: .plain)
- .flatMap { [unowned self] in saveTokenToStore(token: $0) }
+ func requestCenterLogin(id: String, password: String) -> Single> {
+ let dataTask = networkService.requestDecodable(api: .centerLogin(id: id, password: password), with: .plain)
+ .flatMap { [unowned self] in
+ saveTokenToStore(token: $0)
+ }
+
+ return convertToDomain(task: dataTask)
}
- func signoutCenterAccount() -> RxSwift.Single {
- networkService
+ func signoutCenterAccount() -> Single> {
+ let dataTask = networkService
.request(api: .signoutCenterAccount, with: .withToken)
- .map { _ in }
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- func deregisterCenterAccount(reasons: [String], password: String) -> RxSwift.Single {
+ func deregisterCenterAccount(reasons: [String], password: String) -> Single> {
let reasonString = reasons.joined(separator: "|")
- return networkService
+ let dataTask = networkService
.request(
api: .deregisterCenterAccount(
reason: reasonString,
@@ -67,25 +75,33 @@ public extension DefaultAuthRepository {
),
with: .withToken
)
- .map { _ in }
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- func getCenterJoinStatus() -> RxSwift.Single {
- networkService
+ func getCenterJoinStatus() -> Single> {
+ let dataTask = networkService
.request(api: .centerJoinStatus, with: .withToken)
.map(CenterJoinStatusInfoVO.self)
+
+ return convertToDomain(task: dataTask)
}
- func requestCenterJoin() -> Single {
- networkService
+ func requestCenterJoin() -> Single> {
+ let dataTask = networkService
.request(api: .requestCenterJoin, with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- func setNewPassword(phoneNumber: String, password: String) -> Single {
- networkService
+ func setNewPassword(phoneNumber: String, password: String) -> Single> {
+ let dataTask = networkService
.request(api: .makeNewPassword(phoneNumber: phoneNumber, newPassword: password), with: .plain)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
}
@@ -93,7 +109,7 @@ public extension DefaultAuthRepository {
public extension DefaultAuthRepository {
/// 요양보호사의 경우 회원가입시 곧바로 토큰을 발급받습니다.
- func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single {
+ func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single> {
let dto = WorkerRegistrationDTO(
carerName: registerState.name,
birthYear: registerState.birthYear,
@@ -105,32 +121,37 @@ public extension DefaultAuthRepository {
let data = (try? JSONEncoder().encode(dto)) ?? Data()
- return networkService.requestDecodable(api: .registerWorkerAccount(data: data), with: .plain)
+ let dataTask = networkService.requestDecodable(api: .registerWorkerAccount(data: data), with: .plain)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
+
+ return convertToDomain(task: dataTask)
}
- func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single {
- return networkService.requestDecodable(api: .workerLogin(phoneNumber: phoneNumber, verificationNumber: authNumber), with: .plain)
+ func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single> {
+ let dataTask = networkService.requestDecodable(api: .workerLogin(phoneNumber: phoneNumber, verificationNumber: authNumber), with: .plain)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
+
+ return convertToDomain(task: dataTask)
}
- func signoutWorkerAccount() -> RxSwift.Single {
- networkService
+ func signoutWorkerAccount() -> Single> {
+ let dataTask = networkService
.request(api: .signoutWorkerAccount, with: .withToken)
- .map { _ in }
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- func deregisterWorkerAccount(reasons: [String]) -> RxSwift.Single {
+ func deregisterWorkerAccount(reasons: [String]) -> Single> {
let reasonString = reasons.joined(separator: "|")
-
- return networkService
+ let dataTask = networkService
.request(
- api: .deregisterWorkerAccount(
- reason: reasonString
- ),
+ api: .deregisterWorkerAccount(reason: reasonString),
with: .withToken
)
- .map { _ in }
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
}
diff --git a/project/Projects/Data/Repository/DefaultNotificationTokenTransferRepository.swift b/project/Projects/Data/Repository/DefaultNotificationTokenTransferRepository.swift
new file mode 100644
index 00000000..0815df2b
--- /dev/null
+++ b/project/Projects/Data/Repository/DefaultNotificationTokenTransferRepository.swift
@@ -0,0 +1,45 @@
+//
+// DefaultNotificationTokenTransferRepository.swift
+// DataSource
+//
+// Created by choijunios on 10/8/24.
+//
+
+import Foundation
+import Domain
+import DataSource
+
+
+import RxSwift
+
+public class DefaultNotificationTokenTransferRepository: NotificationTokenTransferRepository {
+
+ let transferService: NotificationTokenTransferService = .init()
+
+ public init() { }
+
+ public func sendToken(token: String, userType: UserType) -> Single> {
+
+ let userTypeString = userType == .center ? "CENTER" : "CARER"
+ let dataTask = transferService
+ .request(
+ api: .saveToken(deviceToken: token, userType: userTypeString),
+ with: .withToken
+ )
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
+ }
+
+ public func deleteToken(token: String) -> Single> {
+
+ let dataTask = transferService
+ .request(
+ api: .deleteToken(deviceToken: token),
+ with: .withToken
+ )
+ .mapToVoid()
+
+ return convertToDomain(task: dataTask)
+ }
+}
diff --git a/project/Projects/Data/Repository/RecruitmentPost/DefaultRecruitmentPostRepository.swift b/project/Projects/Data/Repository/DefaultRecruitmentPostRepository.swift
similarity index 74%
rename from project/Projects/Data/Repository/RecruitmentPost/DefaultRecruitmentPostRepository.swift
rename to project/Projects/Data/Repository/DefaultRecruitmentPostRepository.swift
index b0d5dca7..dbee1445 100644
--- a/project/Projects/Data/Repository/RecruitmentPost/DefaultRecruitmentPostRepository.swift
+++ b/project/Projects/Data/Repository/DefaultRecruitmentPostRepository.swift
@@ -13,8 +13,6 @@ import DataSource
import Moya
import RxSwift
-
-
public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
private var recruitmentPostService: RecruitmentPostService = .init()
@@ -29,132 +27,160 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
}
}
- // MARK: Center
- public func registerPost(bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single {
+ // MARK: Center
+ public func registerPost(bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single> {
let encodedData = try! JSONEncoder().encode(bundle.toDTO())
-
- return recruitmentPostService.request(api: .registerPost(postData: encodedData), with: .withToken)
+ let dataTask = recruitmentPostService.request(api: .registerPost(postData: encodedData), with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- public func getPostDetailForCenter(id: String) -> RxSwift.Single {
+ public func getPostDetailForCenter(id: String) -> RxSwift.Single> {
- recruitmentPostService.request(api: .postDetail(id: id, userType: .center), with: .withToken)
+ let dataTask = recruitmentPostService.request(api: .postDetail(id: id, userType: .center), with: .withToken)
.map(RecruitmentPostFetchDTO.self)
.map { dto in
dto.toEntity()
}
+
+ return convertToDomain(task: dataTask)
}
- public func editPostDetail(id: String, bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single {
+ public func editPostDetail(id: String, bundle: RegisterRecruitmentPostBundle) -> RxSwift.Single> {
let encodedData = try! JSONEncoder().encode(bundle.toDTO())
-
- return recruitmentPostService.request(
+ let dataTask = recruitmentPostService.request(
api: .editPost(id: id, postData: encodedData),
with: .withToken
).map { _ in () }
+
+ return convertToDomain(task: dataTask)
}
- public func getOngoingPosts() -> RxSwift.Single<[RecruitmentPostInfoForCenterVO]> {
- return recruitmentPostService.request(api: .getOnGoingPosts, with: .withToken)
+ public func getOngoingPosts() -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .getOnGoingPosts, with: .withToken)
.map(RecruitmentPostForCenterListDTO.self)
.map({ $0.jobPostings.map { $0.toVO() } })
+
+ return convertToDomain(task: dataTask)
}
- public func getClosedPosts() -> RxSwift.Single<[RecruitmentPostInfoForCenterVO]> {
- return recruitmentPostService.request(api: .getClosedPosts, with: .withToken)
+ public func getClosedPosts() -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .getClosedPosts, with: .withToken)
.map(RecruitmentPostForCenterListDTO.self)
.map({ $0.jobPostings.map { $0.toVO() } })
+
+ return convertToDomain(task: dataTask)
}
- public func getPostApplicantCount(id: String) -> RxSwift.Single {
- recruitmentPostService.request(api: .getPostApplicantCount(id: id), with: .withToken)
+ public func getPostApplicantCount(id: String) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .getPostApplicantCount(id: id), with: .withToken)
.map(PostApplicantCountDTO.self)
.map { dto in
dto.applicantCount
}
+
+ return convertToDomain(task: dataTask)
}
- public func getPostApplicantScreenData(id: String) -> RxSwift.Single {
- recruitmentPostService.request(api: .getApplicantList(id: id), with: .withToken)
+ public func getPostApplicantScreenData(id: String) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .getApplicantList(id: id), with: .withToken)
.map(PostApplicantScreenDTO.self)
.map { dto in
dto.toVO()
}
+
+ return convertToDomain(task: dataTask)
}
- public func closePost(id: String) -> RxSwift.Single {
- recruitmentPostService.request(api: .closePost(id: id), with: .withToken)
+ public func closePost(id: String) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .closePost(id: id), with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- public func removePost(id: String) -> RxSwift.Single {
- recruitmentPostService.request(api: .removePost(id: id), with: .withToken)
+ public func removePost(id: String) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(api: .removePost(id: id), with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
// MARK: Worker
- public func getNativePostDetailForWorker(id: String) -> RxSwift.Single {
- recruitmentPostService.request(
+ public func getNativePostDetailForWorker(id: String) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(
api: .postDetail(id: id, userType: .worker),
with: .withToken
)
.mapToEntity(NativeRecruitmentPostDetailDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func getWorknetPostDetailForWorker(id: String) -> RxSwift.Single {
- crawlingPostService
+ public func getWorknetPostDetailForWorker(id: String) -> RxSwift.Single> {
+ let dataTask = crawlingPostService
.request(api: .getDetail(postId: id), with: .withToken)
.mapToEntity(WorknetRecruitmentPostDetailDTO.self)
+
+ return convertToDomain(task: dataTask)
}
-
- public func getNativePostListForWorker(nextPageId: String?, requestCnt: Int = 10) -> RxSwift.Single {
-
- recruitmentPostService.request(
+ public func getNativePostListForWorker(nextPageId: String?, requestCnt: Int = 10) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(
api: .getOnGoingNativePostListForWorker(nextPageId: nextPageId, requestCnt: String(requestCnt)),
with: .withToken
)
.mapToEntity(RecruitmentPostListForWorkerDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func getNativeFavoritePostListForWorker() -> RxSwift.Single<[RecruitmentPostForWorkerRepresentable]> {
- recruitmentPostService.request(
+ public func getNativeFavoritePostListForWorker() -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(
api: .getNativeFavoritePost,
with: .withToken
)
.mapToEntity(FavoriteNativeRecruitmentPostListForWorkerDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func getWorknetFavoritePostListForWorker() -> RxSwift.Single<[RecruitmentPostForWorkerRepresentable]> {
- crawlingPostService.request(
+ public func getWorknetFavoritePostListForWorker() -> RxSwift.Single> {
+ let dataTask = crawlingPostService.request(
api: .getWorknetFavoritePost,
with: .withToken
)
.mapToEntity(FavoriteWorknetRecruitmentPostListForWorkerDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func getAppliedPostListForWorker(nextPageId: String?, requestCnt: Int) -> RxSwift.Single {
- recruitmentPostService.request(
+ public func getAppliedPostListForWorker(nextPageId: String?, requestCnt: Int) -> RxSwift.Single> {
+ let dataTask = recruitmentPostService.request(
api: .getAppliedPostListForWorker(nextPageId: nextPageId, requestCnt: String(requestCnt)),
with: .withToken
)
.mapToEntity(RecruitmentPostListForWorkerDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func getWorknetPostListForWorker(nextPageId: String?, requestCnt: Int) -> RxSwift.Single {
- crawlingPostService
+ public func getWorknetPostListForWorker(nextPageId: String?, requestCnt: Int) -> RxSwift.Single> {
+ let dataTask = crawlingPostService
.request(
api: .getPostList(nextPageId: nextPageId, requestCnt: requestCnt),
with: .withToken
)
.mapToEntity(RecruitmentPostListForWorkerDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- public func applyToPost(postId: String, method: ApplyType) -> Single {
- applyService
+ public func applyToPost(postId: String, method: ApplyType) -> Single> {
+ let dataTask = applyService
.request(
api: .applys(
jobPostingId: postId,
@@ -163,21 +189,28 @@ public class DefaultRecruitmentPostRepository: RecruitmentPostRepository {
with: .withToken
)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- public func addFavoritePost(postId: String, type: PostOriginType) -> Single {
- recruitmentPostService
+ public func addFavoritePost(postId: String, type: PostOriginType) -> Single> {
+ let dataTask = recruitmentPostService
.request(api: .addFavoritePost(id: postId, jobPostingType: type), with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
- public func removeFavoritePost(postId: String) -> Single {
- recruitmentPostService
+ public func removeFavoritePost(postId: String) -> Single> {
+ let dataTask = recruitmentPostService
.request(api: .removeFavoritePost(id: postId), with: .withToken)
.mapToVoid()
+
+ return convertToDomain(task: dataTask)
}
}
+
// MARK: 공고등록 정보를 DTO로 변환하는 영역
extension RegisterRecruitmentPostBundle {
diff --git a/project/Projects/Data/Repository/UserInfo/DefaultUserInfoLocalRepository.swift b/project/Projects/Data/Repository/DefaultUserInfoLocalRepository.swift
similarity index 100%
rename from project/Projects/Data/Repository/UserInfo/DefaultUserInfoLocalRepository.swift
rename to project/Projects/Data/Repository/DefaultUserInfoLocalRepository.swift
diff --git a/project/Projects/Data/Repository/UserInfo/DefaultUserProfileRepository.swift b/project/Projects/Data/Repository/DefaultUserProfileRepository.swift
similarity index 57%
rename from project/Projects/Data/Repository/UserInfo/DefaultUserProfileRepository.swift
rename to project/Projects/Data/Repository/DefaultUserProfileRepository.swift
index 4e50fc2b..bc395462 100644
--- a/project/Projects/Data/Repository/UserInfo/DefaultUserProfileRepository.swift
+++ b/project/Projects/Data/Repository/DefaultUserProfileRepository.swift
@@ -18,7 +18,6 @@ public class DefaultUserProfileRepository: UserProfileRepository {
let externalRequestService: ExternalRequestService
public init(_ keyValueStore: KeyValueStore? = nil) {
-
if let keyValueStore {
self.userInformationService = .init(keyValueStore: keyValueStore)
self.externalRequestService = .init(keyValueStore: keyValueStore)
@@ -29,7 +28,7 @@ public class DefaultUserProfileRepository: UserProfileRepository {
}
/// 센터프로필(최초 센터정보)를 등록합니다.
- public func registerCenterProfileForText(state: CenterProfileRegisterState) -> Single {
+ public func registerCenterProfileForText(state: CenterProfileRegisterState) -> Single> {
let dto = RegisterCenterProfileDTO(
centerName: state.centerName,
@@ -41,12 +40,14 @@ public class DefaultUserProfileRepository: UserProfileRepository {
)
let data = try! JSONEncoder().encode(dto)
- return userInformationService
+ let dataTask = userInformationService
.request(api: .registerCenterProfile(data: data), with: .withToken)
.map { _ in () }
+
+ return convertToDomain(task: dataTask)
}
- public func getCenterProfile(mode: ProfileMode) -> Single {
+ public func getCenterProfile(mode: ProfileMode) -> Single> {
var api: UserInformationAPI!
@@ -57,28 +58,34 @@ public class DefaultUserProfileRepository: UserProfileRepository {
api = .getCenterProfile(id: id)
}
- return userInformationService
+ let dataTask = userInformationService
.requestDecodable(api: api, with: .withToken)
.map { (dto: CenterProfileDTO) in dto.toEntity() }
+
+ return convertToDomain(task: dataTask)
}
- public func getCenterProfile(id: String) -> Single {
- userInformationService
+ public func getCenterProfile(id: String) -> Single> {
+ let dataTask = userInformationService
.requestDecodable(api: .getCenterProfile(id: id), with: .withToken)
.map { (dto: CenterProfileDTO) in dto.toEntity() }
+
+ return convertToDomain(task: dataTask)
}
- public func updateCenterProfileForText(phoneNumber: String, introduction: String?) -> Single {
- userInformationService
+ public func updateCenterProfileForText(phoneNumber: String, introduction: String?) -> Single> {
+ let dataTask = userInformationService
.request(api: .updateCenterProfile(
officeNumber: phoneNumber,
introduce: introduction
), with: .withToken)
.map { _ in return () }
+
+ return convertToDomain(task: dataTask)
}
/// 요양보호사 프로필 정보를 가져옵니다.
- public func getWorkerProfile(mode: ProfileMode) -> RxSwift.Single {
+ public func getWorkerProfile(mode: ProfileMode) -> Single> {
var api: UserInformationAPI!
switch mode {
@@ -88,13 +95,15 @@ public class DefaultUserProfileRepository: UserProfileRepository {
api = .getOtherWorkerProfile(id: id)
}
- return userInformationService
+ let dataTask = userInformationService
.requestDecodable(api: api, with: .withToken)
.map { (dto: CarerProfileDTO) in dto.toVO() }
+
+ return convertToDomain(task: dataTask)
}
/// 요양보호사 프로필 정보를 업데이트 합니다.
- public func updateWorkerProfile(stateObject: WorkerProfileStateObject) -> RxSwift.Single {
+ public func updateWorkerProfile(stateObject: WorkerProfileStateObject) -> Single> {
var availableValues: [String: Any] = [:]
@@ -124,42 +133,90 @@ public class DefaultUserProfileRepository: UserProfileRepository {
let encoded = try! JSONSerialization.data(withJSONObject: availableValues)
- return userInformationService
+ let dataTask = userInformationService
.request(api: .updateWorkerProfile(data: encoded), with: .withToken)
.map { _ in return () }
+
+ return convertToDomain(task: dataTask)
}
/// 이미지 업로드
- public func uploadImage(_ userType: UserType, imageInfo: ImageUploadInfo) -> Single {
- getPreSignedUrl(userType, ext: imageInfo.ext)
- .flatMap { [unowned self] dto in
- self.uploadImageToPreSignedUrl(url: dto.uploadUrl, data: imageInfo.data)
- .map { _ in (id: dto.imageId, ext: dto.imageFileExtension) }
+ public func uploadImage(_ userType: UserType, imageInfo: ImageUploadInfo) -> Single> {
+
+ let getPreSignedUrlResult = getPreSignedUrl(userType, ext: imageInfo.ext)
+ .asObservable()
+ .share()
+
+ let getPreSignedUrlSuccess = getPreSignedUrlResult.compactMap { $0.value }
+ let getPreSignedUrlFailure = getPreSignedUrlResult.compactMap { $0.error }
+
+ let uploadImageToPreSignedUrlResult = getPreSignedUrlSuccess
+ .asObservable()
+ .unretained(self)
+ .flatMap { (obj, dto) in
+ obj
+ .uploadImageToPreSignedUrl(url: dto.uploadUrl, data: imageInfo.data)
+ .map { result -> Result in
+ switch result {
+ case .success:
+ return .success(dto)
+ case .failure(let error):
+ return .failure(error)
+ }
+ }
}
- .flatMap { (id, ext) in
- self.callbackToServerForUploadImageSuccess(userType, imageId: id, ext: ext)
+ .share()
+
+ let uploadImageToPreSignedUrlSuccess = uploadImageToPreSignedUrlResult.compactMap { $0.value }
+ let uploadImageToPreSignedUrlFailure = uploadImageToPreSignedUrlResult.compactMap { $0.error }
+
+ let callbackToServerForUploadImageResult = uploadImageToPreSignedUrlSuccess
+ .unretained(self)
+ .flatMap { (obj, dto) in
+ obj.callbackToServerForUploadImageSuccess(
+ userType,
+ imageId: dto.imageId,
+ ext: dto.imageFileExtension
+ )
}
+
+ return Observable>
+ .merge(
+ callbackToServerForUploadImageResult,
+ Observable.merge(
+ getPreSignedUrlFailure.asObservable(),
+ uploadImageToPreSignedUrlFailure.asObservable()
+ ).map { error in Result.failure(error) }
+ )
+ .asSingle()
+
}
- private func getPreSignedUrl(_ userType: UserType, ext: String) -> Single {
- userInformationService
+ private func getPreSignedUrl(_ userType: UserType, ext: String) -> Single> {
+ let dataTask = userInformationService
.request(api: .getPreSignedUrl(userType: userType, imageExt: ext), with: .withToken)
.map(ProfileImageUploadInfoDTO.self)
+
+ return convertToDomain(task: dataTask)
}
- private func uploadImageToPreSignedUrl(url: String, data: Data) -> Single {
- externalRequestService
+ private func uploadImageToPreSignedUrl(url: String, data: Data) -> Single> {
+ let dataTask = externalRequestService
.request(api: .uploadImageToS3(url: url, data: data), with: .plain)
.map { _ in () }
+
+ return convertToDomain(task: dataTask)
}
- private func callbackToServerForUploadImageSuccess(_ userType: UserType, imageId: String, ext: String) -> Single {
- userInformationService
+ private func callbackToServerForUploadImageSuccess(_ userType: UserType, imageId: String, ext: String) -> Single> {
+ let dataTask = userInformationService
.request(api: .imageUploadSuccessCallback(
userType: userType,
imageId: imageId,
imageExt: ext), with: .withToken
)
.map { _ in () }
+
+ return convertToDomain(task: dataTask)
}
}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthInputValidationUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthInputValidationUseCase.swift
index 2dbb7d0c..5f047c93 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthInputValidationUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthInputValidationUseCase.swift
@@ -26,10 +26,8 @@ public class DefaultAuthInputValidationUseCase: AuthInputValidationUseCase {
// MARK: 전화번호 인증
public func requestPhoneNumberAuthentication(phoneNumber: String) -> Single> {
- convert(task: self.repository
+ repository
.requestPhoneNumberAuthentication(phoneNumber: phoneNumber)
- .map { _ in phoneNumber }
- )
}
public func checkPhoneNumberIsValid(phoneNumber: String) -> Bool {
@@ -40,18 +38,14 @@ public class DefaultAuthInputValidationUseCase: AuthInputValidationUseCase {
}
public func authenticateAuthNumber(phoneNumber: String, authNumber: String) -> Single> {
- convert(task: repository
+ repository
.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
- .map({ _ in phoneNumber })
- )
}
// MARK: 사업자 번호 인증
- public func requestBusinessNumberAuthentication(businessNumber: String) -> Single> {
- convert(task: repository
+ public func requestBusinessNumberAuthentication(businessNumber: String) -> Single> {
+ repository
.requestBusinessNumberAuthentication(businessNumber: businessNumber)
- .map({ vo in (businessNumber, vo) })
- )
}
public func checkBusinessNumberIsValid(businessNumber: String) -> Bool {
@@ -69,11 +63,9 @@ public class DefaultAuthInputValidationUseCase: AuthInputValidationUseCase {
return predicate.evaluate(with: id)
}
- public func requestCheckingIdDuplication(id: String) -> Single> {
- convert(task: repository
+ public func requestCheckingIdDuplication(id: String) -> Single> {
+ repository
.requestCheckingIdDuplication(id: id)
- .map({ _ in id })
- )
}
public func checkPasswordIsValid(password: String) -> Bool {
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthUseCase.swift
index 23b77f4b..b3c9649b 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/Auth/DefaultAuthUseCase.swift
@@ -6,26 +6,29 @@
//
import Foundation
+import Core
import RxSwift
public class DefaultAuthUseCase: AuthUseCase {
- let authRepository: AuthRepository
- let userProfileRepository: UserProfileRepository
- let userInfoLocalRepository: UserInfoLocalRepository
+ // UseCase
+ @Injected var notificationTokenUseCase: NotificationTokenUseCase
- public init(authRepository: AuthRepository, userProfileRepository: UserProfileRepository, userInfoLocalRepository: UserInfoLocalRepository) {
- self.authRepository = authRepository
- self.userProfileRepository = userProfileRepository
- self.userInfoLocalRepository = userInfoLocalRepository
- }
+ // Repository
+ @Injected var authRepository: AuthRepository
+ @Injected var userProfileRepository: UserProfileRepository
+ @Injected var userInfoLocalRepository: UserInfoLocalRepository
+
+ public init() { }
// 센터 회원가입 실행
public func registerCenterAccount(registerState: CenterRegisterState) -> Single> {
- let task = authRepository.requestRegisterCenterAccount(
+ // #1. 회원가입 실행
+ authRepository
+ .requestRegisterCenterAccount(
managerName: registerState.name,
phoneNumber: registerState.phoneNumber,
businessNumber: registerState.businessNumber,
@@ -33,56 +36,103 @@ public class DefaultAuthUseCase: AuthUseCase {
password: registerState.password
)
.map { [userInfoLocalRepository] _ in
+ // #2. 유저정보 로컬에 저장
userInfoLocalRepository.updateUserType(.center)
}
- return convert(task: task)
+ .flatMap { [notificationTokenUseCase] _ in
+ // #3. 원격알림 토큰을 서버에 전송
+ notificationTokenUseCase.setNotificationToken()
+ }
}
// 센터 로그인 실행
public func loginCenterAccount(id: String, password: String) -> Single> {
- let task = authRepository.requestCenterLogin(id: id, password: password)
+ authRepository.requestCenterLogin(id: id, password: password)
.map { [userInfoLocalRepository] vo in
userInfoLocalRepository.updateUserType(.center)
}
- return convert(task: task)
+ .flatMap { [notificationTokenUseCase] _ in
+ // 원격알림 토큰을 서버에 전송
+ notificationTokenUseCase.setNotificationToken()
+ }
}
// 요양 보호사 회원가입 실행, 성공한 경우 프로필 Fetch후 저장
public func registerWorkerAccount(registerState: WorkerRegisterState) -> Single> {
- let task = authRepository
- .requestRegisterWorkerAccount(registerState: registerState)
+ let registerResult = authRepository.requestRegisterWorkerAccount(registerState: registerState)
+
+ let registerSuccess = registerResult.compactMap({ $0.value })
+ let registerFailure = registerResult.compactMap({ $0.error })
+
+ let fetchProfileResult = registerSuccess
+ .asObservable()
.flatMap { [userProfileRepository] _ in
- userProfileRepository.getWorkerProfile(mode: .myProfile)
+ userProfileRepository
+ .getWorkerProfile(mode: .myProfile)
}
+ .share()
+
+ let fetchProfileSuccess = fetchProfileResult.compactMap { $0.value}
+ let fetchProfileFailure = fetchProfileResult.compactMap { $0.error}
+
+ let saveAndNotificationResult = fetchProfileSuccess
.map { [userInfoLocalRepository] vo in
userInfoLocalRepository.updateUserType(.worker)
userInfoLocalRepository.updateCurrentWorkerData(vo: vo)
}
+ .flatMap { [notificationTokenUseCase] _ in
+ // 원격알림 토큰을 서버에 전송
+ notificationTokenUseCase.setNotificationToken()
+ }
- return convert(task: task)
+ return Observable.merge(
+ saveAndNotificationResult,
+ Observable
+ .merge(registerFailure.asObservable(), fetchProfileFailure.asObservable())
+ .map { error -> Result in .failure(error) }
+ ).asSingle()
}
// 요양 보호사 로그인 실행, 성공한 경우 프로필 Fetch후 저장
public func loginWorkerAccount(phoneNumber: String, authNumber: String) -> Single> {
- let task = authRepository.requestWorkerLogin(phoneNumber: phoneNumber, authNumber: authNumber)
+ let loginResult = authRepository.requestWorkerLogin(phoneNumber: phoneNumber, authNumber: authNumber)
+ .asObservable()
.flatMap { [userProfileRepository] _ in
userProfileRepository.getWorkerProfile(mode: .myProfile)
}
- .map { [userInfoLocalRepository] vo in
- userInfoLocalRepository.updateUserType(.worker)
- userInfoLocalRepository.updateCurrentWorkerData(vo: vo)
- }
+ .share()
- return convert(task: task)
+ let loginSuccess = loginResult.compactMap { $0.value }
+ let loginFailure = loginResult.compactMap { $0.error }
+
+ let tokenTransferResult = loginSuccess
+ .asObservable()
+ .map { [userInfoLocalRepository] vo in
+ userInfoLocalRepository.updateUserType(.worker)
+ userInfoLocalRepository.updateCurrentWorkerData(vo: vo)
+ }
+ .flatMap { [notificationTokenUseCase] _ in
+ // 원격알림 토큰을 서버에 전송
+ notificationTokenUseCase.setNotificationToken()
+ }
+
+ return Observable
+ .merge(
+ tokenTransferResult,
+ loginFailure.map({ error -> Result in
+ .failure(error)
+ }).asObservable()
+ )
+ .asSingle()
}
public func checkCenterJoinStatus() -> Single> {
- convert(task: authRepository.getCenterJoinStatus())
+ authRepository.getCenterJoinStatus()
}
public func setNewPassword(phoneNumber: String, password: String) -> Single> {
- convert(task: authRepository.setNewPassword(phoneNumber: phoneNumber, password: password))
+ authRepository.setNewPassword(phoneNumber: phoneNumber, password: password)
}
}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/CenterCertificate/DefaultCenterCertificateUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/CenterCertificate/DefaultCenterCertificateUseCase.swift
index 02d8d557..b6853563 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/CenterCertificate/DefaultCenterCertificateUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/CenterCertificate/DefaultCenterCertificateUseCase.swift
@@ -22,37 +22,35 @@ public class DefaultCenterCertificateUseCase: CenterCertificateUseCase {
public func requestCenterCertificate() -> RxSwift.Single> {
- convert(task: authRepository.requestCenterJoin())
+ authRepository.requestCenterJoin()
}
public func getCenterJoinStatus() -> RxSwift.Single> {
- convert(task: authRepository.getCenterJoinStatus())
+
+ authRepository.getCenterJoinStatus()
}
// 센터 로그아웃
public func signoutCenterAccount() -> RxSwift.Single> {
- let task = authRepository
+ authRepository
.signoutCenterAccount()
- .map { [weak self] _ in
- self?.removeAllLocalData()
-
- return ()
+ .map { [weak self] result in
+ if case .success = result {
+ self?.userInfoLocalRepository.removeAllData()
+ }
+ return result
}
- return convert(task: task)
}
// 요양보호사 로그아웃
public func signoutWorkerAccount() -> RxSwift.Single> {
- let task = authRepository
+ authRepository
.signoutWorkerAccount()
- .map { [weak self] _ in
- self?.removeAllLocalData()
-
- return ()
+ .map { [weak self] result in
+ if case .success = result {
+ self?.userInfoLocalRepository.removeAllData()
+ }
+ return result
}
- return convert(task: task)
- }
- private func removeAllLocalData() {
- userInfoLocalRepository.removeAllData()
}
}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenManage.swift b/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenManage.swift
deleted file mode 100644
index 4fa9dc98..00000000
--- a/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenManage.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// DefaultNotificationTokenManage.swift
-// ConcreteUseCase
-//
-// Created by choijunios on 9/26/24.
-//
-
-import Foundation
-
-public class DefaultNotificationTokenManage: NotificationTokenManage {
-
- public init() { }
-
- public func setNotificationToken(token: String, completion: @escaping (Bool) -> ()) {
-
- //TODO: 구체적 스팩 산정 후 구현
- completion(true)
- }
-
- public func deleteNotificationToken(completion: @escaping (Bool) -> ()) {
-
- //TODO: 구체적 스팩 산정 후 구현
- completion(true)
- }
-}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenUseCase.swift
new file mode 100644
index 00000000..592c811d
--- /dev/null
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/NotificationTokenManage/DefaultNotificationTokenUseCase.swift
@@ -0,0 +1,69 @@
+//
+// DefaultNotificationTokenUseCase.swift
+// ConcreteUseCase
+//
+// Created by choijunios on 9/26/24.
+//
+
+import Foundation
+import Core
+
+
+import RxSwift
+
+public class DefaultNotificationTokenUseCase: NotificationTokenUseCase {
+
+ // Repositories
+ @Injected var tokenTransferRepository: NotificationTokenTransferRepository
+ @Injected var tokenRepository: NotificationTokenRepository
+ @Injected var userInfoLocalRepository: UserInfoLocalRepository
+
+ let disposeBag = DisposeBag()
+
+ public init() {
+ // set deleage
+ self.tokenRepository.delegate = self
+ }
+
+ public func setNotificationToken() -> Single> {
+
+ guard let userType = userInfoLocalRepository.getUserType() else {
+ return .just(.failure(.clientException))
+ }
+
+ guard let notificationToken = tokenRepository.getToken() else {
+ return .just(.failure(.resourceNotFound))
+ }
+
+ return tokenTransferRepository
+ .sendToken(token: notificationToken, userType: userType)
+ }
+
+ public func deleteNotificationToken() -> Single> {
+
+ guard let notificationToken = tokenRepository.getToken() else {
+ return .just(.failure(.resourceNotFound))
+ }
+
+ return tokenTransferRepository
+ .deleteToken(token: notificationToken)
+ }
+}
+
+extension DefaultNotificationTokenUseCase: NotificationTokenRepositoryDelegate {
+
+ public func notificationToken(freshToken: String) {
+ setNotificationToken()
+ .subscribe { result in
+
+ switch result {
+ case .success:
+ printIfDebug("자동 리프래쉬 토큰 전송 성공")
+ case .failure(let error):
+ printIfDebug("자동 리프래쉬 토큰 전송 실패: \(error.localizedDescription)")
+ }
+
+ }
+ .disposed(by: disposeBag)
+ }
+}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/RecruitmentPost/DefualtRecruitmentPostUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/RecruitmentPost/DefualtRecruitmentPostUseCase.swift
index e3634fe8..371f79c0 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/RecruitmentPost/DefualtRecruitmentPostUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/RecruitmentPost/DefualtRecruitmentPostUseCase.swift
@@ -26,11 +26,7 @@ public class DefaultRecruitmentPostUseCase: RecruitmentPostUseCase {
inputs.applicationDetail.deadlineDate = oneMonthLater
}
- return convert(
- task: repository.registerPost(
- bundle: inputs
- )
- )
+ return repository.registerPost(bundle: inputs)
}
public func editRecruitmentPost(id: String, inputs: RegisterRecruitmentPostBundle) -> RxSwift.Single> {
@@ -40,65 +36,68 @@ public class DefaultRecruitmentPostUseCase: RecruitmentPostUseCase {
inputs.applicationDetail.deadlineDate = oneMonthLater
}
- return convert(
- task: repository.editPostDetail(
- id: id,
- bundle: inputs
- )
- )
+ return repository.editPostDetail(id: id, bundle: inputs)
}
public func getPostDetailForCenter(id: String) -> RxSwift.Single> {
- convert(task: repository.getPostDetailForCenter(id: id))
+ repository.getPostDetailForCenter(id: id)
}
public func getNativePostDetailForWorker(id: String) -> RxSwift.Single> {
- convert(task: repository.getNativePostDetailForWorker(id: id))
+ repository.getNativePostDetailForWorker(id: id)
}
public func getWorknetPostDetailForWorker(id: String) -> RxSwift.Single> {
- convert(task: repository.getWorknetPostDetailForWorker(id: id))
+ repository.getWorknetPostDetailForWorker(id: id)
}
- public func getOngoingPosts() -> RxSwift.Single> {
- let task = repository
+ public func getOngoingPosts() -> Single> {
+
+ repository
.getOngoingPosts()
- .map { postInfo in
- postInfo.forEach { vo in vo.state = .onGoing }
- return postInfo
+ .map { result -> Result<[RecruitmentPostInfoForCenterVO], DomainError> in
+
+ if case .success(let postInfos) = result {
+
+ return .success(postInfos.map { $0.setState(.onGoing) })
+ }
+ return result
}
- return convert(task: task)
}
public func getClosedPosts() -> RxSwift.Single> {
- let task = repository
+
+ repository
.getClosedPosts()
- .map { postInfo in
- postInfo.forEach { vo in vo.state = .closed }
- return postInfo
+ .map { result -> Result<[RecruitmentPostInfoForCenterVO], DomainError> in
+
+ if case .success(let postInfos) = result {
+
+ return .success(postInfos.map { $0.setState(.closed) })
+ }
+ return result
}
- return convert(task: task)
}
public func closePost(id: String) -> Single> {
- convert(task: repository.closePost(id: id))
+ repository.closePost(id: id)
}
public func removePost(id: String) -> Single> {
- convert(task: repository.removePost(id: id))
+ repository.removePost(id: id)
}
public func getPostApplicantCount(id: String) -> RxSwift.Single> {
- convert(task: repository.getPostApplicantCount(id: id))
+ repository.getPostApplicantCount(id: id)
}
public func getPostApplicantScreenData(id: String) -> RxSwift.Single> {
- convert(task: repository.getPostApplicantScreenData(id: id))
+ repository.getPostApplicantScreenData(id: id)
}
public func getPostListForWorker(request: PostPagingRequestForWorker, postCount: Int) -> Single> {
- let stream: Single!
+ let stream: Single>!
switch request {
case .initial:
@@ -121,26 +120,43 @@ public class DefaultRecruitmentPostUseCase: RecruitmentPostUseCase {
}
}
- return convert(task: stream)
+ return stream
}
public func getFavoritePostListForWorker() -> RxSwift.Single> {
- let nativeList = repository.getNativeFavoritePostListForWorker()
- let worknetList = repository.getWorknetFavoritePostListForWorker()
+ let fetchNativeListResult = repository.getNativeFavoritePostListForWorker()
+ let nativeSuccess = fetchNativeListResult.compactMap { $0.value }
+ let nativeFailure = fetchNativeListResult.compactMap { $0.error }
+
+ let fetchWorknetListResult = repository
+ .getWorknetFavoritePostListForWorker()
+ .asObservable()
+ .share()
+ let worknetSuccess = fetchWorknetListResult.compactMap { $0.value }
+ let worknetFailure = fetchWorknetListResult.compactMap { $0.error }
+
+
+ let successZip = Observable
+ .zip(nativeSuccess.asObservable(), worknetSuccess.asObservable())
+ .map { (native, worknet) -> Result<[RecruitmentPostForWorkerRepresentable], DomainError> in
+ .success(native + worknet)
+ }
- let task = Single
- .zip(nativeList, worknetList)
- .map { (native, worknet) in
- native + worknet
+ let failureMerge = Observable
+ .merge(nativeFailure.asObservable(), worknetFailure.asObservable())
+ .map { error -> Result<[RecruitmentPostForWorkerRepresentable], DomainError> in
+ .failure(error)
}
- return convert(task: task)
+ return Observable
+ .merge(successZip, failureMerge)
+ .asSingle()
}
public func getAppliedPostListForWorker(request: PostPagingRequestForWorker, postCount: Int) -> RxSwift.Single> {
- let stream: Single!
+ let stream: Single>!
switch request {
case .initial:
@@ -161,18 +177,18 @@ public class DefaultRecruitmentPostUseCase: RecruitmentPostUseCase {
}
}
- return convert(task: stream)
+ return stream
}
public func applyToPost(postId: String, method: ApplyType) -> RxSwift.Single> {
- convert(task: repository.applyToPost(postId: postId, method: method))
+ repository.applyToPost(postId: postId, method: method)
}
public func addFavoritePost(postId: String, type: PostOriginType) -> Single> {
- convert(task: repository.addFavoritePost(postId: postId, type: type))
+ repository.addFavoritePost(postId: postId, type: type)
}
public func removeFavoritePost(postId: String) -> Single> {
- convert(task: repository.removeFavoritePost(postId: postId))
+ repository.removeFavoritePost(postId: postId)
}
}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift
index cc83fb4f..f9304d03 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/Setting/DefaultSettingUseCase.swift
@@ -7,19 +7,21 @@
import Foundation
import UserNotifications
+import Core
import RxSwift
public class DefaultSettingUseCase: SettingScreenUseCase {
- let authRepository: AuthRepository
- let userInfoLocalRepository: UserInfoLocalRepository
+ // UseCase
+ @Injected var notificationTokenUseCase: NotificationTokenUseCase
- public init(authRepository: AuthRepository, userInfoLocalRepository: UserInfoLocalRepository) {
- self.authRepository = authRepository
- self.userInfoLocalRepository = userInfoLocalRepository
- }
+ // Repository
+ @Injected var authRepository: AuthRepository
+ @Injected var userInfoLocalRepository: UserInfoLocalRepository
+
+ public init() { }
public func checkPushNotificationApproved() -> Single {
Single.create { single in
@@ -71,63 +73,74 @@ public class DefaultSettingUseCase: SettingScreenUseCase {
}
}
- public func getPersonalDataUsageDescriptionUrl() -> URL {
- // MARK: TODO
- URL(string: "")!
- }
-
- public func getApplicationPolicyUrl() -> URL {
- // MARK: TODO
- URL(string: "")!
- }
-
// MARK: 회원탈퇴 & 로그아웃
// 센터 회원탈퇴
public func deregisterCenterAccount(reasons: [String], password: String) -> RxSwift.Single> {
- let task = authRepository
- .deregisterCenterAccount(reasons: reasons, password: password)
- .map { [weak self] _ in
- self?.removeAllLocalData()
+
+ notificationTokenUseCase
+ .deleteNotificationToken()
+ .flatMap{ [authRepository] result in
- return ()
+ switch result {
+ case .success:
+ authRepository
+ .deregisterCenterAccount(reasons: reasons, password: password)
+ .map { [weak self] result in
+ if case .success = result {
+ self?.removeAllLocalData()
+ }
+ return result
+ }
+ case .failure:
+ Single.just(result)
+ }
}
- return convert(task: task)
}
// 센터 로그아웃
public func signoutCenterAccount() -> RxSwift.Single> {
- let task = authRepository
- .signoutCenterAccount()
- .map { [weak self] _ in
- self?.removeAllLocalData()
+ notificationTokenUseCase
+ .deleteNotificationToken()
+ .flatMap{ [authRepository] result in
- return ()
+ switch result {
+ case .success:
+ authRepository
+ .signoutCenterAccount()
+ .map { [weak self] result in
+ if case .success = result {
+ self?.removeAllLocalData()
+ }
+ return result
+ }
+ case .failure:
+ Single.just(result)
+ }
}
- return convert(task: task)
}
// 요양보호사 회원탈퇴
public func deregisterWorkerAccount(reasons: [String]) -> RxSwift.Single> {
- let task = authRepository
+ authRepository
.deregisterWorkerAccount(reasons: reasons)
- .map { [weak self] _ in
- self?.removeAllLocalData()
-
- return ()
+ .map { [weak self] result in
+ if case .success = result {
+ self?.removeAllLocalData()
+ }
+ return result
}
- return convert(task: task)
}
// 요양보호사 로그아웃
public func signoutWorkerAccount() -> RxSwift.Single> {
- let task = authRepository
+ authRepository
.signoutWorkerAccount()
- .map { [weak self] _ in
- self?.removeAllLocalData()
-
- return ()
+ .map { [weak self] result in
+ if case .success = result {
+ self?.removeAllLocalData()
+ }
+ return result
}
- return convert(task: task)
}
private func removeAllLocalData() {
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift
index bcbca84a..280a40fe 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift
@@ -31,21 +31,23 @@ public class DefaultCenterProfileUseCase: CenterProfileUseCase {
}
public func getFreshProfile(mode: ProfileMode) -> RxSwift.Single> {
- convert(task: userProfileRepository.getCenterProfile(mode: mode))
+ userProfileRepository.getCenterProfile(mode: mode)
}
public func updateProfile(phoneNumber: String?, introduction: String?, imageInfo: ImageUploadInfo?) -> Single> {
- var updateTextTask: Single!
- var updateImageTask: Single!
+ var updateTextTask: Observable>!
+ var updateImageTask: Observable>!
if let phoneNumber {
updateTextTask = userProfileRepository.updateCenterProfileForText(
phoneNumber: phoneNumber,
introduction: introduction
)
+ .asObservable()
+ .share()
} else {
- updateTextTask = .just(())
+ updateTextTask = .just(.success(()))
}
if let imageInfo {
@@ -53,30 +55,59 @@ public class DefaultCenterProfileUseCase: CenterProfileUseCase {
.center,
imageInfo: imageInfo
)
+ .asObservable()
+ .share()
} else {
- updateImageTask = .just(())
+ updateImageTask = .just(.success(()))
}
- let task = Observable
+ let textSuccess = updateTextTask.compactMap { $0.value }
+ let textFailure = updateTextTask.compactMap { $0.error }
+
+ let imageSuccess = updateImageTask.compactMap { $0.value }
+ let imageFailure = updateImageTask.compactMap { $0.error }
+
+ let fetchProfileResult = Observable
.zip(
- updateTextTask.asObservable(),
- updateImageTask.asObservable()
+ textSuccess.asObservable(),
+ imageSuccess.asObservable()
)
.flatMap { [userProfileRepository] _ in
// 등록성공후 내프로필 불러오기
userProfileRepository.getCenterProfile(mode: .myProfile)
}
- .map({ [userInfoLocalRepository] vo in
- userInfoLocalRepository.updateCurrentCenterData(vo: vo)
- })
- .asSingle()
+ .share()
+
+ let task = fetchProfileResult
+ .map { [userInfoLocalRepository] result -> Result in
+ switch result {
+ case .success(let vo):
+ userInfoLocalRepository.updateCurrentCenterData(vo: vo)
+ return .success(())
+ case .failure(let error):
+ return .failure(error)
+ }
+ }
- return convert(task: task)
+ let failures = Observable
+ .merge(
+ textFailure.asObservable(),
+ imageFailure.asObservable()
+ )
+ .map { error -> Result in
+ .failure(error)
+ }
+
+ return Observable.merge(
+ task.asObservable(),
+ failures
+ )
+ .asSingle()
}
public func registerCenterProfile(state: CenterProfileRegisterState) -> Single> {
- var registerImageTask: Single!
+ var registerImageTask: Observable>!
let imageInfo = state.imageInfo
@@ -85,26 +116,57 @@ public class DefaultCenterProfileUseCase: CenterProfileUseCase {
.center,
imageInfo: imageInfo
)
+ .asObservable()
+ .share()
} else {
- registerImageTask = .just(())
+ registerImageTask = .just(.success(()))
}
- let registerTextTask = userProfileRepository.registerCenterProfileForText(state: state)
-
- let task = Observable
+ let registerImageTaskSuccess = registerImageTask.compactMap { $0.value }
+ let registerImageTaskFailure = registerImageTask.compactMap { $0.error }
+
+ let registerTextTask = userProfileRepository
+ .registerCenterProfileForText(state: state)
+ .asObservable()
+ .share()
+ let registerTextTaskSuccess = registerTextTask.compactMap { $0.value }
+ let registerTextTaskFailure = registerTextTask.compactMap { $0.error }
+
+ let fetchProfileResult = Observable
.zip(
- registerTextTask.asObservable(),
- registerImageTask.asObservable()
+ registerImageTaskSuccess.asObservable(),
+ registerTextTaskSuccess.asObservable()
)
.flatMap { [userProfileRepository] _ in
// 등록성공후 내프로필 불러오기
userProfileRepository.getCenterProfile(mode: .myProfile)
}
- .map({ [userInfoLocalRepository] vo in
- userInfoLocalRepository.updateCurrentCenterData(vo: vo)
- })
- .asSingle()
+ .share()
+
+ let task = fetchProfileResult
+ .map { [userInfoLocalRepository] result -> Result in
+ switch result {
+ case .success(let vo):
+ userInfoLocalRepository.updateCurrentCenterData(vo: vo)
+ return .success(())
+ case .failure(let error):
+ return .failure(error)
+ }
+ }
+
+ let failures = Observable
+ .merge(
+ registerImageTaskFailure.asObservable(),
+ registerTextTaskFailure.asObservable()
+ )
+ .map { error -> Result in
+ .failure(error)
+ }
- return convert(task: task)
+ return Observable.merge(
+ task.asObservable(),
+ failures
+ )
+ .asSingle()
}
}
diff --git a/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift b/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift
index 2ecfd620..eb607214 100644
--- a/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift
+++ b/project/Projects/Domain/Sources/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift
@@ -31,40 +31,70 @@ public class DefaultWorkerProfileUseCase: WorkerProfileUseCase {
}
public func getFreshProfile(mode: ProfileMode) -> RxSwift.Single> {
- convert(task: userProfileRepository.getWorkerProfile(mode: mode))
+ userProfileRepository.getWorkerProfile(mode: mode)
}
public func updateProfile(stateObject: WorkerProfileStateObject, imageInfo: ImageUploadInfo?) -> Single> {
- var updateTextTask: Single!
- var updateImageTask: Single!
+ var updateTextTask: Observable>!
+ var updateImageTask: Observable>!
- updateTextTask = userProfileRepository.updateWorkerProfile(
- stateObject: stateObject
- )
+ updateTextTask = userProfileRepository.updateWorkerProfile(stateObject: stateObject)
+ .asObservable()
+ .share()
if let imageInfo {
updateImageTask = userProfileRepository.uploadImage(
.worker,
imageInfo: imageInfo
)
+ .asObservable()
+ .share()
} else {
- updateImageTask = .just(())
+ updateImageTask = .just(.success(()))
}
- let task = Observable
+ let textSuccess = updateTextTask.compactMap { $0.value }
+ let textFailure = updateTextTask.compactMap { $0.error }
+
+ let imageSuccess = updateImageTask.compactMap { $0.value }
+ let imageFailure = updateImageTask.compactMap { $0.error }
+
+ let fetchProfileResult = Observable
.zip(
- updateTextTask.asObservable(),
- updateImageTask.asObservable()
+ textSuccess.asObservable(),
+ imageSuccess.asObservable()
)
.flatMap { [userProfileRepository] _ in
+ // 등록성공후 내프로필 불러오기
userProfileRepository.getWorkerProfile(mode: .myProfile)
}
- .map({ [userInfoLocalRepository] vo in
- userInfoLocalRepository.updateCurrentWorkerData(vo: vo)
- })
- .asSingle()
+ .share()
+
+ let task = fetchProfileResult
+ .map { [userInfoLocalRepository] result -> Result in
+ switch result {
+ case .success(let vo):
+ userInfoLocalRepository.updateCurrentWorkerData(vo: vo)
+ return .success(())
+ case .failure(let error):
+ return .failure(error)
+ }
+ }
- return convert(task: task)
+ let failures = Observable
+ .merge(
+ textFailure.asObservable(),
+ imageFailure.asObservable()
+ )
+ .map { error -> Result in
+ .failure(error)
+ }
+
+ return Observable.merge(
+ task.asObservable(),
+ failures
+ )
+ .asSingle()
}
}
diff --git a/project/Projects/Domain/Sources/Entity/VO/Post/RecruitmentPostInfoForCenterVO.swift b/project/Projects/Domain/Sources/Entity/VO/Post/RecruitmentPostInfoForCenterVO.swift
index d627cf5f..01b8cd34 100644
--- a/project/Projects/Domain/Sources/Entity/VO/Post/RecruitmentPostInfoForCenterVO.swift
+++ b/project/Projects/Domain/Sources/Entity/VO/Post/RecruitmentPostInfoForCenterVO.swift
@@ -40,4 +40,9 @@ public class RecruitmentPostInfoForCenterVO {
self.applyDeadline = applyDeadline
self.createdAt = createdAt
}
+
+ func setState(_ to: PostState) -> Self {
+ state = to
+ return self
+ }
}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthInputValidationRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthInputValidationRepository.swift
index 602c6b10..e9884b45 100644
--- a/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthInputValidationRepository.swift
+++ b/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthInputValidationRepository.swift
@@ -12,8 +12,8 @@ import RxSwift
public protocol AuthInputValidationRepository: RepositoryBase {
- func requestPhoneNumberAuthentication(phoneNumber: String) -> Single
- func authenticateAuthNumber(phoneNumber: String, authNumber: String) -> Single
- func requestBusinessNumberAuthentication(businessNumber: String) -> Single
- func requestCheckingIdDuplication(id: String) -> Single
+ func requestPhoneNumberAuthentication(phoneNumber: String) -> Single>
+ func authenticateAuthNumber(phoneNumber: String, authNumber: String) -> Single>
+ func requestBusinessNumberAuthentication(businessNumber: String) -> Single>
+ func requestCheckingIdDuplication(id: String) -> Single>
}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthRepository.swift
index d0cd139e..9f1a80c5 100644
--- a/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthRepository.swift
+++ b/project/Projects/Domain/Sources/RepositoryInterface/Auth/AuthRepository.swift
@@ -10,18 +10,18 @@ import RxSwift
public protocol AuthRepository: RepositoryBase {
// MARK: Center
- func requestRegisterCenterAccount(managerName: String, phoneNumber: String, businessNumber: String, id: String, password: String) -> Single
- func requestCenterLogin(id: String, password: String) -> Single
- func signoutCenterAccount() -> Single
- func deregisterCenterAccount(reasons: [String], password: String) -> Single
- func getCenterJoinStatus() -> Single
- func requestCenterJoin() -> Single
- func setNewPassword(phoneNumber: String, password: String) -> Single
+ func requestRegisterCenterAccount(managerName: String, phoneNumber: String, businessNumber: String, id: String, password: String) -> Single>
+ func requestCenterLogin(id: String, password: String) -> Single>
+ func signoutCenterAccount() -> Single>
+ func deregisterCenterAccount(reasons: [String], password: String) -> Single>
+ func getCenterJoinStatus() -> Single>
+ func requestCenterJoin() -> Single>
+ func setNewPassword(phoneNumber: String, password: String) -> Single>
// MARK: Worker
- func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single
- func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single
- func signoutWorkerAccount() -> Single
- func deregisterWorkerAccount(reasons: [String]) -> Single
+ func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single>
+ func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single>
+ func signoutWorkerAccount() -> Single>
+ func deregisterWorkerAccount(reasons: [String]) -> Single>
}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/RecruitmentPost/RecruitmentPostRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/RecruitmentPost/RecruitmentPostRepository.swift
index 8f71678f..bec59e22 100644
--- a/project/Projects/Domain/Sources/RepositoryInterface/RecruitmentPost/RecruitmentPostRepository.swift
+++ b/project/Projects/Domain/Sources/RepositoryInterface/RecruitmentPost/RecruitmentPostRepository.swift
@@ -14,65 +14,65 @@ public protocol RecruitmentPostRepository: RepositoryBase {
// MARK: Center - post crud
/// 공고를 등록합니다.
- func registerPost(bundle: RegisterRecruitmentPostBundle) -> Single
-
+ func registerPost(bundle: RegisterRecruitmentPostBundle) -> Single>
+
/// 센터측에서 등록한 공고의 상세내역을 확인합니다.
- func getPostDetailForCenter(id: String) -> Single
-
+ func getPostDetailForCenter(id: String) -> Single>
+
/// 센터가 등록한 공고의 상세정보를 수정합니다.
- func editPostDetail(id: String, bundle: RegisterRecruitmentPostBundle) -> Single
-
+ func editPostDetail(id: String, bundle: RegisterRecruitmentPostBundle) -> Single>
+
// MARK: Center - check posts
/// 현재 진행중인 공고를 획득합니다.
- func getOngoingPosts() -> Single<[RecruitmentPostInfoForCenterVO]>
-
- /// 현재 진행중인 공고를 획득합니다.
- func getClosedPosts() -> Single<[RecruitmentPostInfoForCenterVO]>
-
+ func getOngoingPosts() -> Single>
+
+ /// 닫힌 공고를 획득합니다.
+ func getClosedPosts() -> Single>
+
/// 특정 공고의 지원자 수를 확인합니다.
- func getPostApplicantCount(id: String) -> Single
-
+ func getPostApplicantCount(id: String) -> Single>
+
/// 특정 공고의 지원자 리스트를 조회합니다. 요약된 공고정보가 포함되어 있습니다.
- func getPostApplicantScreenData(id: String) -> Single
-
+ func getPostApplicantScreenData(id: String) -> Single>
+
/// 공고를 종료합니다.
- func closePost(id: String) -> Single
-
+ func closePost(id: String) -> Single>
+
/// 공고를 삭제합니다.
- func removePost(id: String) -> Single
-
+ func removePost(id: String) -> Single>
+
// MARK: Worker
/// 요양보호사 앱내 공고의 상세정보를 조회합니다.
- func getNativePostDetailForWorker(id: String) -> Single
-
+ func getNativePostDetailForWorker(id: String) -> Single>
+
/// 요양보호사 워크넷 공고의 상세정보를 조회합니다.
- func getWorknetPostDetailForWorker(id: String) -> Single
-
+ func getWorknetPostDetailForWorker(id: String) -> Single>
+
// MARK: Native post
-
+
/// 요양보호사가 확인하는 케어밋 자체 공고정보를 가져옵니다.
- func getNativePostListForWorker(nextPageId: String?, requestCnt: Int) -> Single
-
+ func getNativePostListForWorker(nextPageId: String?, requestCnt: Int) -> Single>
+
/// 요양보호사가 즐겨찾는 케어밋 자체 공고정보를 가져옵니다.
- func getNativeFavoritePostListForWorker() -> Single<[RecruitmentPostForWorkerRepresentable]>
-
+ func getNativeFavoritePostListForWorker() -> Single>
+
/// 요양보호사가 즐겨찾는 워크넷 공고정보를 가져옵니다.
- func getWorknetFavoritePostListForWorker() -> Single<[RecruitmentPostForWorkerRepresentable]>
-
+ func getWorknetFavoritePostListForWorker() -> Single>
+
/// 요양보호사가 확인하는 케어밋 자체 공고정보를 가져옵니다.
- func getAppliedPostListForWorker(nextPageId: String?, requestCnt: Int) -> Single
-
+ func getAppliedPostListForWorker(nextPageId: String?, requestCnt: Int) -> Single>
+
// MARK: Worknet Post
-
+
/// 요양보호사가 확인하는 워크넷 공고정보를 가져옵니다.
- func getWorknetPostListForWorker(nextPageId: String?, requestCnt: Int) -> Single
-
+ func getWorknetPostListForWorker(nextPageId: String?, requestCnt: Int) -> Single>
+
/// 요양보호사가 인앱 공고에 지원합니다.
- func applyToPost(postId: String, method: ApplyType) -> Single
-
+ func applyToPost(postId: String, method: ApplyType) -> Single>
+
/// 요양보호사 즐겨찾기 공고 추가
- func addFavoritePost(postId: String, type: PostOriginType) -> Single
-
+ func addFavoritePost(postId: String, type: PostOriginType) -> Single>
+
/// 요양보호사 즐겨찾기 공고 삭제
- func removeFavoritePost(postId: String) -> Single
+ func removeFavoritePost(postId: String) -> Single>
}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenRepository.swift
new file mode 100644
index 00000000..ae183f86
--- /dev/null
+++ b/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenRepository.swift
@@ -0,0 +1,21 @@
+//
+// NotificationTokenRepository.swift
+// Domain
+//
+// Created by choijunios on 10/8/24.
+//
+
+import Foundation
+
+public protocol NotificationTokenRepository: AnyObject {
+
+ // delegate
+ var delegate: NotificationTokenRepositoryDelegate? { get set }
+
+ func getToken() -> String?
+}
+
+public protocol NotificationTokenRepositoryDelegate: AnyObject {
+
+ func notificationToken(freshToken: String)
+}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenTransferRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenTransferRepository.swift
new file mode 100644
index 00000000..465aeadc
--- /dev/null
+++ b/project/Projects/Domain/Sources/RepositoryInterface/RemoteNotification/NotificationTokenTransferRepository.swift
@@ -0,0 +1,17 @@
+//
+// NotificationTokenTransportRepository.swift
+// Domain
+//
+// Created by choijunios on 10/8/24.
+//
+
+import Foundation
+
+
+import RxSwift
+
+public protocol NotificationTokenTransferRepository: RepositoryBase {
+
+ func sendToken(token: String, userType: UserType) -> Single>
+ func deleteToken(token: String) -> Single>
+}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/RepositoryBase.swift b/project/Projects/Domain/Sources/RepositoryInterface/RepositoryBase.swift
index 65a2b474..5dfcd20d 100644
--- a/project/Projects/Domain/Sources/RepositoryInterface/RepositoryBase.swift
+++ b/project/Projects/Domain/Sources/RepositoryInterface/RepositoryBase.swift
@@ -7,4 +7,59 @@
import Foundation
+
+import RxSwift
+
public protocol RepositoryBase { }
+
+public extension RepositoryBase {
+
+ /// Repository로 부터 전달받은 언어레벨의 에러를 도메인 특화 에러로 변경하고, error를 Result의 Failure로, 성공을 Success로 변경합니다.
+ func convertToDomain(task: Single) -> Single> {
+ Single.create { single in
+ let disposable = task
+ .subscribe { success in
+ single(.success(.success(success)))
+ } onFailure: { error in
+ single(.success(.failure(self.toDomainError(error: error))))
+ }
+ return Disposables.create { disposable.dispose() }
+ }
+ }
+
+ // MARK: InputValidationError
+ private func toDomainError(error: Error) -> DomainError {
+
+ // 네트워크 에러
+ if let httpError = error as? HTTPResponseException {
+
+ if let code = httpError.rawCode {
+
+ let domainError = DomainError(code: code)
+
+ if domainError == .undefinedCode {
+ #if DEBUG
+ print("‼️ 정의되지 않은 에러코드가 발견되었습니다. 노션을 확인해주세요")
+ #endif
+ }
+
+ return domainError
+ }
+
+ #if DEBUG
+ print("InputValidationError변환실패 Error: \(httpError)")
+ #endif
+ }
+
+ // 네트워크 에러보다 근본적인 에러
+ if let underlyingError = error as? UnderLyingError {
+
+ let domainError: DomainError = .undelyingError(error: underlyingError)
+
+ return domainError
+ }
+
+ return DomainError.undelyingError(error: .unHandledError)
+ }
+
+}
diff --git a/project/Projects/Domain/Sources/RepositoryInterface/UserInfo/UserProfileRepository.swift b/project/Projects/Domain/Sources/RepositoryInterface/UserInfo/UserProfileRepository.swift
index 6f0a6767..8e2b9d12 100644
--- a/project/Projects/Domain/Sources/RepositoryInterface/UserInfo/UserProfileRepository.swift
+++ b/project/Projects/Domain/Sources/RepositoryInterface/UserInfo/UserProfileRepository.swift
@@ -11,15 +11,22 @@ import Foundation
import RxSwift
public protocol UserProfileRepository: RepositoryBase {
-
- func registerCenterProfileForText(state: CenterProfileRegisterState) -> Single
-
- func getCenterProfile(mode: ProfileMode) -> Single
- func updateCenterProfileForText(phoneNumber: String, introduction: String?) -> Single
-
- // ImageUpload
- func uploadImage(_ userType: UserType, imageInfo: ImageUploadInfo) -> Single
-
- func getWorkerProfile(mode: ProfileMode) -> Single
- func updateWorkerProfile(stateObject: WorkerProfileStateObject) -> Single
+
+ // 센터 프로필 등록 (텍스트 정보)
+ func registerCenterProfileForText(state: CenterProfileRegisterState) -> Single>
+
+ // 센터 프로필 가져오기
+ func getCenterProfile(mode: ProfileMode) -> Single>
+
+ // 센터 프로필 업데이트 (텍스트 정보)
+ func updateCenterProfileForText(phoneNumber: String, introduction: String?) -> Single>
+
+ // 이미지 업로드
+ func uploadImage(_ userType: UserType, imageInfo: ImageUploadInfo) -> Single>
+
+ // 요양보호사 프로필 가져오기
+ func getWorkerProfile(mode: ProfileMode) -> Single>
+
+ // 요양보호사 프로필 업데이트
+ func updateWorkerProfile(stateObject: WorkerProfileStateObject) -> Single>
}
diff --git a/project/Projects/Domain/Sources/UseCaseInterface/Auth/AuthInputValidationUseCase.swift b/project/Projects/Domain/Sources/UseCaseInterface/Auth/AuthInputValidationUseCase.swift
index 79774a35..3c8bcd47 100644
--- a/project/Projects/Domain/Sources/UseCaseInterface/Auth/AuthInputValidationUseCase.swift
+++ b/project/Projects/Domain/Sources/UseCaseInterface/Auth/AuthInputValidationUseCase.swift
@@ -55,7 +55,7 @@ public protocol AuthInputValidationUseCase: BaseUseCase {
/// - Observable
// MARK: 사업자 번호 조회
- func requestBusinessNumberAuthentication(businessNumber: String) -> Single>
+ func requestBusinessNumberAuthentication(businessNumber: String) -> Single>
// #5.
/// 사업자 번호 유효성 로직
@@ -79,7 +79,7 @@ public protocol AuthInputValidationUseCase: BaseUseCase {
/// - id : "idle1234"
/// - returns:
/// - Bool, true: 가능, flase: 증복
- func requestCheckingIdDuplication(id: String) -> Single>
+ func requestCheckingIdDuplication(id: String) -> Single>
// #8.
/// 아이디 유효성확인 로직
diff --git a/project/Projects/Domain/Sources/UseCaseInterface/BaseUseCase.swift b/project/Projects/Domain/Sources/UseCaseInterface/BaseUseCase.swift
index 52ba9da4..0d5c7793 100644
--- a/project/Projects/Domain/Sources/UseCaseInterface/BaseUseCase.swift
+++ b/project/Projects/Domain/Sources/UseCaseInterface/BaseUseCase.swift
@@ -11,54 +11,3 @@ import Foundation
import RxSwift
public protocol BaseUseCase: AnyObject { }
-
-public extension BaseUseCase {
-
- /// Repository로 부터 전달받은 언어레벨의 에러를 도메인 특화 에러로 변경하고, error를 Result의 Failure로, 성공을 Success로 변경합니다.
- func convert(task: Single) -> Single> {
- Single.create { single in
- let disposable = task
- .subscribe { success in
- single(.success(.success(success)))
- } onFailure: { error in
- single(.success(.failure(self.toDomainError(error: error))))
- }
- return Disposables.create { disposable.dispose() }
- }
- }
-
- // MARK: InputValidationError
- private func toDomainError(error: Error) -> DomainError {
-
- // 네트워크 에러
- if let httpError = error as? HTTPResponseException {
-
- if let code = httpError.rawCode {
-
- let domainError = DomainError(code: code)
-
- if domainError == .undefinedCode {
-#if DEBUG
- print("‼️ 정의되지 않은 에러코드가 발견되었습니다. 노션을 확인해주세요")
-#endif
- }
-
- return domainError
- }
-
- #if DEBUG
- print("InputValidationError변환실패 Error: \(httpError)")
- #endif
- }
-
- // 네트워크 에러보다 근본적인 에러
- if let underlyingError = error as? UnderLyingError {
-
- let domainError: DomainError = .undelyingError(error: underlyingError)
-
- return domainError
- }
-
- return DomainError.undelyingError(error: .unHandledError)
- }
-}
diff --git a/project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenManage.swift b/project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenUseCase.swift
similarity index 54%
rename from project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenManage.swift
rename to project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenUseCase.swift
index 40b4c1ff..31f9ec2b 100644
--- a/project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenManage.swift
+++ b/project/Projects/Domain/Sources/UseCaseInterface/NotificationTokenManage/NotificationTokenUseCase.swift
@@ -1,5 +1,5 @@
//
-// NotificationTokenManage.swift
+// NotificationTokenUseCase.swift
// UseCaseInterface
//
// Created by choijunios on 9/26/24.
@@ -7,11 +7,14 @@
import Foundation
-public protocol NotificationTokenManage {
+
+import RxSwift
+
+public protocol NotificationTokenUseCase {
/// 유저와 매치되는 노티피케이션 토큰을 서버로 전송합니다.
- func setNotificationToken(token: String, completion: @escaping (Bool) -> ())
+ func setNotificationToken() -> Single>
/// 유저와 매치되는 노티피케이션 토큰을 서버로부터 제거합니다.
- func deleteNotificationToken(completion: @escaping (Bool) -> ())
+ func deleteNotificationToken() -> Single>
}
diff --git a/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift b/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift
index 2e89c32b..8b34341e 100644
--- a/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift
+++ b/project/Projects/Domain/Sources/UseCaseInterface/Setting/SettingScreenUseCase .swift
@@ -24,12 +24,6 @@ public protocol SettingScreenUseCase: BaseUseCase {
/// 알림동의를 요청합니다.
func requestNotificationPermission() -> Maybe