Skip to content

Commit

Permalink
[IDLE-73] 센터장 회원가입 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
J0onYEong committed Jul 9, 2024
1 parent c433a9a commit 6d556d9
Show file tree
Hide file tree
Showing 12 changed files with 173 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,5 +88,32 @@ public class DefaultCenterRegisterRepository: CenterRegisterRepository {
}
}
}

public func requestRegisterCenterAccount(managerName: String, phoneNumber: String, businessNumber: String, id: String, password: String) -> RxSwift.Single<Entity.BoolResult> {

let dto = CenterRegistrationDTO(
identifier: id,
password: password,
phoneNumber: phoneNumber,
managerName: managerName,
centerBusinessRegistrationNumber: businessNumber
)

let data = (try? JSONEncoder().encode(dto)) ?? Data()

return networkService.request(api: .registerCenterAccount(data: data))
.catch { [weak self] in .error(self?.filterNetworkConnection($0) ?? $0) }
.map { [weak self] response in

guard let self = self else { return BoolResult.failure(.unknownError) }

switch response.statusCode {
case 201:
return .success(true)
default:
return .failure(self.decodeError(of: CenterRegisterError.self, data: response.data))
}
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// CenterRegistrationDTO.swift
// ConcreteRepository
//
// Created by choijunios on 7/9/24.
//

import Foundation

struct CenterRegistrationDTO: Encodable {
let identifier: String
let password: String
let phoneNumber: String
let managerName: String
let centerBusinessRegistrationNumber: String
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public enum AuthAPI {
// Center
case authenticateBusinessNumber(businessNumber: String)
case checkIdDuplication(id: String)
case registerCenterAccount(data: Data)
}

extension AuthAPI: BaseAPI {
Expand All @@ -35,6 +36,8 @@ extension AuthAPI: BaseAPI {
return .get
case .checkIdDuplication:
return .get
case .registerCenterAccount:
return .post
}
}

Expand All @@ -48,6 +51,8 @@ extension AuthAPI: BaseAPI {
"center/authentication/\(businessNumber)"
case .checkIdDuplication(id: let id):
"center/validation/\(id)"
case .registerCenterAccount:
"center/join"
}
}

Expand Down Expand Up @@ -78,6 +83,8 @@ extension AuthAPI: BaseAPI {
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .checkAuthNumber:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .registerCenterAccount(let data):
return .requestData(data)
default:
return .requestPlain
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import UseCaseInterface
import RepositoryInterface

public class DefaultCenterRegisterUseCase: CenterRegisterUseCase {

let repository: CenterRegisterRepository

public init(repository: CenterRegisterRepository) {
Expand Down Expand Up @@ -73,4 +73,18 @@ public class DefaultCenterRegisterUseCase: CenterRegisterUseCase {

return predicate.evaluate(with: password)
}

// MARK: 로그인 실행
public func registerCenterAccount(registerState: CenterRegisterState) -> Observable<BoolResult> {

filteringDataLayer(
domainTask: repository.requestRegisterCenterAccount(
managerName: registerState.name!,
phoneNumber: registerState.phoneNumber!,
businessNumber: registerState.businessNumber!,
id: registerState.id!,
password: registerState.password!
).asObservable()
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// CenterRegisterState.swift
// Entity
//
// Created by choijunios on 7/9/24.
//

import Foundation

public class CenterRegisterState {
public var name: String?
public var phoneNumber: String?
public var businessNumber: String?
public var id: String?
public var password: String?

public init(
name: String? = nil,
phoneNumber: String? = nil,
businessNumber: String? = nil,
id: String? = nil,
password: String? = nil
) {
self.name = name
self.phoneNumber = phoneNumber
self.businessNumber = businessNumber
self.id = id
self.password = password
}

public func clear() {
name = nil
phoneNumber = nil
businessNumber = nil
id = nil
password = nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ public protocol CenterRegisterRepository: RepositoryBase {
func requestBusinessNumberAuthentication(businessNumber: String) -> Single<BusinessNumberAuthResult>

func requestCheckingIdDuplication(id: String) -> Single<BoolResult>
func requestRegisterCenterAccount(managerName: String, phoneNumber: String, businessNumber: String, id: String, password: String) -> Single<BoolResult>
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,14 @@ public protocol CenterRegisterUseCase: UseCaseBase {
/// - returns:
/// - Bool, true: 가능, flase: 불가능
func checkPasswordIsValid(password: String) -> Bool

// #9.
/// 센터 로그인 실행
/// - parameters:
/// - registerState: CenterRegisterState
/// - returns:
/// - Bool, true: 성공, flase: 실패
func registerCenterAccount(
registerState: CenterRegisterState
) -> Observable<BoolResult>
}
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,6 @@ where T.Input: AuthBusinessOwnerInputable & CTAButtonEnableInputable, T.Output:
// 인증, 확인 버튼이 눌린 경우
input.requestBusinessNumberValidation = businessNumberField.eventPublisher.asObservable()

// 화면전환 버튼이 눌렸음을 전송
input.ctaButtonClicked = ctaButton.eventPublisher.asObservable()

// MARK: Output
let output = viewModel.transform(input: input)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ where T.Input: SetIdPasswordInputable & CTAButtonEnableInputable, T.Output: SetI
input.editingId = idField.textField.eventPublisher.asObservable()
input.editingPassword = passwordField.eventPublisher.asObservable()
input.editingCheckPassword = checkPasswordField.eventPublisher.asObservable()
input.ctaButtonClicked = ctaButton.eventPublisher.map({ _ in CTAButtonAction.complete }).asObservable()

// id 중복확인 요청 버튼
input.requestIdDuplicationValidation = idField.eventPublisher
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,9 +215,6 @@ where
input.requestAuthForPhoneNumber = phoneNumberField.eventPublisher.asObservable()
input.requestValidationForAuthNumber = authNumberField.eventPublisher.asObservable()

// 화면전환 버튼이 눌렸음을 전송
input.ctaButtonClicked = ctaButton.eventPublisher.asObservable()

// MARK: Output
let output = viewModel.transform(input: input)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public class CenterRegisterViewModel: ViewModelType {
public let input = Input()
public let output = Output()

private let stateObject = CenterRegisterState()

public init(useCase: CenterRegisterUseCase) {
self.useCase = useCase
}
Expand All @@ -31,13 +33,18 @@ public class CenterRegisterViewModel: ViewModelType {
// MARK: 성함 입력
input
.editingName?
.subscribe(onNext: { name in
.subscribe(onNext: { [weak self] name in

printIfDebug("[CenterRegisterViewModel] 전달받은 성함: \(name)")

// TODO: 성함이 유효하다면
self.output.nameValidation?.onNext((!name.isEmpty, name))
let isValid = !name.isEmpty
self?.output.nameValidation?.onNext((isValid, name))

if isValid {
// 🚀 상태추적 🚀
self?.stateObject.name = name
}
})
.disposed(by: disposeBag)

Expand Down Expand Up @@ -112,7 +119,7 @@ public class CenterRegisterViewModel: ViewModelType {
case .failure(let error):
printIfDebug("\(formattedString)번호로 인증을 시작할 수 없습니다. \n 에러내용: \(error.message)")

// TODO: 에러처리 요망
// TODO: 에러처리

self?.output.phoneNumberValidation?.onNext((false, formattedString))
return
Expand All @@ -137,6 +144,9 @@ public class CenterRegisterViewModel: ViewModelType {
// 디버그시 인증번호 무조건 통과
print("✅ 디버그모드에서 인증번호 무조건 통과")
self.output.authNumberValidation?.onNext((true, authNumber))

// ☑️ 상태추적 ☑️
self.stateObject.phoneNumber = phoneNumber
return
#endif

Expand All @@ -147,6 +157,8 @@ public class CenterRegisterViewModel: ViewModelType {
case .success(_):
printIfDebug("\(phoneNumber)번호 인증성공")
self?.output.authNumberValidation?.onNext((true, authNumber))
// 🚀 상태추적 🚀
self?.stateObject.phoneNumber = phoneNumber
case .failure(let error):
printIfDebug("\(phoneNumber)번호 인증실패 \n 에러내용: \(error.message)")

Expand Down Expand Up @@ -204,6 +216,8 @@ public class CenterRegisterViewModel: ViewModelType {
printIfDebug("\(formattedString)번호 검색 성공")

self?.output.businessNumberValidation?.onNext(vo)
// 🚀 상태추적 🚀
self?.stateObject.businessNumber = businessNumber
case .failure(let error):

printIfDebug("\(formattedString)번호 검색실패 \n 에러내용: \(error.message)")
Expand Down Expand Up @@ -243,6 +257,8 @@ public class CenterRegisterViewModel: ViewModelType {
#if DEBUG
// 디버그시 아이디 중복체크 미실시
print("✅ 디버그모드에서 아이디 중복검사 미실시")
// ☑️ 상태추적 ☑️
self?.stateObject.id = id
self?.output.idValidation?.onNext((true, id))
return
#endif
Expand All @@ -256,8 +272,12 @@ public class CenterRegisterViewModel: ViewModelType {
switch result {
case .success(let isValid):
printIfDebug("[CenterRegisterViewModel] \(id) 중복체크 결과: \(isValid ? "✅ 성공" : "❌ 실패")")
self?.output
.idValidation?.onNext((isValid, id))
self?.output.idValidation?.onNext((isValid, id))

if isValid {
// 🚀 상태추적 🚀
self?.stateObject.id = id
}
case .failure(let error):
printIfDebug("\(id) 아이디중복검사 실패 \n 에러내용: \(error.message)")
}
Expand Down Expand Up @@ -288,11 +308,37 @@ public class CenterRegisterViewModel: ViewModelType {
} else {

self.output.passwordValidation?.onNext((.match, pwd))
// 🚀 상태추적 🚀
self.stateObject.password = pwd
}

})
.disposed(by: disposeBag)

let onComplete = input.ctaButtonClicked?.compactMap({ $0 == .complete ? true : nil })

// MARK: 최종 로그인 버튼
onComplete?
.subscribe { [weak self] _ in

guard let self else { return }

self.useCase
.registerCenterAccount(registerState: self.stateObject)
.subscribe(onNext: { [weak self] result in

guard let self else { return }

switch result {
case .success(_):
printIfDebug("[CenterRegisterViewModel] ✅ 획원가입 성공 \n 가임정보 \(self.stateObject)")
case .failure(let error):
printIfDebug("❌ 회원가입 실패: \(error.message)")
}
})
.disposed(by: self.disposeBag)
}
.disposed(by: disposeBag)
return output
}
}
Expand All @@ -303,7 +349,7 @@ extension CenterRegisterViewModel {
public struct Input {

// CTA 버튼 클릭시
public var ctaButtonClicked: Observable<UITapGestureRecognizer>?
public var ctaButtonClicked: Observable<CTAButtonAction>?

// 이름입력
public var editingName: Observable<String>?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@
import UIKit
import RxSwift

public enum CTAButtonAction {
case next
case complete
}

public protocol CTAButtonEnableInputable {
var ctaButtonClicked: Observable<UITapGestureRecognizer>? { get set }
var ctaButtonClicked: Observable<CTAButtonAction>? { get set }
}

public protocol CTAButtonEnableOutPutable {
Expand Down

0 comments on commit 6d556d9

Please sign in to comment.