AuthorizationManager.swift 1.5 KB

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