AuthorizationManager.swift 1.5 KB

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