Skip to content

[IDLE-90] 요양 보호사 회원가입 및 로그인 기능 연동 #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ extension WorkerAuthCoordinator: WorkerAuthCoordinatable {
let coordinator = WorkerRegisterCoordinator(
navigationController: navigationController,
viewModel: WorkerRegisterViewModel(
inputValidationUseCase: injector.resolve(AuthInputValidationUseCase.self)
inputValidationUseCase: injector.resolve(AuthInputValidationUseCase.self),
authUseCase: injector.resolve(AuthUseCase.self)
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class TestMainTabBarCoodinator: ChildCoordinator {

var parent: RootCoordinator?

weak var viewControllerRef: DisposableViewController?
weak var viewControllerRef: UIViewController?

init(navigationController: UINavigationController) {
self.navigationController = navigationController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,12 @@ public class DefaultAuthRepository: AuthRepository {
let networkService = AuthService()

public init() { }
}

// MARK: Center auth
public extension DefaultAuthRepository {

public func requestRegisterCenterAccount(
func requestRegisterCenterAccount(
managerName: String,
phoneNumber: String,
businessNumber: String,
Expand All @@ -39,22 +43,54 @@ public class DefaultAuthRepository: AuthRepository {
.map { _ in return () }
}

public func requestCenterLogin(id: String, password: String) -> Single<Void> {
func requestCenterLogin(id: String, password: String) -> Single<Void> {
return networkService.requestDecodable(api: .centerLogin(id: id, password: password), with: .plain)
.flatMap { [weak self] (token: TokenDTO) in

if let accessToken = token.accessToken, let refreshToken = token.refreshToken {

guard let self else { fatalError() }

if let _ = try? self.networkService.keyValueStore.saveAuthToken(
accessToken: accessToken,
refreshToken: refreshToken
) {
return .just(())
}
}
return .error(KeyValueStoreError.tokenSavingFailure)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
}
}

// MARK: Worker auth
public extension DefaultAuthRepository {

/// 요양보호사의 경우 회원가입시 곧바로 토큰을 발급받습니다.
func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single<Void> {
let dto = WorkerRegistrationDTO(
carerName: registerState.name,
birthYear: registerState.birthYear,
genderType: registerState.gender,
phoneNumber: registerState.phoneNumber,
roadNameAddress: registerState.addressInformation.roadAddress,
lotNumberAddress: registerState.addressInformation.jibunAddress,
longitude: registerState.latitude,
latitude: registerState.logitude
)

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

return networkService.requestDecodable(api: .registerWorkerAccount(data: data), with: .plain)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
}

func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single<Void> {
return networkService.requestDecodable(api: .workerLogin(phoneNumber: phoneNumber, verificationNumber: authNumber), with: .plain)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
}
}

// MARK: Token management
extension DefaultAuthRepository {

private func saveTokenToStore(token: TokenDTO) -> Single<Void>{

if let accessToken = token.accessToken, let refreshToken = token.refreshToken {

if let _ = try? networkService.keyValueStore.saveAuthToken(
accessToken: accessToken,
refreshToken: refreshToken
) {
return .just(())
}
}
return .error(KeyValueStoreError.tokenSavingFailure)
}
}
25 changes: 22 additions & 3 deletions project/Projects/Data/NetworkDataSource/API/AuthAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Alamofire

public enum AuthAPI {

// Core
// Common
case startPhoneNumberAuth(phoneNumber: String)
case checkAuthNumber(phoneNumber: String, authNumber: String)

Expand All @@ -21,6 +21,10 @@ public enum AuthAPI {
case registerCenterAccount(data: Data)
case centerLogin(id: String, password: String)
case reissueToken(refreshToken: String)

// Worker
case registerWorkerAccount(data: Data)
case workerLogin(phoneNumber: String, verificationNumber: String)
}

extension AuthAPI: BaseAPI {
Expand All @@ -44,15 +48,19 @@ extension AuthAPI: BaseAPI {
return .post
case .reissueToken:
return .post
case .registerWorkerAccount:
return .post
case .workerLogin:
return .post
}
}

public var path: String {
switch self {
case .startPhoneNumberAuth:
"core/send"
"common/send"
case .checkAuthNumber:
"core/confirm"
"common/confirm"
case .authenticateBusinessNumber(let businessNumber):
"center/authentication/\(businessNumber)"
case .checkIdDuplication(id: let id):
Expand All @@ -63,6 +71,10 @@ extension AuthAPI: BaseAPI {
"center/login"
case .reissueToken:
"center/refresh"
case .registerWorkerAccount:
"auth/carer/join"
case .workerLogin:
"auth/carer/login"
}
}

Expand All @@ -79,6 +91,9 @@ extension AuthAPI: BaseAPI {
params["password"] = password
case .reissueToken(let refreshToken):
params["refreshToken"] = refreshToken
case .workerLogin(let phoneNumber, let verificationNumber):
params["phoneNumber"] = phoneNumber
params["verificationNumber"] = verificationNumber
default:
break
}
Expand All @@ -104,6 +119,10 @@ extension AuthAPI: BaseAPI {
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .reissueToken:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .registerWorkerAccount(let data):
return .requestData(data)
case .workerLogin:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
default:
return .requestPlain
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// WorkerRegistrationDTO.swift
// NetworkDataSource
//
// Created by choijunios on 7/24/24.
//

import Foundation
import Entity

public struct WorkerRegistrationDTO: Encodable {
public let carerName: String
public let birthYear: Int
public let genderType: String
public let phoneNumber: String
public let roadNameAddress: String
public let lotNumberAddress: String
public let longitude: String
public let latitude: String

public init(carerName: String, birthYear: Int, genderType: Gender, phoneNumber: String, roadNameAddress: String, lotNumberAddress: String, longitude: String, latitude: String) {
self.carerName = carerName
self.birthYear = birthYear
self.genderType = Self.convertGenderValue(genderType)
self.phoneNumber = phoneNumber
self.roadNameAddress = roadNameAddress
self.lotNumberAddress = lotNumberAddress
self.longitude = longitude
self.latitude = latitude
}
}

public extension WorkerRegistrationDTO {

static func convertGenderValue(_ gender: Gender) -> String {

if gender == .notDetermined { fatalError() }
return gender == .male ? "MAN" : "WOMAN"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class DefaultAuthUseCase: AuthUseCase {
self.repository = repository
}

// MARK: 센터 회원가입 실행
/// 센터 회원가입 실행
public func registerCenterAccount(registerState: CenterRegisterState) -> Single<Result<Void, AuthError>> {
convert(
task: repository.requestRegisterCenterAccount(
Expand All @@ -31,10 +31,24 @@ public class DefaultAuthUseCase: AuthUseCase {
)) { [unowned self] error in toDomainError(error: error) }
}

// MARK: 센터 로그인 실행
/// 센터 로그인 실행
public func loginCenterAccount(id: String, password: String) -> Single<Result<Void, AuthError>> {
convert(task: repository.requestCenterLogin(id: id, password: password)) { [unowned self] error in
toDomainError(error: error)
}
}

/// 요양 보호사 회원가입 실행
public func registerWorkerAccount(registerState: WorkerRegisterState) -> Single<Result<Void, AuthError>> {
convert(
task: repository.requestRegisterWorkerAccount(registerState: registerState)) { [unowned self] error in toDomainError(error: error)
}
}

/// 요양 보호사 로그인 실행
public func loginWorkerAccount(phoneNumber: String, authNumber: String) -> Single<Result<Void, AuthError>> {
convert(
task: repository.requestWorkerLogin(phoneNumber: phoneNumber, authNumber: authNumber)) { [unowned self] error in toDomainError(error: error)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,23 @@ import Foundation
public class WorkerRegisterState {
public var name: String = ""
public var gender: Gender = .notDetermined
public var birthYear: Int = 0
public var phoneNumber: String = ""
public var addressInformation: AddressInformation = .init(roadAddress: "", jibunAddress: "")
public var detailAddress: String = ""
public var latitude: String = ""
public var logitude: String = ""

public init() { }

public func clear() {
name = ""
gender = .notDetermined
birthYear = 0
phoneNumber = ""
addressInformation.roadAddress = ""
addressInformation.jibunAddress = ""
detailAddress = ""
latitude = ""
logitude = ""
}
}

Expand Down
12 changes: 12 additions & 0 deletions project/Projects/Domain/Entity/VO/BusinessInfoVO.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,16 @@ public class BusinessInfoVO {
"센터 소개": "안녕하세요. 홍길동 센터입니다."
]
)

public static let onError: BusinessInfoVO = .init(
name: "오류가 발생했습니다.",
keyValue: [
"이름": "오류가 발생했습니다.",
"전화번호": "오류가 발생했습니다.",
"주소": "오류가 발생했습니다.",
"운영시간": "오류가 발생했습니다.",
"휴무일": "오류가 발생했습니다.",
"센터 소개": "오류가 발생했습니다.",
]
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ import RxSwift
import Entity

public protocol AuthRepository: RepositoryBase {


// MARK: Center
func requestRegisterCenterAccount(managerName: String, phoneNumber: String, businessNumber: String, id: String, password: String) -> Single<Void>
func requestCenterLogin(id: String, password: String) -> Single<Void>

// MARK: Worker
func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single<Void>
func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single<Void>
}
13 changes: 13 additions & 0 deletions project/Projects/Domain/UseCaseInterface/Auth/AuthUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,17 @@ public protocol AuthUseCase: UseCaseBase {
id: String,
password: String
) -> Single<Result<Void, AuthError>>


// #4
/// 요양 보호사 회원가입 실행
func registerWorkerAccount(
registerState: WorkerRegisterState
) -> Single<Result<Void, AuthError>>
// #5
/// 요양 보호사 로그인 실행
func loginWorkerAccount(
phoneNumber: String,
authNumber: String
) -> Single<Result<Void, AuthError>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class CenterAuthMainCoordinator: ChildCoordinator {

public var navigationController: UINavigationController

public weak var viewControllerRef: DisposableViewController?
public weak var viewControllerRef: UIViewController?

public var parent: CenterAuthCoordinatable?

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import PresentationCore

public class CenterLoginCoordinator: ChildCoordinator {

public weak var viewControllerRef: (any PresentationCore.DisposableViewController)?
public weak var viewControllerRef: UIViewController?

public var navigationController: UINavigationController

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ public class CenterRegisterCoordinator: ChildCoordinator {

public var parent: CenterAuthCoordinatable?

public weak var viewControllerRef: (any PresentationCore.DisposableViewController)?
public weak var viewControllerRef: UIViewController?

weak var pageViewController: UIPageViewController?

public var navigationController: UINavigationController

var stageViewControllers: [DisposableViewController] = []
var stageViewControllers: [UIViewController] = []

private var currentStage: CenterRegisterStage!

Expand Down Expand Up @@ -75,8 +75,6 @@ public class CenterRegisterCoordinator: ChildCoordinator {

public func coordinatorDidFinish() {

viewControllerRef?.cleanUp()

stageViewControllers = []

popViewController()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ enum SetNewPasswordStage: Int {

public class CenterSetNewPasswordCoordinator: ChildCoordinator {

public weak var viewControllerRef: (any PresentationCore.DisposableViewController)?
public weak var viewControllerRef: UIViewController?
public var navigationController: UINavigationController

var stageViewControllers: [DisposableViewController] = []
var stageViewControllers: [UIViewController] = []
weak var pageViewController: UIPageViewController?

public var parent: CenterAuthCoordinatable?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class SelectAuthTypeCoordinator: ChildCoordinator {

public var navigationController: UINavigationController

public weak var viewControllerRef: DisposableViewController?
public weak var viewControllerRef: UIViewController?

public var parent: AuthCoordinatable?

Expand Down
Loading
Loading