AuthorizationManager.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import AuthenticationServices
  2. import Combine
  3. import Swinject
  4. protocol AuthorizationManager {
  5. var isAuthorized: Bool { get }
  6. var authorizationPublisher: AnyPublisher<Bool, Never> { get }
  7. func authorize(credentials: Credentials) -> AnyPublisher<Void, Never>
  8. func logout()
  9. }
  10. final class BaseAuthorizationManager: AuthorizationManager, Injectable {
  11. private let isAuthorizedSubject = CurrentValueSubject<Bool, Never>(false)
  12. var authorizationPublisher: AnyPublisher<Bool, Never> { isAuthorizedSubject.eraseToAnyPublisher() }
  13. var isAuthorized: Bool { isAuthorizedSubject.value }
  14. let credentials = CurrentValueSubject<Credentials?, Never>(nil)
  15. private var lifetime = Set<AnyCancellable>()
  16. @Injected() private var keychain: Keychain!
  17. init(resolver: Resolver) {
  18. injectServices(resolver)
  19. }
  20. func authorize(credentials: Credentials) -> AnyPublisher<Void, Never> {
  21. isAuthorizedSubject.send(true)
  22. self.credentials.send(credentials)
  23. return Just(()).eraseToAnyPublisher()
  24. }
  25. func logout() {
  26. keychain.removeObject(forKey: Login.Config.credentialsKey).publisher
  27. .sink(
  28. receiveCompletion: { _ in
  29. self.isAuthorizedSubject.send(false)
  30. self.credentials.send(nil)
  31. },
  32. receiveValue: {}
  33. )
  34. .store(in: &lifetime)
  35. }
  36. }