Skip to content

Commit

Permalink
[IDLE-90] 요양보호사 번호인증시 로그인으로 연결되는 플로우 구현
Browse files Browse the repository at this point in the history
요양보호사의 경우 번호인증을 하기전 로그인 API를 호출해 가입된 사용자라면 바로 로그인을 시도합니다.
  • Loading branch information
J0onYEong committed Jul 25, 2024
1 parent 1eeff03 commit efe6fd8
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,14 @@ public protocol AuthPhoneNumberOutputable {
var phoneNumberValidation: Driver<Bool>? { get set }
var authNumberValidation: Driver<Bool>? { get set }

// 요양보호사 로그인에 성공한 경우(요양보호사 한정 로직)
var loginValidation: Driver<Void>? { get set }

var alert: Driver<DefaultAlertContentVO>? { get set }
}
public extension AuthPhoneNumberOutputable {
var loginValidation: Driver<Void>? { get { nil } set { } }
}

class ValidatePhoneNumberViewController<T: ViewModelType>: BaseViewController
where
Expand Down Expand Up @@ -267,7 +273,15 @@ where
.authNumberValidation?
.filter { $0 }
.drive(onNext: { [weak self] _ in
self?.onAuthSuccess()
self?.onAuthNumberValidationSuccess()
})
.disposed(by: disposeBag)

output
.loginValidation?
.drive(onNext: { [weak self] _ in
guard let self else { return }
(coordinator as! WorkerRegisterCoordinator).authFinished()
})
.disposed(by: disposeBag)

Expand All @@ -288,6 +302,11 @@ where
}
}

extension ValidatePhoneNumberViewController {


}

extension ValidatePhoneNumberViewController {

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

func onAuthSuccess() {
func onAuthNumberValidationSuccess() {

// 입력과 관려된 필드와 버튼 비활성화
phoneNumberField.idleTextField.setEnabled(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extension AuthInOutStreamManager {
input: AuthPhoneNumberInputable & AnyObject,
output: AuthPhoneNumberOutputable & AnyObject,
useCase: AuthInputValidationUseCase,
authUseCase: AuthUseCase? = nil,
stateTracker: @escaping (String) -> ()
) {

Expand Down Expand Up @@ -70,39 +71,98 @@ extension AuthInOutStreamManager {
return error.message
}

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

let phoneNumberAuthResult = input.requestValidationForAuthNumber
.flatMap { [unowned useCase, input] _ in

let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
let authNumber = input.editingAuthNumber.value
#if DEBUG
// 디버그시 인증번호 무조건 통과
print("✅ 디버그모드에서 번호인증 무조건 통과")
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
#endif

return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
}
.share()

// 번호인증 성공
output.authNumberValidation = phoneNumberAuthResult
.compactMap { $0.value }
.map { phoneNumber in
printIfDebug("\(phoneNumber) 인증성공")
stateTracker(phoneNumber)
return true
}
.asDriver(onErrorJustReturn: false)

// 번호인증 실패
let phoneNumeberAuthFailure = phoneNumberAuthResult
.compactMap { $0.error }
.map { error in
printIfDebug("❌ 번호 인증실패 \n 에러내용: \(error.message)")
return error.message
}
if let authUseCase {

let loginResult = input.requestValidationForAuthNumber
.flatMap { [authUseCase, unowned input] _ in

let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
let authNumber = input.editingAuthNumber.value

return authUseCase.loginWorkerAccount(
phoneNumber: phoneNumber,
authNumber: authNumber
)
}
.share()

// 로그인 성공
output.loginValidation = loginResult
.compactMap { $0.value }
.map { phoneNumber in
printIfDebug("✅ 요양보호사 로그인 성공")
return ()
}
.asDriver(onErrorJustReturn: ())

// 로그인 실패시 번호인증 진행(신규가입자라고 판단)
let phoneNumberAuthResult = loginResult
.compactMap { $0.error }
.flatMap { [useCase, unowned input] error in
printIfDebug("❌ 로그인 실패: \(error.message)")

// 번호인증 시도
let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
let authNumber = input.editingAuthNumber.value

#if DEBUG
// 디버그시 인증번호 무조건 통과
print("✅ 디버그모드에서 번호인증 무조건 통과")
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
#endif

return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
}
.share()

// 번호인증 성공
output.authNumberValidation = phoneNumberAuthResult
.compactMap { $0.value }
.map { phoneNumber in
printIfDebug("\(phoneNumber) 인증성공")
return true
}
.asDriver(onErrorJustReturn: false)

// 번호인증 실패
phoneNumeberAuthFailure = phoneNumberAuthResult
.compactMap { $0.error?.message }
.asObservable()
} else {

let phoneNumberAuthResult = input.requestValidationForAuthNumber
.flatMap { [useCase, unowned input] _ in

let phoneNumber = formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
let authNumber = input.editingAuthNumber.value
#if DEBUG
// 디버그시 인증번호 무조건 통과
print("✅ 디버그모드에서 번호인증 무조건 통과")
return Single.just(Result<String, InputValidationError>.success(phoneNumber))
#endif

return useCase.authenticateAuthNumber(phoneNumber: phoneNumber, authNumber: authNumber)
}
.share()

// 번호인증 성공
output.authNumberValidation = phoneNumberAuthResult
.compactMap { $0.value }
.map { phoneNumber in
printIfDebug("\(phoneNumber) 인증성공")
stateTracker(phoneNumber)
return true
}
.asDriver(onErrorJustReturn: false)

// 번호인증 실패
phoneNumeberAuthFailure = phoneNumberAuthResult
.compactMap { $0.error?.message ?? nil }
.asObservable()
}

// 번호 인증 관련 Alert
let phoneAuthValidation = Observable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,9 @@ public class WorkerRegisterViewModel: ViewModelType {
AuthInOutStreamManager.validatePhoneNumberInOut(
input: input,
output: output,
useCase: inputValidationUseCase) { [weak self] authedPhoneNumber in
useCase: inputValidationUseCase,
authUseCase: authUseCase
) { [weak self] authedPhoneNumber in
// 🚀 상태추적 🚀
self?.stateObject.phoneNumber = authedPhoneNumber
}
Expand Down Expand Up @@ -204,6 +206,9 @@ extension WorkerRegisterViewModel {
// 회원가입 성공 여부
public var registerValidation: Driver<Void>?

// 요양보호사 로그인 성공 여부
public var loginValidation: Driver<Void>?

// Alert
public var alert: Driver<DefaultAlertContentVO>?
}
Expand Down

0 comments on commit efe6fd8

Please sign in to comment.