Skip to content

[IDLE-000] 요양보호사 로그아웃&회원탈퇴 #47

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 3 commits into from
Aug 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 @@ -52,6 +52,7 @@ class CenterSettingCoordinator: CenterSettingScreenCoordinatable {
dependency: .init(
userType: .center,
settingUseCase: injector.resolve(SettingScreenUseCase.self),
inputValidationUseCase: injector.resolve(AuthInputValidationUseCase.self),
navigationController: navigationController
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//
// WorkerSettingCoordinator.swift
// Idle-iOS
//
// Created by choijunios on 8/25/24.
//

import UIKit
import WorkerFeature
import RootFeature
import PresentationCore
import UseCaseInterface

class WorkerSettingCoordinaator: WorkerSettingScreenCoordinatable {

struct Dependency {
let parent: WorkerMainCoordinator
let injector: Injector
let navigationController: UINavigationController
}

var childCoordinators: [any PresentationCore.Coordinator] = []

weak var parent: WorkerMainCoordinator?

weak var viewControllerRef: UIViewController?

var navigationController: UINavigationController
let injector: Injector

init(dependency: Dependency) {
self.navigationController = dependency.navigationController
self.injector = dependency.injector
self.parent = dependency.parent
}

public func start() {
let coordinator = WorkerSettingScreenCoordinator(
dependency: .init(
navigationController: navigationController,
settingUseCase: injector.resolve(SettingScreenUseCase.self),
centerProfileUseCase: injector.resolve(CenterProfileUseCase.self)
)
)
addChildCoordinator(coordinator)
coordinator.parent = self
coordinator.start()
}

public func startRemoveWorkerAccountFlow() {
let coordinator = DeRegisterCoordinator(
dependency: .init(
userType: .worker,
settingUseCase: injector.resolve(SettingScreenUseCase.self),
inputValidationUseCase: injector.resolve(AuthInputValidationUseCase.self),
navigationController: navigationController
)
)
addChildCoordinator(coordinator)
coordinator.parent = self
coordinator.start()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,13 @@ class WorkerMainCoordinator: ParentCoordinator {
)
)
case .setting:
fatalError()
coordinator = WorkerSettingCoordinaator(
dependency: .init(
parent: self,
injector: injector,
navigationController: navigationController
)
)
}

addChildCoordinator(coordinator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class RootCoordinator {

navigationController.pushViewController(vc, animated: false)

centerMain()
workerMain()
}

func popViewController() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import NetworkDataSource
import Entity

public class DefaultAuthRepository: AuthRepository {

let networkService = AuthService()

public init() { }
Expand Down Expand Up @@ -94,6 +94,25 @@ public extension DefaultAuthRepository {
return networkService.requestDecodable(api: .workerLogin(phoneNumber: phoneNumber, verificationNumber: authNumber), with: .plain)
.flatMap { [unowned self] in saveTokenToStore(token: $0) }
}

func signoutWorkerAccount() -> RxSwift.Single<Void> {
networkService
.request(api: .signoutWorkerAccount, with: .withToken)
.map { _ in }
}

func deregisterWorkerAccount(reasons: [Entity.DeregisterReasonVO]) -> RxSwift.Single<Void> {
let reasonString = reasons.map { $0.reasonText }.joined(separator: "|")

return networkService
.request(
api: .deregisterWorkerAccount(
reason: reasonString
),
with: .withToken
)
.map { _ in }
}
}

// MARK: Token management
Expand Down
14 changes: 14 additions & 0 deletions project/Projects/Data/NetworkDataSource/API/AuthAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public enum AuthAPI {
// Worker
case registerWorkerAccount(data: Data)
case workerLogin(phoneNumber: String, verificationNumber: String)
case signoutWorkerAccount
case deregisterWorkerAccount(reason: String)
}

extension AuthAPI: BaseAPI {
Expand Down Expand Up @@ -58,6 +60,10 @@ extension AuthAPI: BaseAPI {
return .post
case .workerLogin:
return .post
case .signoutWorkerAccount:
return .post
case .deregisterWorkerAccount:
return .post
}
}

Expand Down Expand Up @@ -91,6 +97,10 @@ extension AuthAPI: BaseAPI {
"carer/join"
case .workerLogin:
"carer/login"
case .signoutWorkerAccount:
"carer/logout"
case .deregisterWorkerAccount:
"carer/withdraw"
}
}

Expand All @@ -113,6 +123,8 @@ extension AuthAPI: BaseAPI {
case .workerLogin(let phoneNumber, let verificationNumber):
params["phoneNumber"] = phoneNumber
params["verificationNumber"] = verificationNumber
case .deregisterWorkerAccount(let reason):
params["reason"] = reason
default:
break
}
Expand Down Expand Up @@ -148,6 +160,8 @@ extension AuthAPI: BaseAPI {
return .requestData(data)
case .workerLogin:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .deregisterWorkerAccount:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
default:
return .requestPlain
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,14 @@ public class DefaultSettingUseCase: SettingScreenUseCase {
task: repository.signoutCenterAccount()
)
}

// 요양보호사 회원탈퇴
public func deregisterWorkerAccount(reasons: [Entity.DeregisterReasonVO]) -> RxSwift.Single<Result<Void, Entity.DomainError>> {
convert(task: repository.deregisterWorkerAccount(reasons: reasons))
}

// 요양보호사 로그아웃
public func signoutWorkerAccount() -> RxSwift.Single<Result<Void, Entity.DomainError>> {
convert(task: repository.signoutWorkerAccount())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ public protocol AuthRepository: RepositoryBase {
// MARK: Worker
func requestRegisterWorkerAccount(registerState: WorkerRegisterState) -> Single<Void>
func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single<Void>
func signoutWorkerAccount() -> Single<Void>
func deregisterWorkerAccount(reasons: [DeregisterReasonVO]) -> Single<Void>
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ public protocol SettingScreenUseCase: UseCaseBase {
/// 어플리케이션 이용약관을 가져옵니다.
func getApplicationPolicyUrl() -> URL

/// 요양보호사 회원 탈퇴
func deregisterWorkerAccount(
reasons: [DeregisterReasonVO]
) -> Single<Result<Void, DomainError>>

/// 요양보호사 로그아웃
func signoutWorkerAccount() -> Single<Result<Void, DomainError>>

/// 센터 회원 탈퇴
func deregisterCenterAccount(
reasons: [DeregisterReasonVO],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class IdleNavigationBar: UIView {

public init(
titleText: String = "",
innerViews: [UIView]
innerViews: [UIView] = []
) {
super.init(frame: .zero)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,12 @@ where
return textField
}()

private let authSuccessText: ResizableUILabel = {

let label = ResizableUILabel()
label.font = DSKitFontFamily.Pretendard.medium.font(size: 12)
label.text = "인증이 완료되었습니다."
private let authSuccessText: IdleLabel = {
let label = IdleLabel(typography: .caption)
label.textString = "* 인증이 완료되었습니다."
label.textAlignment = .left
label.textColor = DSKitAsset.Colors.gray300.color
label.attrTextColor = DSKitAsset.Colors.gray300.color
label.isHidden = true

return label
}()

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

enum AuthInOutStreamManager { }
public enum AuthInOutStreamManager { }

extension AuthInOutStreamManager {

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

extension AuthInOutStreamManager {
public extension AuthInOutStreamManager {

static func validatePhoneNumberInOut(
input: AuthPhoneNumberInputable & AnyObject,
Expand All @@ -28,7 +28,7 @@ extension AuthInOutStreamManager {
output.canSubmitPhoneNumber = input
.editingPhoneNumber
.map({ [unowned useCase] phoneNumber in
printIfDebug("[CenterRegisterViewModel] 전달받은 전화번호: \(phoneNumber)")
printIfDebug("전달받은 전화번호: \(phoneNumber)")
return useCase.checkPhoneNumberIsValid(phoneNumber: phoneNumber)
})
.asDriver(onErrorJustReturn: false)
Expand All @@ -37,15 +37,15 @@ extension AuthInOutStreamManager {
.editingAuthNumber
.compactMap({ $0 })
.map { authNumber in
printIfDebug("[CenterRegisterViewModel] 전달받은 인증번호: \(authNumber)")
printIfDebug("전달받은 인증번호: \(authNumber)")

return authNumber.count == 6
}
.asDriver(onErrorJustReturn: false)

let phoneNumberAuthRequestResult = input
.requestAuthForPhoneNumber
.flatMap { [unowned useCase, input] _ in
.flatMap { [useCase, input] _ in

let formatted = Self.formatPhoneNumber(phoneNumber: input.editingPhoneNumber.value)
#if DEBUG
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
let vc = CenterSettingVC()
let vm = CenterSettingVM(
coordinator: nil,
settingUseCase: DefaultSettingUseCase(),
settingUseCase: DefaultSettingUseCase(repository: DefaultAuthRepository()),
centerProfileUseCase: DefaultCenterProfileUseCase(
repository: DefaultUserProfileRepository()
)

)

vc.bind(viewModel: vm)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,11 @@ public class PasswordForDeregisterCoordinator: ChildCoordinator {
}

public func popToRoot() {

/// Root까지 네비게이션을 제거합니다.
parent?.popToRoot()
}

public func cancelDeregister() {
parent?.cancelDeregister()
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,13 @@ public class PasswordForDeregisterVC: BaseViewController {
.withLatestFrom(passwordField.eventPublisher)
.bind(to: viewModel.deregisterButtonClicked)
.disposed(by: disposeBag)

cancelButton.rx.tap
.bind(to: viewModel.cancelButtonClicked)
.disposed(by: disposeBag)

navigationBar
.backButton.rx.tap
.bind(to: viewModel.exitButtonClicked)
navigationBar.backButton.rx.tap
.bind(to: viewModel.backButtonClicked)
.disposed(by: disposeBag)

// Output
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public class PasswordForDeregisterVM: DefaultAlertOutputable {
public weak var coordinator: PasswordForDeregisterCoordinator?

public let deregisterButtonClicked: PublishRelay<String> = .init()
public let exitButtonClicked: PublishRelay<Void> = .init()
public let backButtonClicked: PublishRelay<Void> = .init()
public let cancelButtonClicked: PublishRelay<Void> = .init()
public var alert: RxCocoa.Driver<Entity.DefaultAlertContentVO>?

let settingUseCase: SettingScreenUseCase
Expand All @@ -33,10 +34,7 @@ public class PasswordForDeregisterVM: DefaultAlertOutputable {

let deregisterResult = deregisterButtonClicked
.flatMap { [settingUseCase] password in
settingUseCase.deregisterCenterAccount(
reasons: deregisterReasons,
password: password
)
settingUseCase.deregisterWorkerAccount(reasons: deregisterReasons)
}
.share()

Expand All @@ -54,13 +52,20 @@ public class PasswordForDeregisterVM: DefaultAlertOutputable {
})
.disposed(by: disposeBag)

exitButtonClicked
backButtonClicked
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] _ in
self?.coordinator?.coordinatorDidFinish()
})
.disposed(by: disposeBag)

cancelButtonClicked
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] _ in
self?.coordinator?.cancelDeregister()
})
.disposed(by: disposeBag)

alert = deregisterFailure
.map { error in
DefaultAlertContentVO(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
let nav = UINavigationController()
nav.setNavigationBarHidden(true, animated: false)

self.coordinator = DeRegisterCoordinator(
dependency: .init(
userType: .center,
authUseCase: DefaultAuthUseCase(
repository: DefaultAuthRepository()
),
navigationController: nav
)
)

window = UIWindow(windowScene: windowScene)
window?.rootViewController = nav
window?.makeKeyAndVisible()
Expand Down
Loading
Loading