AuthorizationManager.swift 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. private var lifetime = Set<AnyCancellable>()
  15. @Injected() private var keychain: Keychain!
  16. init(resolver: Resolver) {
  17. injectServices(resolver)
  18. }
  19. func authorize(credentials _: Credentials) -> AnyPublisher<Void, Never> {
  20. isAuthorizedSubject.send(true)
  21. return Just(()).eraseToAnyPublisher()
  22. }
  23. func logout() {
  24. keychain.removeObject(forKey: Login.Config.credentialsKey).publisher
  25. .sink(
  26. receiveCompletion: { _ in
  27. self.isAuthorizedSubject.send(false)
  28. },
  29. receiveValue: {}
  30. )
  31. .store(in: &lifetime)
  32. }
  33. }