Skip to content

Commit efe6fd8

Browse files
committed
[IDLE-90] 요양보호사 번호인증시 로그인으로 연결되는 플로우 구현
요양보호사의 경우 번호인증을 하기전 로그인 API를 호출해 가입된 사용자라면 바로 로그인을 시도합니다.
1 parent 1eeff03 commit efe6fd8

File tree

3 files changed

+119
-35
lines changed

3 files changed

+119
-35
lines changed

project/Projects/Presentation/Feature/Auth/Sources/View/Common/Register/ValidatePhoneNumberViewController.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ public protocol AuthPhoneNumberOutputable {
2727
var phoneNumberValidation: Driver<Bool>? { get set }
2828
var authNumberValidation: Driver<Bool>? { get set }
2929

30+
// 요양보호사 로그인에 성공한 경우(요양보호사 한정 로직)
31+
var loginValidation: Driver<Void>? { get set }
32+
3033
var alert: Driver<DefaultAlertContentVO>? { get set }
3134
}
35+
public extension AuthPhoneNumberOutputable {
36+
var loginValidation: Driver<Void>? { get { nil } set { } }
37+
}
3238

3339
class ValidatePhoneNumberViewController<T: ViewModelType>: BaseViewController
3440
where
@@ -267,7 +273,15 @@ where
267273
.authNumberValidation?
268274
.filter { $0 }
269275
.drive(onNext: { [weak self] _ in
270-
self?.onAuthSuccess()
276+
self?.onAuthNumberValidationSuccess()
277+
})
278+
.disposed(by: disposeBag)
279+
280+
output
281+
.loginValidation?
282+
.drive(onNext: { [weak self] _ in
283+
guard let self else { return }
284+
(coordinator as! WorkerRegisterCoordinator).authFinished()
271285
})
272286
.disposed(by: disposeBag)
273287

@@ -288,6 +302,11 @@ where
288302
}
289303
}
290304

305+
extension ValidatePhoneNumberViewController {
306+
307+
308+
}
309+
291310
extension ValidatePhoneNumberViewController {
292311

293312
func activateAuthNumberField() {
@@ -298,7 +317,7 @@ extension ValidatePhoneNumberViewController {
298317
authNumberField.idleTextField.startTimer(minute: 5, seconds: 0)
299318
}
300319

301-
func onAuthSuccess() {
320+
func onAuthNumberValidationSuccess() {
302321

303322
// 입력과 관려된 필드와 버튼 비활성화
304323
phoneNumberField.idleTextField.setEnabled(false)

project/Projects/Presentation/Feature/Auth/Sources/ViewModel/Center/AuthInOutStreamManager/AuthInOutStreamManager+PhoneNumber.swift

Lines changed: 92 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ extension AuthInOutStreamManager {
1818
input: AuthPhoneNumberInputable & AnyObject,
1919
output: AuthPhoneNumberOutputable & AnyObject,
2020
useCase: AuthInputValidationUseCase,
21+
authUseCase: AuthUseCase? = nil,
2122
stateTracker: @escaping (String) -> ()
2223
) {
2324

@@ -70,39 +71,98 @@ extension AuthInOutStreamManager {
7071
return error.message
7172
}
7273

74+
// AuthUseCase를 전달받은 경우 = "요양보호사 로그인을 포함한다"
75+
var phoneNumeberAuthFailure: Observable<String>!
7376

74-
let phoneNumberAuthResult = input.requestValidationForAuthNumber
75-
.flatMap { [unowned useCase, input] _ in
76-
77-
let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
78-
let authNumber = input.editingAuthNumber.value
79-
#if DEBUG
80-
// 디버그시 인증번호 무조건 통과
81-
print("✅ 디버그모드에서 번호인증 무조건 통과")
82-
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
83-
#endif
84-
85-
return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
86-
}
87-
.share()
88-
89-
// 번호인증 성공
90-
output.authNumberValidation = phoneNumberAuthResult
91-
.compactMap { $0.value }
92-
.map { phoneNumber in
93-
printIfDebug("\(phoneNumber) 인증성공")
94-
stateTracker(phoneNumber)
95-
return true
96-
}
97-
.asDriver(onErrorJustReturn: false)
98-
99-
// 번호인증 실패
100-
let phoneNumeberAuthFailure = phoneNumberAuthResult
101-
.compactMap { $0.error }
102-
.map { error in
103-
printIfDebug("❌ 번호 인증실패 \n 에러내용: \(error.message)")
104-
return error.message
105-
}
77+
if let authUseCase {
78+
79+
let loginResult = input.requestValidationForAuthNumber
80+
.flatMap { [authUseCase, unowned input] _ in
81+
82+
let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
83+
let authNumber = input.editingAuthNumber.value
84+
85+
return authUseCase.loginWorkerAccount(
86+
phoneNumber: phoneNumber,
87+
authNumber: authNumber
88+
)
89+
}
90+
.share()
91+
92+
// 로그인 성공
93+
output.loginValidation = loginResult
94+
.compactMap { $0.value }
95+
.map { phoneNumber in
96+
printIfDebug("✅ 요양보호사 로그인 성공")
97+
return ()
98+
}
99+
.asDriver(onErrorJustReturn: ())
100+
101+
// 로그인 실패시 번호인증 진행(신규가입자라고 판단)
102+
let phoneNumberAuthResult = loginResult
103+
.compactMap { $0.error }
104+
.flatMap { [useCase, unowned input] error in
105+
printIfDebug("❌ 로그인 실패: \(error.message)")
106+
107+
// 번호인증 시도
108+
let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
109+
let authNumber = input.editingAuthNumber.value
110+
111+
#if DEBUG
112+
// 디버그시 인증번호 무조건 통과
113+
print("✅ 디버그모드에서 번호인증 무조건 통과")
114+
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
115+
#endif
116+
117+
return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
118+
}
119+
.share()
120+
121+
// 번호인증 성공
122+
output.authNumberValidation = phoneNumberAuthResult
123+
.compactMap { $0.value }
124+
.map { phoneNumber in
125+
printIfDebug("\(phoneNumber) 인증성공")
126+
return true
127+
}
128+
.asDriver(onErrorJustReturn: false)
129+
130+
// 번호인증 실패
131+
phoneNumeberAuthFailure = phoneNumberAuthResult
132+
.compactMap { $0.error?.message }
133+
.asObservable()
134+
} else {
135+
136+
let phoneNumberAuthResult = input.requestValidationForAuthNumber
137+
.flatMap { [useCase, unowned input] _ in
138+
139+
let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
140+
let authNumber = input.editingAuthNumber.value
141+
#if DEBUG
142+
// 디버그시 인증번호 무조건 통과
143+
print("✅ 디버그모드에서 번호인증 무조건 통과")
144+
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
145+
#endif
146+
147+
return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
148+
}
149+
.share()
150+
151+
// 번호인증 성공
152+
output.authNumberValidation = phoneNumberAuthResult
153+
.compactMap { $0.value }
154+
.map { phoneNumber in
155+
printIfDebug("\(phoneNumber) 인증성공")
156+
stateTracker(phoneNumber)
157+
return true
158+
}
159+
.asDriver(onErrorJustReturn: false)
160+
161+
// 번호인증 실패
162+
phoneNumeberAuthFailure = phoneNumberAuthResult
163+
.compactMap { $0.error?.message ?? nil }
164+
.asObservable()
165+
}
106166

107167
// 번호 인증 관련 Alert
108168
let phoneAuthValidation = Observable

project/Projects/Presentation/Feature/Auth/Sources/ViewModel/Worker/Register/WorkerRegisterViewModel.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ public class WorkerRegisterViewModel: ViewModelType {
7474
AuthInOutStreamManager.validatePhoneNumberInOut(
7575
input: input,
7676
output: output,
77-
useCase: inputValidationUseCase) { [weak self] authedPhoneNumber in
77+
useCase: inputValidationUseCase,
78+
authUseCase: authUseCase
79+
) { [weak self] authedPhoneNumber in
7880
// 🚀 상태추적 🚀
7981
self?.stateObject.phoneNumber = authedPhoneNumber
8082
}
@@ -204,6 +206,9 @@ extension WorkerRegisterViewModel {
204206
// 회원가입 성공 여부
205207
public var registerValidation: Driver<Void>?
206208

209+
// 요양보호사 로그인 성공 여부
210+
public var loginValidation: Driver<Void>?
211+
207212
// Alert
208213
public var alert: Driver<DefaultAlertContentVO>?
209214
}

0 commit comments

Comments
 (0)